首页 文章

使用CGImage的JPEG压缩质量

提问于
浏览
16

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

我发现从 0.991.0. 时,磁盘大小和图像质量都有很大的提升 . 例如,当质量设置为 0.99 但气球为2.3 MB时,我有一个2048x1368图像压缩到430 KB当质量设置为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 色度子采样,这对于每个亮度像素都不是色度子采样或一个色度像素 . 这就是文件大小爆炸的原因,因为图像包含4x颜色数据与质量<= 0.99 .

那么,有没有人知道是否有办法使用CGImage(或任何其他API)关闭色度子采样的质量低于 1.0

2 回答

  • 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,我假设你不需要它 .

  • 2

    最终更新

    经过广泛研究并遵循上述评论中的建议,似乎无法使用Apple的任何内置API禁用色度子采样/抽取,只需将 kCGImageDestinationLossyCompressionQuality 设置为 1.0 ,这会导致图像非常大 .

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

相关问题