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

如何从图片选择器获取KB/MB单位的图片大小?代码实现遇阻求助

我看到你在用UIImageJPEGRepresentation计算图片的KB大小,但应该是遇到了一些小问题——比如强制解包导致的崩溃风险,或者得到的大小和预期不符?我来帮你拆解问题并给出优化方案:

先说说你现有代码里的潜在坑

  • 强制解包会引发崩溃:UIImageJPEGRepresentation返回的是可选类型Data?,如果图片对象无效或者转换失败,as! NSData会直接让程序崩溃,这在生产环境里是绝对要避免的。
  • 你拿到的是「压缩后JPEG数据的大小」:如果你的需求是获取图片原始磁盘文件的大小,那这个方法并不合适——因为UIImage是解码后的内存对象,哪怕你用质量1.0重新编码,得到的大小也可能和原始文件不一致。

针对不同需求的解决方案

方案1:安全获取压缩后的JPEG数据大小(修复你的现有逻辑)

把强制解包改成安全的可选绑定,同时改用更符合现代Swift规范的Data类型:

if let targetImage = images.first, let imageData = UIImageJPEGRepresentation(targetImage, 1.0) {
    let formatter = ByteCountFormatter()
    formatter.allowedUnits = .useKB
    formatter.countStyle = .binary // 1KB=1024字节,若要十进制(1KB=1000字节)改成.decimal
    let imageSize = formatter.string(fromByteCount: Int64(imageData.count))
    print(imageSize)
} else {
    print("无法获取有效图片数据")
}

方案2:获取图片原始磁盘文件的真实大小

如果你的图片是从本地磁盘加载的,直接读取文件属性会更准确高效:

// 假设你有图片的本地URL(比如从相册选取时得到的PHAsset对应的URL)
if let imageLocalURL = URL(string: "你的图片本地路径") {
    do {
        let fileAttrs = try FileManager.default.attributesOfItem(atPath: imageLocalURL.path)
        if let rawFileSize = fileAttrs[.size] as? Int64 {
            let formatter = ByteCountFormatter()
            formatter.allowedUnits = .useKB
            formatter.countStyle = .binary
            let imageSize = formatter.string(fromByteCount: rawFileSize)
            print(imageSize)
        }
    } catch {
        print("获取文件大小失败:\(error.localizedDescription)")
    }
}

补充小提示

如果图片是从网络加载的,建议在下载时直接读取响应头里的Content-Length字段,或者把图片保存到本地后再计算大小,这样比解码后重新编码要高效得多。

内容的提问来源于stack exchange,提问作者phadte viraj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:17:11