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
d8b0a276
Commit
d8b0a276
authored
May 23, 2025
by
CZ1004
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
【优化】压缩图片方法+视频静音
parent
ab343dc0
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
103 additions
and
43 deletions
+103
-43
CompressViewModel.swift
...ger/Class/Page/Compress/ViewModel/CompressViewModel.swift
+89
-19
VideoViewController.swift
...eManager/Class/Page/Home/Common/VideoViewController.swift
+12
-17
PhotosRemoveBaseView.swift
PhoneManager/Class/Page/Home/View/PhotosRemoveBaseView.swift
+2
-7
No files found.
PhoneManager/Class/Page/Compress/ViewModel/CompressViewModel.swift
View file @
d8b0a276
...
...
@@ -156,31 +156,101 @@ class CompressViewModel{
}
}
private
func
compressData
(
_
data
:
Data
,
compressionQuality
:
CGFloat
,
progress
:
@escaping
(
Float
)
->
Void
,
completion
:
@escaping
(
Data
?,
Error
?)
->
Void
)
{
guard
let
originalImage
=
UIImage
(
data
:
data
)
else
{
completion
(
nil
,
nil
)
return
}
DispatchQueue
.
global
()
.
async
{
var
progressValue
:
Float
=
0
let
step
=
0.1
while
progressValue
<
1
{
progress
(
progressValue
)
progressValue
+=
Float
(
step
)
Thread
.
sleep
(
forTimeInterval
:
0.1
)
private
func
compressData
(
_
data
:
Data
,
compressionQuality
:
CGFloat
,
progress
:
@escaping
(
Float
)
->
Void
,
completion
:
@escaping
(
Data
?,
Error
?)
->
Void
)
{
DispatchQueue
.
global
(
qos
:
.
userInitiated
)
.
async
{
// 错误处理闭包
func
completeOnMain
(
error
:
Error
?
=
nil
,
data
:
Data
?
=
nil
)
{
DispatchQueue
.
main
.
async
{
completion
(
data
,
error
)
}
}
if
let
compressedData
=
originalImage
.
jpegData
(
compressionQuality
:
compressionQuality
)
{
DispatchQueue
.
main
.
async
{
progress
(
1.0
)
completion
(
compressedData
,
nil
)
// 验证输入数据
guard
let
image
=
UIImage
(
data
:
data
)
else
{
completeOnMain
(
error
:
NSError
(
domain
:
"ImageError"
,
code
:
-
1
,
userInfo
:
[
NSLocalizedDescriptionKey
:
"Invalid image data"
]))
return
}
let
originalSize
=
data
.
count
let
targetSize
=
max
(
Int
(
CGFloat
(
originalSize
)
*
compressionQuality
),
1024
)
var
currentImage
=
image
var
currentBestData
:
Data
?
// 进度配置
let
maxIterations
=
5
let
qualitySteps
:
[
CGFloat
]
=
[
0.9
,
0.7
,
0.5
,
0.3
,
0.2
]
var
currentIteration
=
0
// 递归压缩方法
func
tryCompress
()
{
guard
currentIteration
<
maxIterations
else
{
// 最终返回最佳结果或最后一次尝试
completeOnMain
(
data
:
currentBestData
??
currentImage
.
jpegData
(
compressionQuality
:
0.1
))
return
}
}
else
{
// 当前轮次的压缩质量
let
currentQuality
=
qualitySteps
[
currentIteration
]
var
compressedData
:
Data
?
// 尝试生成压缩数据
autoreleasepool
{
compressedData
=
currentImage
.
jpegData
(
compressionQuality
:
currentQuality
)
}
guard
let
validData
=
compressedData
else
{
completeOnMain
(
error
:
NSError
(
domain
:
"CompressionError"
,
code
:
-
2
,
userInfo
:
[
NSLocalizedDescriptionKey
:
"Compression failed"
]))
return
}
// 更新最佳结果
if
validData
.
count
<=
targetSize
&&
validData
.
count
>
(
currentBestData
?
.
count
??
0
)
{
currentBestData
=
validData
}
// 更新进度(每轮20%)
DispatchQueue
.
main
.
async
{
completion
(
nil
,
nil
)
progress
(
Float
(
currentIteration
+
1
)
/
Float
(
maxIterations
)
)
}
// 检查是否达标
if
validData
.
count
<=
targetSize
{
completeOnMain
(
data
:
validData
)
return
}
// 未达标时调整尺寸
let
scaleFactor
=
sqrt
(
Double
(
targetSize
)
/
Double
(
validData
.
count
))
currentImage
=
self
.
resizeImage
(
currentImage
,
scaleFactor
:
CGFloat
(
scaleFactor
))
currentIteration
+=
1
// 继续下一轮压缩
tryCompress
()
}
// 开始压缩流程
tryCompress
()
}
}
// 图片尺寸调整方法保持不变
private
func
resizeImage
(
_
image
:
UIImage
,
scaleFactor
:
CGFloat
)
->
UIImage
{
let
newSize
=
CGSize
(
width
:
max
(
image
.
size
.
width
*
scaleFactor
,
1
),
height
:
max
(
image
.
size
.
height
*
scaleFactor
,
1
)
)
let
format
=
UIGraphicsImageRendererFormat
()
format
.
scale
=
1.0
format
.
opaque
=
true
let
renderer
=
UIGraphicsImageRenderer
(
size
:
newSize
,
format
:
format
)
return
renderer
.
image
{
_
in
image
.
draw
(
in
:
CGRect
(
origin
:
.
zero
,
size
:
newSize
))
}
}
...
...
PhoneManager/Class/Page/Home/Common/VideoViewController.swift
View file @
d8b0a276
...
...
@@ -30,23 +30,18 @@ class VideoViewController: UIViewController {
if
let
url
=
self
.
url
{
self
.
player
=
AVPlayer
(
url
:
url
)
self
.
player
?
.
isMuted
=
true
self
.
player
?
.
volume
=
0
DispatchQueue
.
main
.
asyncAfter
(
deadline
:
.
now
()
+
0.1
)
{
// 2. 配置播放器控制器
self
.
playerViewController
.
player
=
self
.
player
self
.
playerViewController
.
delegate
=
self
self
.
playerViewController
.
showsPlaybackControls
=
true
self
.
playerViewController
.
player
?
.
isMuted
=
true
// 3. 添加到当前视图
self
.
addChild
(
self
.
playerViewController
)
self
.
view
.
addSubview
(
self
.
playerViewController
.
view
)
self
.
playerViewController
.
view
.
frame
=
self
.
view
.
bounds
self
.
playerViewController
.
didMove
(
toParent
:
self
)
// 4. 自动播放
if
self
.
isAutoPlay
{
self
.
player
?
.
play
()
self
.
player
?
.
isMuted
=
true
}
// 2. 配置播放器控制器
self
.
playerViewController
.
player
=
self
.
player
self
.
playerViewController
.
delegate
=
self
self
.
playerViewController
.
showsPlaybackControls
=
true
// 3. 添加到当前视图
self
.
addChild
(
self
.
playerViewController
)
self
.
view
.
addSubview
(
self
.
playerViewController
.
view
)
self
.
playerViewController
.
view
.
frame
=
self
.
view
.
bounds
self
.
playerViewController
.
didMove
(
toParent
:
self
)
// 4. 自动播放
if
self
.
isAutoPlay
{
self
.
player
?
.
play
()
}
}
}
...
...
PhoneManager/Class/Page/Home/View/PhotosRemoveBaseView.swift
View file @
d8b0a276
...
...
@@ -26,18 +26,13 @@ class PhotosRemoveBaseView: UIView {
vc
.
isAutoPlay
=
index
==
0
vc
.
url
=
url
self
.
imageView
.
removeFromSuperview
()
self
.
responderViewController
()?
.
addChild
(
vc
)
self
.
addSubview
(
vc
.
view
)
vc
.
view
.
snp
.
makeConstraints
{
make
in
make
.
left
.
top
.
bottom
.
right
.
equalToSuperview
()
}
vc
.
setupPlayer
()
DispatchQueue
.
main
.
asyncAfter
(
deadline
:
.
now
()
+
0.1
)
{
vc
.
playerViewController
.
player
?
.
isMuted
=
true
vc
.
playerViewController
.
player
?
.
volume
=
0
vc
.
player
?
.
isMuted
=
true
vc
.
player
?
.
volume
=
0
}
vc
.
didMove
(
toParent
:
self
.
responderViewController
())
}
}
else
{
self
.
innerVideoController
?
.
playerViewController
.
player
?
.
play
()
...
...
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