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

iOS使用UIImagePickerController在didFinishPicking中获取图片大小过大

UIImagePickerController获取图片大小偏差问题解答

核心原因

你看到的三个大小属于完全不同的统计维度,不存在计算错误,对应逻辑如下:

  • 相册显示的1.8MB:是系统将图片以HEIC格式压缩后存储在磁盘上的文件大小,HEIC是iOS默认的图片存储格式,压缩率远高于JPG,因此数值最小。
  • 邮件附件的2.7MB:是系统自动将HEIC格式转换为兼容性更高的JPG格式后的压缩文件大小,转换后格式通用,体积比HEIC更高。
  • 代码中拿到的5.9MB:是UIImage对象在内存中解码后的原始像素数据大小,不是压缩文件体积。UIImage加载后会把压缩的二进制数据完全解码为RGBA格式的像素矩阵,计算公式为图片宽度 * 图片高度 * 4字节/像素,和磁盘上的压缩文件大小没有对应关系,你自定义的getFileSizeInfo()方法大概率是统计了内存像素大小,才会出现数值偏高的问题。

正确获取压缩文件体积的方法

如果需要拿到和相册/邮件场景一致的文件大小,需要先将UIImage转换为对应格式的压缩二进制数据,再统计大小:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    var uploadImage:UIImage?
    if let image = info[.editedImage] as? UIImage
    {
        uploadImage = image
    }
    else if let image = info[.originalImage] as? UIImage{
        uploadImage = image
    }
    // 统计JPG格式大小,和邮件附件的实际大小逻辑对齐
    guard let jpgData = uploadImage?.jpegData(compressionQuality: 1.0) else { return }
    let jpgSizeMB = Double(jpgData.count) / 1024 / 1024
    debugPrint("JPG格式文件大小:\(String(format: "%.1f", jpgSizeMB))MB")
    
    // 统计HEIC格式大小,和相册显示的存储大小逻辑对齐
    if #available(iOS 11.0, *) {
        guard let heicData = uploadImage?.heicData(compressionQuality: 1.0) else { return }
        let heicSizeMB = Double(heicData.count) / 1024 / 1024
        debugPrint("HEIC格式文件大小:\(String(format: "%.1f", heicSizeMB))MB")
    }
}

注意事项

  • 如果你获取的是.editedImage,系统已经对原图做了裁剪、旋转等编辑操作,像素尺寸和原图不一致,计算出的文件大小也会和原图存储大小有差异。
  • 不要通过UIImage的内存属性推导文件存储大小,两者统计逻辑完全独立,没有对应关系。

内容的提问来源于stack exchange,提问作者gaurav gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 09:36:00