Ich war mit den Lösungen hier nicht zufrieden, die ein Bild basierend auf einer bestimmten KB-Größe erzeugen, da die meisten von ihnen verwendet wurden .jpegData(compressionQuality: x)
. Diese Methode funktioniert nicht mit großen Bildern, da das große Bild auch bei einer auf 0,0 eingestellten Komprimierungsqualität groß bleibt, z. B. 10 MB, die im Hochformat eines neueren iPhone erzeugt werden, immer noch über 1 MB liegen, während die Komprimierungsqualität auf 0,0 eingestellt ist.
Deshalb habe ich die Antwort von @Leo Dabus verwendet und sie in eine Hilfsstruktur umgeschrieben, die ein Bild in eine Hintergrundwarteschlange konvertiert:
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)
}
}
}
Verwendung:
ImageResizer.resize(image: image, maxByte: 800000) { img in
guard let resizedImage = img else { return }
}
}