Есть ли библиотека для С++ (или инструмент) для уменьшения цветов в изображении PNG с альфа-значениями?

У меня есть PNG-изображение с альфа-значениями, и мне нужно уменьшить количество цветов. Мне нужно иметь не более 256 цветов для всех цветов изображения, и до сих пор все, что я пробовал (от магазина красок до лептоники и т. д.), лишало изображение альфа-канала и делало его непригодным для использования. Есть ли что-нибудь, что делает то, что я хочу?

Редактировать: я не хочу использовать 8-битную палитру. Мне просто нужно уменьшить количество цветов, чтобы моя собственная программа могла обработать изображение.


person HardCoder    schedule 04.01.2012    source источник


Ответы (3)


Вы пробовали ImageMagick?

person paulsm4    schedule 04.01.2012
comment
Да. Это кажется ошибочным, потому что выход, кажется, сбрасывает альфа-значения, когда я уменьшаю цвета до 256 или меньше (вероятно, переключаюсь на палитру) и всегда создает довольно плохие результаты с большим количеством пикселей неправильного цвета. Это может быть не видно на обычных изображениях, но мои изображения имеют много областей с несколькими цветами, и очень плохое сглаживание действительно слишком очевидно. - person HardCoder; 05.01.2012

8-битные PNG с альфа-прозрачностью будут отображать альфа-канал только в новых веб-браузерах.

Вот некоторые инструменты и веб-сайт, который выполняет преобразование:

бесплатно pngquant

Adobe Fireworks

и веб-сайт: http://www.8bitalpha.com/

Также см. похожий вопрос

person Motes    schedule 04.01.2012
comment
Спасибо за ответ. Я должен был быть более точным в своем вопросе (я его отредактировал), но мне не нужно изображение для его отображения в браузере или что-то еще, кроме как продолжить его обработку с помощью моей собственной программы. Я проверил все ваши ссылки и, к сожалению (если я что-то не пропустил), они не приближают меня к решению моей проблемы... - person HardCoder; 05.01.2012
comment
Почему вам нужно менее 256 цветов, если вы не пытаетесь использовать 8-битную палитру? - person Motes; 06.01.2012
comment
Я хочу использовать изображение в качестве таблицы поиска для фрагментных шейдеров, чтобы сохранить память текстуры. Таким образом, я использую только 8 бит на пиксель для прозрачности высокого качества вместо 32 бит... - person HardCoder; 06.01.2012
comment
Я считаю, что 256 цветов будут 8 бит + альфа-канал будет 8 бит = 16 бит на пиксель. прозрачный PNG24 на самом деле занимает 32 бита на пиксель, 32 бита на пиксель. И я даже не знаю, возможно ли определить свою собственную палитру, но я бы рассмотрел это, потому что это то, что вы пытаетесь сделать. Что бы ни интерпретировало ваш цвет, необходимо знать, что числа от 0 до 255 соответствуют вашей пользовательской палитре. - person Motes; 06.01.2012

Описанная вами проблема связана с форматом PNG. См. запись в Википедии и обратите внимание, что в таблице параметров цвета нет записи для Indexed & alpha. Существует возможность добавить альфа-значение к каждому из 256 цветов, но обычно только один элемент палитры будет полностью прозрачным, а остальные будут полностью непрозрачными.

В Paint Shop Pro есть несколько опций для смешивания или имитации частичной прозрачности в PNG с палитрой — я знаю, потому что написал это.

person Mark Ransom    schedule 04.01.2012
comment
Я только хочу уменьшить количество цветов до определенного числа, а не использовать формат палитры. Я могу извлечь цвета rgba из png с помощью моей собственной программы. Мне просто нужно, чтобы цветов было меньше, а альфа-канал оставался нетронутым. Это как-то возможно с Paint Shop Pro? - person HardCoder; 05.01.2012
comment
Я перепроверил это, и определенно есть способ установить альфа-значение для каждой записи в 8-битной таблице и эффективно превратить палитру в 256 цветов RGBA. - person HardCoder; 07.01.2012
comment
@HardCoder, я сказал это в своем ответе: есть возможность добавить альфа-значение к каждому из 256 цветов. Поскольку альфа не является независимой, она действительно ограничивает вашу палитру, когда вы делаете это. IE6 также не отображал их должным образом, поэтому вы не видите, что он используется очень часто. - person Mark Ransom; 07.01.2012