Сжатие PNG без потерь в памяти как NSData? - PullRequest
1 голос
/ 22 ноября 2010

У меня в настоящее время есть NSData с действительными данными PNG:
NSData* imageData = [bitmapRep representationUsingType:NSPNGFileType properties:nil];

Я записал эти данные в файл:
[imageData writeToFile:@"test.png" atomically:YES];
А сжатие с помощью OptiPNG или PNGCrush дает многообещающие результаты (25% + сжатие).

Я бы хотел выполнить эту задачу в памяти, добавив категорию к NSData, чтобы включить что-то вроде:
[imageData optimizePNGData]

Тем не менее, вызовы файловой системы глубоко интегрированы в OptiPNG и PNGCrush, поэтому ни один из них не подходит для построения в виде библиотеки (например, optipng.a).

Есть ли у кого-нибудь идеи о том, как сделать нечто подобное, не полагаясь на вызовы exec, как это делает большинство оболочек с графическим интерфейсом?

1 Ответ

0 голосов
/ 23 ноября 2010

Если вы можете построить эти библиотеки и связать их с вашим процессом, но ваша проблема в том, что они работают с путями, а не с блоками байтов, вы можете создать именованный канал с помощью mkfifo, а затем передать на один конец канала данные изваш процесс и передать другой конец в функцию из OptiPNG или PNGCrush.Вам нужно будет непрерывно передавать канал во время вызова библиотеки, поэтому вам, вероятно, понадобится второй поток.

Вы можете прочитать о mkfifo () с помощью "man 2 mkfifo" в файле Terminal.app.

...