cocoa - 如何用Cocoa压缩jpeg图像?

标签 cocoa macos nsimage nsbitmapimagerep nsimagerep

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

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

这是我一直在争论的代码

NSString * fileName = @"largeImage.jpg";

NSLog(@"== Initializing ==\n");

NSData * imageData = [NSData dataWithContentsOfFile:fileName];
NSLog(@"imageData length: %d\n", [imageData length]);

NSImage * image = [[NSImage alloc] initWithData:imageData];
NSBitmapImageRep * bitmapRep = [[image representations] objectAtIndex:0];

NSData * data = [bitmapRep representationUsingType:NSJPEGFileType properties:nil];
NSLog(@"data length: %d\n", [data length]);

NSDictionary * dict = [NSDictionary dictionaryWithObject: [NSNumber numberWithFloat:0.5] forKey:NSImageCompressionFactor];
NSData * data5 = [bitmapRep representationUsingType:NSJPEGFileType properties:dict];
NSLog(@"data5 length: %d\n", [data5 length]);

NSLog(@"== End ==\n\n");

NSLog(@"== Image from Data5 ==\n");
NSImage * imageFromData5 = [[NSImage alloc] initWithData:data5];
NSBitmapImageRep * bitmapRepFromData5 = [[imageFromData5 representations] objectAtIndex:0];

NSData * dataFromImageFromData5 = [bitmapRepFromData5 representationUsingType:NSJPEGFileType properties:nil];
NSLog(@"dataFromImageFromData5 length: %d\n", [dataFromImageFromData5 length]);

dict = [NSDictionary dictionaryWithObject: [NSNumber numberWithFloat:0.5] forKey:NSImageCompressionFactor];
NSData * dataFiveFromImageWithData5 = [bitmapRepFromData5 representationUsingType:NSJPEGFileType properties:dict];
NSLog(@"dataFiveFromImageWithData5 length: %d\n", [dataFiveFromImageWithData5 length]);
NSLog(@"== End ==\n\n");

这是我的结果

> == Initializing ==
> imageData length: 1882694
> data length: 1888365
> data5 length: 1102461
> == End ==

> == Image from Data5 ==
> dataFromImageFromData5 length: 1646137
> dataFiveFromImageWithData5 length: 1102115
> == End ==


Try a different image
> == Initializing ==
> imageData length: 3620257
> data length: 2889458
> data5 length: 1404750
> == End ==

> == Image from Data5 ==
> dataFromImageFromData5 length: 2007951
> dataFiveFromImageWithData5 length: 1405398
> == End ==

最佳答案

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

(如果您想确保质量不会降低超过必要的程度,则可以使用递减的因子一遍又一遍地重新压缩原始图像,而不是像示例中那样链接它们。)

关于cocoa - 如何用Cocoa压缩jpeg图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1773360/

相关文章:

c++ - 来自 C++ boost 线程的 NSOpenPanel

Java如何在Mac上用命令打开url?

swift - 在 NSImage 上绘制透明文本

objective-c - 如何获取用户 Mac 的图标?

objective-c - 如何在 Cocoa WebView 上仅加载 HTML+CSS+JS 并停止加载图像

objective-c - cocoa 将窗口放在前台

cocoa - 使用 NSWorkspace 获取所有正在运行的进程

macos - Golang 交叉编译的 OSX 二进制文件在 net/http.Get() 中使用 VPN 时挂起

c - 我应该指望换行符是什么字符?

macos - NSImage 和 PDFImageRep 缓存仍然仅以一种分辨率绘制