【问题标题】:How to compress jpeg image with Cocoa?如何用 Cocoa 压缩 jpeg 图像?
【发布时间】:2010-12-18 21:42:24
【问题描述】:

我有一个 jpeg 图像,我希望能够使用 Cocoa/Core Image/Core Graphics 逐步压缩它。比如我有A.jpg(3MB),我压缩A得到B.jpg(1MB),压缩B得到C.jpg(400KB),以此类推,直到图像无法压缩为止。

我正在尝试使用 NSBitmapImageRep representationUsingType:properties,但没有取得多大成功。我使用从压缩图像数据创建的图像代表来尝试进一步压缩,但如果我使用的压缩因子与用于创建初始压缩数据的因子相同,则效果不佳。

这是我一直在争论的代码

NSString * 文件名 = @"largeImage.jpg"; NSLog(@"== 正在初始化 ==\n"); NSData * imageData = [NSData dataWithContentsOfFile:fileName]; NSLog(@"imageData 长度: %d\n", [imageData 长度]); NSImage * image = [[NSImage alloc] initWithData:imageData]; NSBitmapImageRep * bitmapRep = [[图像表示] objectAtIndex:0]; NSData * data = [bitmapRep representationUsingType:NSJPEGFileType properties:nil]; NSLog(@"数据长度:%d\n", [数据长度]); NSDictionary * dict = [NSDictionary dictionaryWithObject: [NSNumber numberWithFloat:0.5] forKey:NSImageCompressionFactor]; NSData * data5 = [bitmapRep representationUsingType:NSJPEGFileType properties:dict]; NSLog(@"data5 长度:%d\n", [data5 长度]); NSLog(@"== 结束 ==\n\n"); NSLog(@"== 图片来自 Data5 ==\n"); NSImage * imageFromData5 = [[NSImage alloc] initWithData:data5]; NSBitmapImageRep * bitmapRepFromData5 = [[imageFromData5 表示] objectAtIndex:0]; NSData * dataFromImageFromData5 = [bitmapRepFromData5 表示使用类型:NSJPEGFileType 属性:无]; NSLog(@"dataFromImageFromData5 长度: %d\n", [dataFromImageFromData5 长度]); dict = [NSDictionary dictionaryWithObject: [NSNumber numberWithFloat:0.5] forKey:NSImageCompressionFactor]; NSData * dataFiveFromImageWithData5 = [bitmapRepFromData5representationUsingType:NSJPEGFileType properties:dict]; NSLog(@"dataFiveFromImageWithData5 长度: %d\n", [dataFiveFromImageWithData5 长度]); NSLog(@"== 结束 ==\n\n");

这是我的结果

> == 初始化 == > 图像数据长度:1882694 > 数据长度:1888365 > data5长度:1102461 > == 结束 == > == 来自 Data5 的图像 == > dataFromImageFromData5 长度:1646137 > dataFiveFromImageWithData5 长度:1102115 > == 结束 == 尝试不同的图像 > == 初始化 == > 图像数据长度:3620257 > 数据长度:2889458 > data5长度:1404750 > == 结束 == > == 来自 Data5 的图像 == > dataFromImageFromData5 长度:2007951 > dataFiveFromImageWithData5 长度:1405398 > == 结束 ==

【问题讨论】:

    标签: cocoa macos nsimage nsbitmapimagerep nsimagerep


    【解决方案1】:

    您每次都需要减小系数。重新压缩未经编辑的 JPEG 图像,使用相同的质量级别实际上根本不会改变结果,这应该可以解释为什么您没有看到任何尺寸减小。

    (如果您想确保质量不会降低到不必要的程度,那么使用递减因子一遍又一遍地重新压缩原始图像而不是像您的示例中那样将它们链接起来可能是有意义的。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-22
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      • 2020-09-11
      • 1970-01-01
      • 2019-09-22
      • 2016-08-08
      相关资源
      最近更新 更多