我在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.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,但我希望不会这样。
经过一些调查后发现,对于所有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
?
答案 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。