内存中的PNG无损压缩为NSData?

时间:2010-11-22 12:59:57

标签: objective-c cocoa png nsdata nsbitmapimagerep

我目前有一个带有效PNG数据的NSData:
NSData* imageData = [bitmapRep representationUsingType:NSPNGFileType properties:nil];

我已将此数据写入文件:
[imageData writeToFile:@"test.png" atomically:YES];
使用OptiPNG或PNGCrush压缩它会产生有希望的结果(25%+压缩)。

我想在内存中执行此任务,在NSData中添加一个类别以启用类似的功能:
[imageData optimizePNGData]

然而,文件系统调用深入到OptiPNG和PNGCrush中,使得它们都不适合构建为库(例如optipng.a)。

有没有人有任何关于如何在不依赖exec调用的情况下完成类似事情的想法,因为大多数GUI包装器都会这样做?

1 个答案:

答案 0 :(得分:0)

如果您可以构建这些库并将它们链接到您的进程中,但问题是它们是在路径而不是字节块上运行,您可以使用mkfifo创建一个命名管道,然后使用来自数据的数据输入管道的一端。您的过程并将另一端传递给OptiPNG或PNGCrush的函数。在调用库时,您需要连续提供管道,因此您可能需要第二个线程。

你可以在terminal.app中阅读mkfifo()和“man 2 mkfifo”。