Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Sign in / Register
Toggle navigation
P
PhoneManager
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Yang
PhoneManager
Commits
639dbf43
Commit
639dbf43
authored
Apr 08, 2025
by
CZ1004
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
删除多余文件
parent
8f146b22
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
0 additions
and
151 deletions
+0
-151
HomeViewModel.swift
...eManager/Class/Session/Home/ViewModel/HomeViewModel.swift
+0
-151
No files found.
PhoneManager/Class/Session/Home/ViewModel/HomeViewModel.swift
deleted
100644 → 0
View file @
8f146b22
//
// HomeViewModel.swift
// PhoneManager
//
// Created by edy on 2025/4/7.
//
import
Foundation
import
Photos
class
HomeViewModel
{
// 所有图片,包括相片和截图
var
allImages
:
[
PHAsset
]
=
[]
// 只包含相片
var
images
:
[
PHAsset
]
=
[]
// 只包含视频
var
videos
:
[
PHAsset
]
=
[]
// 只包含截屏
var
screenshots
:
[
PHAsset
]
=
[]
/// 获取图片资源
/// - Parameter completion: 回调
func
fetchMediaFromAlbum
(
completion
:
@escaping
()
->
Void
){
let
options
=
PHFetchOptions
()
options
.
sortDescriptors
=
[
NSSortDescriptor
(
key
:
"creationDate"
,
ascending
:
true
)]
let
allAssets
=
PHAsset
.
fetchAssets
(
with
:
options
)
allAssets
.
enumerateObjects
{
(
asset
,
_
,
_
)
in
let
mediaSubType
=
asset
.
mediaSubtypes
let
mediaType
=
asset
.
mediaType
if
mediaType
==
.
image
{
if
mediaSubType
==
.
photoScreenshot
{
self
.
screenshots
.
append
(
asset
)
}
else
{
self
.
images
.
append
(
asset
)
}
self
.
allImages
.
append
(
asset
)
}
else
if
mediaType
==
.
video
{
self
.
videos
.
append
(
asset
)
}
}
completion
()
}
/// 计算文件大小
/// - Parameters:
/// - assets: 当前资源
/// - completion: 回调
func
calculateTotalSizeOfAssets
(
completion
:
@escaping
(
Int64
)
->
Void
)
{
var
totalSize
:
Int64
=
0
let
group
=
DispatchGroup
()
var
allAssets
:
[
PHAsset
]
=
[]
allAssets
=
allAssets
+
self
.
allImages
+
self
.
videos
for
asset
in
allAssets
{
group
.
enter
()
let
resources
=
PHAssetResource
.
assetResources
(
for
:
asset
)
for
resource
in
resources
{
PHAssetResourceManager
.
default
()
.
requestData
(
for
:
resource
,
options
:
nil
)
{
(
data
)
in
totalSize
+=
Int64
(
data
.
count
)
}
completionHandler
:
{
(
error
)
in
Print
(
"获取文件大小出错了"
)
}
group
.
leave
()
}
}
group
.
notify
(
queue
:
.
main
)
{
DispatchQueue
.
main
.
async
{
completion
(
totalSize
)
}
}
}
/// 计算文件数量
/// - Returns: 数量
func
calculateTotalCount
()
->
Int
{
// 图片加文字
return
self
.
allImages
.
count
+
self
.
videos
.
count
}
// 计算
func
calGroupSimilarAssets
(
from
assets
:
[
PHAsset
])
->
[[
PHAsset
]]
{
var
assetFeatures
:
[(
PHAsset
,
cv
::
Mat
)]
=
[]
var
similarGroups
:
[[
PHAsset
]]
=
[]
// 遍历所有资产,提取特征
for
i
in
0
..<
assets
.
count
{
let
asset
=
assets
.
object
(
at
:
i
)
let
manager
=
PHImageManager
.
default
()
let
targetSize
=
CGSize
(
width
:
200
,
height
:
200
)
manager
.
requestImage
(
for
:
asset
,
targetSize
:
targetSize
,
contentMode
:
.
aspectFit
,
options
:
nil
)
{
(
image
,
_
)
in
if
let
image
=
image
{
let
cvImage
=
CIImage
(
cgImage
:
image
.
cgImage
!
)
let
mat
=
cv
::
Mat
(
cvImage
)
let
grayMat
=
mat
.
cvtColor
(
cv
::
COLOR_BGR2GRAY
)
let
descriptor
=
cv
::
ORB
.
create
()
var
keypoints
=
[
cv
::
KeyPoint
]()
var
descriptors
=
cv
::
Mat
()
descriptor
.
detectAndCompute
(
grayMat
,
cv
::
Mat
(),
&
keypoints
,
&
descriptors
)
assetFeatures
.
append
((
asset
,
descriptors
))
if
assetFeatures
.
count
==
assets
.
count
{
// 所有资产的特征都已提取完成,开始比较
var
visited
=
Set
<
Int
>
()
for
j
in
0
..<
assetFeatures
.
count
{
if
visited
.
contains
(
j
)
{
continue
}
var
group
:
[
PHAsset
]
=
[
assetFeatures
[
j
]
.
0
]
visited
.
insert
(
j
)
for
k
in
(
j
+
1
)
..<
assetFeatures
.
count
{
if
visited
.
contains
(
k
)
{
continue
}
let
matcher
=
cv
::
BFMatcher
(
cv
::
NORM_HAMMING
,
crossCheck
:
true
)
var
matches
=
[
cv
::
DMatch
]()
matcher
.
match
(
assetFeatures
[
j
]
.
1
,
assetFeatures
[
k
]
.
1
,
&
matches
)
if
matches
.
count
>
10
{
// 可以根据实际情况调整匹配数量的阈值
group
.
append
(
assetFeatures
[
k
]
.
0
)
visited
.
insert
(
k
)
}
}
if
group
.
count
>
1
{
similarGroups
.
append
(
group
)
}
}
completion
(
similarGroups
)
}
}
}
}
}
// 分别计算图片相似度
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment