使用CGImage的JPEG压缩质量

时间:2014-01-10 05:55:17

标签: ios image macos jpeg cgimage

我在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但是当气球达到2.3 MB时质量设置为1.0。视觉质量也有很大的提升,0.99设置对于这个特定的图像是不可接受的。尝试将质量设置为0.991.0之间的任何值都不起作用,因为大小保持在430 KB,直到0.995,其跳转到2.3 MB。此外,0.900.99的质量差别不大,文件大小范围从~353 KB到430 KB,但视觉质量没有太大改善。

有谁知道是否有任何方法可以提高JPEG质量?我真的需要比0.99给我的更好的东西,但比1.0提供的东西要少。也许我可以使用其他一些API?

我可能会尝试直接使用libjpeg,但我希望不会这样。

更新

经过一些调查后发现,对于所有kCGImageDestinationLossyCompressionQuality设置,最多1.0 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

2 个答案:

答案 0 :(得分:2)

  

也许我可以使用其他一些API?

WebP是来自Google的一种新图片格式,可以为您提供比jpg和png更好的压缩效果,无论是无损还是有损。 github上有一个非常容易使用的项目:https://github.com/seanooi/iOS-WebP

您只需将类别和WebP框架添加到项目中即可使用它。

//Converting To WebP
// quality value is [0, 100]
NSData *webpData = [UIImage imageToWebP:[UIImage imageNamed:@"image.jpg"] quality:75];

//Converting From WebP
UIImage *webPImage = [UIImage imageFromWebP:@"/path/to/file"];

//Setting image transparency
//alpha value is [0, 1]
UIImage *transparencyImage = [[UIImage imageNamed:image.jpg] imageByApplyingAlpha:0.5];

alpha版本不正常,但由于您使用的是jpg,我假设您不需要它。

答案 1 :(得分:2)

最终更新

经过广泛研究并遵循上述评论中的建议,似乎没有办法禁用任何Apple内置API的色度子采样/抽取,而不是将kCGImageDestinationLossyCompressionQuality设置为1.0导致非常大的图像。

如果您需要在保存为JPEG时能够自己控制色度子采样/抽取,那么您将需要使用第三方库,例如libjpeg。