Xcode上传至Firebase Storage的图片文件体积异常增大问题
问题根源与解决方案
嘿,我一眼就瞅出问题在哪了——你用UIImagePNGRepresentation把图片转成PNG格式上传,这就是体积暴涨的核心原因!
咱们手机相册里的原图大多是JPEG格式,它是有损压缩,能在保证不错画质的前提下把体积压得很小(1-2MB就是这么来的)。但PNG是无损压缩格式,会完整保留图片的所有像素信息,哪怕是JPEG转成PNG,也会把原本被压缩掉的细节“补”回来,直接导致体积翻好几倍,变成10-20MB完全不奇怪。
下面给你几个解决办法:
1. 改用JPEG格式上传(最直接的方案)
把PNG转码换成JPEG转码,还能通过调整压缩质量来平衡体积和画质。iOS 12及以上推荐用jpegData(compressionQuality:)方法,压缩质量范围是0(最差画质)到1(无损),一般设0.7-0.8就足够清晰,体积也会回到正常水平。
修改后的代码大概是这样:
let imageName = NSUUID().uuidString let storageRef = Storage.storage().reference().child("Quads").child(imageName) // 替换成JPEG转码,这里用0.8的压缩质量 guard let image = imageView1.image, let uploadData = image.jpegData(compressionQuality: 0.8) else { // 处理图片为空或者转码失败的情况 print("图片转码失败") return } // 继续你的上传逻辑 storageRef.putData(uploadData, metadata: nil) { metadata, error in if let error = error { print("上传失败:\(error.localizedDescription)") return } // 上传成功后的操作 }
2. 额外优化:缩小图片分辨率(如果需要更小体积)
如果你的图片分辨率特别高(比如4K),哪怕转成JPEG体积还是有点大,可以先把图片缩到合适的尺寸(比如1080p)再上传。比如写个简单的图片缩放函数:
func resizeImage(image: UIImage, targetSize: CGSize) -> UIImage? { let size = image.size let widthRatio = targetSize.width / size.width let heightRatio = targetSize.height / size.height let newSize = widthRatio < heightRatio ? CGSize(width: size.width * widthRatio, height: size.height * widthRatio) : CGSize(width: size.width * heightRatio, height: size.height * heightRatio) UIGraphicsBeginImageContextWithOptions(newSize, false, 1.0) image.draw(in: CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height)) let newImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return newImage } // 使用示例:把图片缩到1080p if let originalImage = imageView1.image, let resizedImage = resizeImage(image: originalImage, targetSize: CGSize(width: 1920, height: 1080)), let uploadData = resizedImage.jpegData(compressionQuality: 0.8) { // 上传resizedImage的data }
这样双管齐下,就能把上传的图片体积控制在和原图差不多的水平啦!
内容的提问来源于stack exchange,提问作者Deficere
相关产品推荐
相关产品推荐

