我在 Mac OS X 和 iOS 上使用 CGImage API(CGImageDestination,
CGBitmapContext,
, CGImage
等)来将图像压缩为 JPEG。使用 kCGImageDestinationLossyCompressionQuality
属性,您可以控制压缩质量:0.0
是最大压缩,1.0
是最大质量(根据 Apple 的说法,如果可能的话是无损的)。
我发现当您从 0.99
到 1.0
时,磁盘大小和图像质量都有巨大的跳跃。例如,我有一个 2048x1368当质量设置为 0.99
时压缩到 430 KB 的图像,但当质量设置为 1.0 时压缩到 2.3 MB。视觉质量也有了很大的提升,0.99
设置对于这个特定的图像是 Not Acceptable 。尝试将质量设置为 0.99
到 1.0
之间的任何值都不起作用,因为大小保持在 430 KB 直到 0.995
跳起来到 2.3 MB。此外,0.90
到 0.99
的质量确实没有太大区别,文件大小范围从 ~353 KB 到 430 KB,但视觉质量没有太大改善。
有谁知道是否有任何方法可以提高 JPEG 质量?我真的需要比 0.99
给我的更好但又比 1.0
提供的少的东西。也许我可以使用其他一些 API?
我可能会尝试直接使用 libjpeg,但我希望它不会变成那样。
更新
经过一番调查后发现,对于 1.0
的所有 kCGImageDestinationLossyCompressionQuality
设置,Apple 使用 4:2:0 chroma subsampling (或色度抽取)。这意味着对于 YCrCb 图像,它们仅对每 4 个亮度 (Y) 像素采样一个色度像素 (CrCb)。换句话说,他们只使用了原始图像中 1/4 的色度数据。对于 1.0
的质量,Apple 使用 4:4:4 色度子采样,即没有色度子采样或每个亮度像素一个色度像素。这就是文件大小爆炸的原因,因为图像包含 4 倍的颜色数据与质量 <= 0.99
。
那么,有没有人知道是否有一种方法可以使用 CGImage(或任何其他 API)针对低于 1.0
的质量关闭色度子采样?
最佳答案
最终更新
经过广泛研究并遵循上述评论中的建议,似乎无法使用任何 Apple 内置 API 禁用色度二次采样/抽取,除非将 kCGImageDestinationLossyCompressionQuality
设置为 1.0
会产生非常大的图像。
如果您在保存为 JPEG 时需要能够自己控制色度子采样/抽取,那么您需要使用第 3 方库,例如 libjpeg。
关于ios - 使用 CGImage 的 JPEG 压缩质量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21037121/