У меня есть приложение с «камерой в стиле Snapchat» (т.е. вы делаете снимок, а затем накладываете текст и смайлики).В настоящее время я уменьшаю разрешение до 1080 x 2040, а затем преобразую в формат jpegRepresentation с качеством 0,75.
Это все еще дает мне размер файла> 2 МБ, который кажется большим.Любые предложения о том, как уменьшить размер файла без потери качества?Я по-прежнему хочу, чтобы изображения выглядели хорошо в полноэкранном режиме.
Изменение размера изображения и его отправка в хранилище
override func post() {
// convert overlayed text and emojis to image and resize to 1080 x 2040
guard let image = mediaView.asImage().resized(to: IMAGE_SIZE) else { return }
//generate unique name for each image
let imageId = NSUUID().uuidString
let storageRef = Storage.storage().reference().child("post_images/\(imageId).jpeg")
storageManager.upload(image: image, to: storageRef) { (err) in
if let err = err {
// TODO: Handle Error
print("Error uploading image: \(err.localizedDescription)")
} else {
storageRef.downloadURL { (url, err) in
guard let url = url else {
// TODO: Handle Error
print("Error getting image url: \(err?.localizedDescription)")
return
}
print("SUCCESSFULLY SAVED IMAGE")
}
}
}
}
Диспетчер хранилища: преобразование изображения в формат JPEG и сжатие.Затем загружаем
func upload(image: UIImage, to storageRef: StorageReference, then handler: @escaping UploadHandler) {
// upload to storage
if let uploadData = image.jpegData(compressionQuality: 0.75) {
let metadata = StorageMetadata()
metadata.contentType = ContentTypeEnum.jpegImage.rawValue // "image/jpeg"
storageRef.putData(uploadData, metadata: metadata) { (metadata, err) in
if let err = err {
handler(err)
} else {
handler(nil)
}
}
}
}
расширение для преобразования UIView в изображение
extension UIView {
func asImage() -> UIImage {
let renderer = UIGraphicsImageRenderer(bounds: bounds)
return renderer.image { rendererContext in
layer.render(in: rendererContext.cgContext)
}
}
}
расширение для изменения размера UIImage
extension UIImage {
func resized(to size: CGSize) -> UIImage? {
let canvasSize = CGSize(width: size.width, height: size.height)
UIGraphicsBeginImageContextWithOptions(canvasSize, false, scale)
defer { UIGraphicsEndImageContext() }
draw(in: CGRect(origin: .zero, size: canvasSize))
return UIGraphicsGetImageFromCurrentImageContext()
}
}