You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 22:36:04