【问题标题】:Image size increases after upload it to Firebase Storage将图像上传到 Firebase 存储后,图像大小会增加
【发布时间】:2020-09-03 13:52:06
【问题描述】:

我将大小为 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


                   }
               })

           }

       }

【问题讨论】:

  • 你能发布你用来上传图片到firebase的功能吗?
  • 尝试使用let imageData = self.imgView.image.jpegData(compressionQuality: 0.75),也使用metada作为nil,我的意思是imagesReference.putData(imageData!, metadata: nil)
  • @luffy_064 为什么我需要写 nil 而不是 metaData,另外,.pngData() 和 .jpegData(compressionQuality: 0.75) 有什么不同?
  • 好吧,当您使用元数据时,您正在向用户图像添加一些信息,这会增加大小,通常在您上传图像时推荐应用压缩。

标签: swift firebase firebase-storage


【解决方案1】:

试试下面的代码。您可以更改 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
        }
    }

【讨论】:

  • 我无法从 Firebase 存储下载图片
  • 进入 Firebase 存储,导航到上传的图像,然后检查图像名称。确保它与您正在下载的路径完全相同。
  • 是的,它是一样的,当我点击 URL 时,它会在浏览器中打开新标签页,这与我的代码不同,它是自动下载的
  • 我在答案中添加了一些代码,以便以一种简单/安全的方式下载图像。如果不需要 URL,使用 .getData 比使用 .downloadURL 更快。
  • 如何给出上传图片的准确尺寸而不是常量let maxFileSize: Int = 512 * 512?
猜你喜欢
  • 2021-06-02
  • 1970-01-01
  • 2017-05-27
  • 2020-10-03
  • 2017-05-31
  • 2017-09-25
相关资源
最近更新 更多