如何从图片选择器获取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
相关产品推荐
相关产品推荐

