Сжатие PNG без потерь в памяти как NSData?

В настоящее время у меня есть 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, как это делают большинство оболочек GUI?


person Jonathan    schedule 22.11.2010    source источник


Ответы (1)


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

Вы можете прочитать о mkfifo() с помощью «man 2 mkfifo» в terminal.app.

person Jon Hess    schedule 23.11.2010