【发布时间】:2018-01-16 19:23:43
【问题描述】:
我制作了一个函数,可以在保持纵横比的同时将图像的大小调整为最大宽度和高度。此外,我正在根据 compressionQuality 压缩图像 - 我已经使用 3024x4032 jpeg 图像 @ 11.7 mb 对此进行了测试。
maxWidth = 800px
maxHeight = 1200px
compressionQuality = 0.5
该功能确实将图像大小从 11.7mb 减小到 0.51mb,但是宽度和高度没有正确减小。上传到 Firebase 后,图像的大小是 1600 x 2134 像素的两倍……但应该是 800x1066 像素(一半)
你能看出哪里不对吗?
import UIKit
import Foundation
class ImageEdit {
static let instance = ImageEdit()
func resizeAndCompressImageWith(image: UIImage, maxWidth: CGFloat, maxHeight: CGFloat, compressionQuality: CGFloat) -> Data? {
let horizontalRatio = maxWidth / image.size.width
let verticalRatio = maxHeight / image.size.height
let ratio = min(horizontalRatio, verticalRatio)
let newSize = CGSize(width: image.size.width * ratio, height: image.size.height * ratio)
var newImage: UIImage
if #available(iOS 10.0, *) {
let renderFormat = UIGraphicsImageRendererFormat.default()
renderFormat.opaque = false
let renderer = UIGraphicsImageRenderer(size: CGSize(width: newSize.width, height: newSize.height), format: renderFormat)
newImage = renderer.image {
(context) in
image.draw(in: CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height))
}
} else {
UIGraphicsBeginImageContextWithOptions(CGSize(width: newSize.width, height: newSize.height), true, 0)
image.draw(in: CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height))
newImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
}
let data = UIImageJPEGRepresentation(newImage, compressionQuality)
return data
}
}
这是将图像上传到 firebase 的代码。
func uploadImageToFirebaseAndReturnImageURL(directory: String, image: UIImage!, maxWidth: CGFloat, maxHeight: CGFloat, compressionQuality: CGFloat, handler: @escaping(_ imageURL: String) -> ()) {
let imageName = NSUUID().uuidString // create unique image name
if let uploadData = ImageEdit.instance.resizeAndCompressImageWith(image: image, maxWidth: maxWidth, maxHeight: maxHeight, compressionQuality: compressionQuality) {
DB_STORE.child(directory).child(imageName).putData(uploadData, metadata: nil, completion: { (metadata, error) in
if error != nil {
print(error ?? "Image upload failed for unknown reason")
return
}
// if URL exist, then return imageURL
if let imageURL = metadata?.downloadURL()?.absoluteString {
handler (imageURL)
}
return
})
}
}
【问题讨论】:
标签: swift firebase uiimage resize compression