首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于CGImage的JPEG压缩质量

基于CGImage的JPEG压缩质量
EN

Stack Overflow用户
提问于 2014-01-10 05:55:17
回答 2查看 5.9K关注 0票数 18

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

我发现当您从0.991.0.时,磁盘大小和图像质量都有很大的飞跃--例如,我有一个2048x1368图像,当质量设置为0.99时压缩到430 KB,当质量设置为1.0时,压缩到2.3MB。视觉质量也有了很大的提高,对于这个特定的图像,0.99设置是不可接受的。尝试将质量设置为0.991.0之间的任何内容都不起作用,因为在0.995跳转到2.3MB之前,其大小仍然保持在430 KB。另外,0.900.99的质量之间并没有太大的差别,文件大小从353KB到430 KB不等,但是视觉质量并没有多大的提高。

有没有人知道是否有办法提高JPEG的质量?我真的需要比0.99给我的东西更好的东西,但比1.0提供的东西少。也许还有其他API我可以用吗?

我可能会尝试直接使用libjpeg,但我希望不会出现这种情况。

更新

经过一些调查发现,对于所有kCGImageDestinationLossyCompressionQuality设置到1.0为止,苹果使用4:2:0 色度次采样 (或色度抽取)。这意味着对于YCrCb图像,它们仅对每4个亮度(Y)像素采样一个色度像素(CrCb)。换句话说,他们只使用来自原始图像的色度数据的1/4。为了保证1.0的质量,苹果使用4:4:4色度亚采样,即不对每个亮度像素进行色度亚采样或一个色度像素。这就是为什么当图像包含颜色数据的4倍,而质量为<= 0.99时,文件大小会爆炸的原因。

那么,有没有人知道是否有一种方法可以使用CGImage (或任何其他API)关闭色度次采样,以获得低于1.0的质量

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-28 21:44:01

最后更新

经过广泛的研究并遵循上述评论中的建议,似乎没有办法禁用任何苹果内置API的色度次采样/抽取,除非将kCGImageDestinationLossyCompressionQuality设置为1.0,否则会产生非常大的图像。

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

票数 5
EN

Stack Overflow用户

发布于 2014-02-04 20:27:21

也许还有其他API我可以用吗?

WebP是谷歌的一种新的图像格式,它为你提供了比jpg和png更好的压缩功能,既无损又有损。在github上有一个非常容易使用的项目:https://github.com/seanooi/iOS-WebP

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

代码语言:javascript
复制
//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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21037121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档