swift - 将图像上传到 Firebase 存储后,图像大小会增加
问题描述
我将大小为 7.4 MB 的图像上传到 Firebase 存储,但我得到了 24.8 MB。为什么会这样?我该如何解决?
注意:我没有对图像的大小进行任何更改,我保持原样。
这是代码:
func storeImageInFirebase(){
let storeageRef = Storage.storage().reference()
let imageName = UUID().uuidString + ".jpg"
let imagesReference = storeageRef.child("images").child(imageName)
let imageData = self.imgView.image!.pngData()
let metaData = StorageMetadata()
metaData.contentType = "image/jpg"
imagesReference.putData(imageData!, metadata: metaData){ (metadate, error)
in
guard metadate != nil else{
print("Error: \(String(describing: error?.localizedDescription))")
return
}
// Fetch the download URL
imagesReference.downloadURL(completion: {(url, error)
in
if error != nil {
print("Faild to download url:", error!)
return
}else{
// show the url in real database
}
})
}
}
解决方案
试试下面的代码。您可以更改 maxCompression 和 maxFileSize 以满足您的需要。当图像大于您的最大尺寸并且压缩率高于您的最大压缩率时,这将继续以 0.05 的增量循环/压缩文件。
func storeImageInFirebase(image: UIImage) {
var compression: CGFloat = 0.9 //starting compression
let maxCompression: CGFloat = 0.05 //change to the maximum compression you want
let maxFileSize: Int = 512 * 512 //change to the maximum file size you want
guard var uploadImageData = image.jpegData(compressionQuality: compression) else {
print("ERROR: Creating photo data")
return
}
while (uploadImageData.count > maxFileSize) && (compression > maxCompression) {
compression -= 0.05
if let compressedImageData = image.jpegData(compressionQuality: compression) {
uploadImageData = compressedImageData
}
}
guard let uploadImageDataFinal = image.jpegData(compressionQuality: compression) else {
print("ERROR: Compressing final photo")
return
}
let imageName = UUID().uuidString
let storageRef = Storage.storage().reference().child("images").child(imageName)
let metadata = StorageMetadata()
metadata.contentType = "image/jpeg"
storageRef.putData(uploadImageDataFinal, metadata: metadata) { (metadata, err) in
if err != nil {
print("ERROR: Adding photo to storage")
return
} else {
//success
print("SUCCESS: Photo uploaded")
return
}
}
}
要下载图像,请将此功能添加到视图控制器:
func getImage(handler: @escaping(_ image: UIImage?) -> ()) {
let imageName = UUID().uuidString
let storageRef = Storage.storage().reference().child("images").child(imageName)
storageRef.getData(maxSize: 27 * 1024 * 1024) { (data, error) in
if let data = data, let image = UIImage(data: data) {
print("SUCCESS: downloaded image")
handler(image)
} else {
print("ERROR downloading image. \(error)")
handler(nil)
}
}
}
当您需要下载图像时,请使用:
self.getImage { (returnedImage) in
if let image = returnedImage {
//use image here
}
}
推荐阅读
- amazon-web-services - aws Spot 实例的日志记录解决方案
- gcloud - mac终端中的gcloud sdk - 退格不起作用
- typo3 - 在 TYPO3 后端页面树中显示某些页面类型的标题以外的其他字段
- linux - 我最初下载了 miniconda,现在尝试使用完整的 ananconda3,在导航器启动时,一些项目仍然试图指向 miniconda
- mysql - 如何根据 MySQL/SQLAlchemy 查询输出在 Hue 中设置变量?
- mysql - 仅包含外键的表
- html - 折线图未在 mat-tab 中显示(角度材料)
- python - 导入理解失败
- php - 我不知道如何使用 MAMP 使用 Symfony 显示我自己的页面
- django - 我如何在 Django 中创建更新功能