Мене тут не влаштовували рішення, які генерують зображення на основі заданого розміру КБ, оскільки більшість із них використовуються .jpegData(compressionQuality: x)
. Цей метод не працюватиме з великими зображеннями, оскільки навіть при якості стиснення, встановленому на 0,0, велике зображення залишатиметься великим, наприклад, 10 МБ, вироблені в портретному режимі новішого iPhone, все ще будуть вище 1 МБ, а для якості якості стиснення встановлено значення 0,0.
Тому я використав відповідь @Leo Dabus і переписав її у Helper Struct, яка перетворює зображення у фоновій que:
import UIKit
struct ImageResizer {
static func resize(image: UIImage, maxByte: Int, completion: @escaping (UIImage?) -> ()) {
DispatchQueue.global(qos: .userInitiated).async {
guard let currentImageSize = image.jpegData(compressionQuality: 1.0)?.count else { return completion(nil) }
var imageSize = currentImageSize
var percentage: CGFloat = 1.0
var generatedImage: UIImage? = image
let percantageDecrease: CGFloat = imageSize < 10000000 ? 0.1 : 0.3
while imageSize > maxByte && percentage > 0.01 {
let canvas = CGSize(width: image.size.width * percentage,
height: image.size.height * percentage)
let format = image.imageRendererFormat
format.opaque = true
generatedImage = UIGraphicsImageRenderer(size: canvas, format: format).image {
_ in image.draw(in: CGRect(origin: .zero, size: canvas))
}
guard let generatedImageSize = generatedImage?.jpegData(compressionQuality: 1.0)?.count else { return completion(nil) }
imageSize = generatedImageSize
percentage -= percantageDecrease
}
completion(generatedImage)
}
}
}
Використання:
ImageResizer.resize(image: image, maxByte: 800000) { img in
guard let resizedImage = img else { return }
}
}