Swift 上传到Firebase存储后,图像大小增加
我上传了一个7.4MB大小的图像到firebase存储,但是我得到了24.8MB。为什么会这样?我该怎么解决呢 注意:我没有对图像的大小进行任何更改,而是保持原样。 代码如下:Swift 上传到Firebase存储后,图像大小增加,swift,firebase,firebase-storage,Swift,Firebase,Firebase Storage,我上传了一个7.4MB大小的图像到firebase存储,但是我得到了24.8MB。为什么会这样?我该怎么解决呢 注意:我没有对图像的大小进行任何更改,而是保持原样。 代码如下: func storeImageInFirebase(){ let storeageRef = Storage.storage().reference() let imageName = UUID().uuidString + ".jpg" le
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
}
}
你可以发布你用来上传图像到firebase的函数吗?试着使用let imageData=self.imgView.image.jpegData(压缩质量:0.75),也可以使用metada作为nil,我的意思是imagesReference.putData(imageData!,metadata:nil)@luffy_064为什么我需要写nil而不是元数据,还有
.pngData()之间的区别
和.jpegData(压缩质量:0.75)
?当您使用元数据时,您会向用户图像添加一些信息,这会增加图像的大小,通常在您上载图像时会增加其可推荐的应用压缩。我无法从Firebase存储下载图像进入Firebase存储,导航到上载的图像,并检查图像名称。确保它与您正在下载的路径完全相同。是的,它是相同的,当我单击url时,它会在浏览器中打开“新”选项卡,与“我的代码”中的不同,它是自动下载的。我在答案中添加了一些代码,以方便/安全地下载图像。如果您不需要URL,那么使用.getData比使用.downloadURL更快。如何给出上载图像的确切大小而不是常量让maxFileSize:Int=512*512
?