Commit d8b0a276 authored by CZ1004's avatar CZ1004

【优化】压缩图片方法+视频静音

parent ab343dc0
......@@ -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))
}
}
......
......@@ -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()
}
}
}
......
......@@ -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()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment