SwiftUI 如何在上传图片至Firebase Storage前调整图片尺寸
iOS端Firebase Storage上传前统一调整图片尺寸实现方案
首先实现UIImage的尺寸调整扩展,用来统一把所有上传图片缩到指定尺寸范围内,自动保持原图宽高比避免拉伸:
extension UIImage { /// 调整图片到指定最大尺寸(宽高都不会超过该数值,保持宽高比) func scaledToMaxDimension(_ maxDimension: CGFloat) -> UIImage { let widthRatio = maxDimension / size.width let heightRatio = maxDimension / size.height let scaleRatio = min(widthRatio, heightRatio) let targetSize = CGSize(width: size.width * scaleRatio, height: size.height * scaleRatio) let renderer = UIGraphicsImageRenderer(size: targetSize) return renderer.image { _ in draw(in: CGRect(origin: .zero, size: targetSize)) } } }
之后修改原有上传逻辑,在转换为JPEG数据前先调整图片尺寸,同时可适当调低压缩质量进一步减小体积:
func uploadImageToStorage(image: UIImage) { // 先调整图片尺寸,头像类场景最大设为512px即可满足需求,可按需修改数值 let scaledImage = image.scaledToMaxDimension(512) // 压缩质量调整为0.7-0.8即可,肉眼几乎无画质差异,体积比原压缩质量1小很多 if let imageData = scaledImage.jpegData(compressionQuality: 0.8) { let storage = Storage.storage() let storageRef = storage.reference() let testRef = storageRef.child("avatar/\(user.id)/avatar.png") testRef.putData(imageData, metadata: nil) {( _, error) in if let error = error { print("发生错误 - \(error.localizedDescription)") } else { print("图片上传成功") } } } else { print("图片转换为数据失败") } }
- 可根据业务场景调整
scaledToMaxDimension的入参,比如商品展示图可以设为1080,头像类设为256-512即可 - 调整后上传的图片体积会大幅降低,既能提升上传速度,也能解决后续从Storage拉取图片渲染慢的问题
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

