Создайте и напишите RGBA PNG с палитрой, используя NSImage

Я пытаюсь создать изображение PNG с палитрой (8 бит на пиксель), которое использует палитру RGBA (32 бита на запись палитры) с помощью Cocoa framework*.

Я пробовал несколько комбинаций для метода [NSBitmapImageRep initWithBitmapDataPlanes:…]. Кажется, создается соответствующее растровое изображение для bitsPerSample:2 bitsPerPixel:8.

Однако, когда я пытаюсь написать такое растровое изображение с помощью [NSBitmapImageRep representationUsingType:NSPNGFileType…], я получаю:

libpng error: Invalid bit depth for RGBA image

Если я попробую другую глубину цвета, то получу 32-битное изображение на пиксель (без палитры).


*) Я знаю, что мог бы просто использовать libpng, но это не тот ответ, который мне нужен.


person Kornel    schedule 06.02.2011    source источник


Ответы (1)


2 бита на выборку, 8 на пиксель не дадут вам индексированный PNG — теоретически он создаст PNG-файл RGBA с 2 битами на выборку, как и предполагает. Теперь такое изображение имеет 256 возможных значений цвета на пиксель (включая альфа-канал), но оно не индексируется в том смысле, что у него есть таблица поиска цветов.

Насколько мне известно, нет возможности указать цветовую палитру при использовании NSBitmapImageRep. Вам, вероятно, придется использовать libpng напрямую, чтобы получить желаемый эффект. (Кстати, не имеет значения, ищете ли вы не этот ответ. Это все равно правильный ответ на конкретную проблему, и слова «нет!» не изменят вселенную вокруг вас.)

Однако, прежде чем вы это сделаете, если вы сообщите нам, почему вы думаете/знаете, что вам нужен индексированный PNG, мы сможем указать вам лучшее или более простое решение.

person Jonathan Grynspan    schedule 06.02.2011
comment
Да, но это для файла GIF, а не для файла PNG. Это разные животные. - person Jonathan Grynspan; 07.02.2011
comment
Есть способ задать палитру — он принимает свойство NSImageRGBColorTable. Я нашел где-то трюк с 2 битами в секунду, объясняющий, как заставить работать вывод GIF (хотя, возможно, он был неправильным — какая тогда будет правильная настройка для GIF?). - person Kornel; 07.02.2011
comment
Я знаю PNG != GIF. Я хотел сказать, что этот класс поддерживает палитры — поддержка GIF доказывает это. - person Kornel; 07.02.2011
comment
Он поддерживает их только для файлов GIF. Он не поддерживает запись индексированных файлов PNG. - person Jonathan Grynspan; 07.02.2011