ios - 使用 CGImage 的 JPEG 压缩质量

标签 ios image macos jpeg cgimage

我在 Mac OS X 和 iOS 上使用 CGImage API(CGImageDestination, CGBitmapContext,, CGImage 等)来将图像压缩为 JPEG。使用 kCGImageDestinationLossyCompressionQuality 属性,您可以控制压缩质量:0.0 是最大压缩,1.0 是最大质量(根据 Apple 的说法,如果可能的话是无损的)。

我发现当您从 0.991.0 时,磁盘大小和图像质量都有巨大的跳跃。例如,我有一个 2048x1368当质量设置为 0.99 时压缩到 430 KB 的图像,但当质量设置为 1.0 时压缩到 2.3 MB。视觉质量也有了很大的提升,0.99 设置对于这个特定的图像是 Not Acceptable 。尝试将质量设置为 0.991.0 之间的任何值都不起作用,因为大小保持在 430 KB 直到 0.995 跳起来到 2.3 MB。此外,0.900.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/

相关文章:

ios - 如何在 iOS/Objective-C 中存储身份验证 key ?

javascript - 如何在 CSS 样式表完成加载时运行函数

java - Mac 操作系统 JarLauncher 问题

objective-c - 带图像的 cocoa 菜单

ruby - OSX Ruby Gems 添加到 ruby​​ 路径?

OS X 中的 Python : Detect multiple monitors and move application window to specific monitor

ios - AFNetworking API 调用状态码

ios - 向标签添加手势?

iphone - 对为什么我的 UISCrollView 的框架为空感到困惑

ios - 将 pdf 第一页转换为 Collection View 单元格时创建黑框的代码。如何解决这个问题?