Swift中jpegData(compressionQuality:)设为0时输出比0.1更大是什么原因?
问题结论
你观测到的是iOS系统UIImage的JPEG压缩接口原生设计特性,既不是系统bug,也不是操作失误。
原因说明
Apple官方对jpegData(compressionQuality:)的参数定义中,0.0对应最高压缩率、最低画质,1.0对应最低压缩率、最高画质的线性映射规则,仅在参数大于约0.1的区间生效:
- 当参数低于0.1阈值时,系统会启用独立的低画质压缩分支,为了避免图片出现块效应、严重色偏等完全不可用的质量问题,该分支会额外保留更多画面高频信息做视觉补偿,最终导致输出的文件体积反而高于参数略高于阈值的常规压缩结果
- 绝大多数iOS版本中,JPEG压缩的最小体积通常出现在0.1~0.3的参数区间,而非参数为0的位置,是iOS端公认的压缩特性
代码注意事项
你提供的复现代码中UIImage初始化写法存在语法错误,正确写法如下,该错误不影响压缩大小异常的现象复现:
// 正确的UIImage初始化写法 let sometimesLargerThan: Data = UIImage(named: "imageInBundle.jpg")!.jpegData(compressionQuality: 0)! let this: Data = UIImage(named: "imageInBundle.jpg")!.jpegData(compressionQuality: 0.1)!
优化建议
如果需要获取最小体积的JPEG输出,不要直接将压缩参数设为0,可优先测试0.1~0.2区间的参数,通常可以拿到更小的输出体积,同时画质差异极小。
内容的提问来源于stack exchange,提问作者mufumade
相关产品推荐
相关产品推荐

