Конвертируйте 32-битный png в 8-битный png с помощью ImageMagick, сохраняя полупрозрачные пиксели

Я хочу преобразовать 32-битный PNG в 8-битный PNG с ImageMagick, но полупрозрачные пиксели теряются. Как решить эту проблему? Команда, которую я использую, следующая

convert original.png PNG8:output.png

1 ответ

По-видимому, даже несмотря на то, что формат PNG фактически позволяет полностью или частично полностью или частично прозрачно отображать любые цвета в PNG с 8-битным индексированным цветом, спецификатор формата ImageMagick "PNG8" поддерживает только 1-битную прозрачность в стиле GIF.

Можно создавать индексированные 8-битные PNG с использованием ImageMagick, не используя PNG8: спецификатор, но просто используя -colors 256 или же -colors 255 * уменьшить количество цветов на изображении. К сожалению, по крайней мере, основываясь на моих тестах с использованием ImageMagick 6.8.9, полученные изображения имеют некоторые довольно странные и совершенно излишне некрасивые артефакты квантования цвета.

К счастью, есть гораздо лучший инструмент для этой конкретной работы: pngquant. Используя его, преобразование 32-битного PNG RGBA в 8-битный PNG с цветовой картой с минимальной потерей качества так же просто, как:

pngquant 256 < original.png > output.png

В качестве быстрой демонстрации приведем простую тестовую картинку (звезда с полупрозрачной тенью), преобразованную в 8-битный PNG различными способами:

Original pngquant 256 ImageMagick convert (-colors 255 ImageMagick convert (PNG8 ImageMagick convert (-colors 255, PNG8

Слева направо:

  1. Оригинальный 32-битный RGBA PNG
  2. Квантованный с pngquant 256 < input.png > output.png
  3. Квантованный с convert input.png -colors 255 output.png *
  4. Квантованный с convert input.png PNG8:output.png
  5. Квантованный с convert input.png -colors 255 PNG8:output.png *

*) В комментариях ниже предлагается -colors 255 необходимо "зарезервировать одну запись для цвета фона". Основываясь на моем тестировании, я не заметил, что это действительно так; с помощью -colors 256 будет по-прежнему производить 8-битный цветовой PNG с артефактами квантования, качественно похожими, но отличающимися в деталях от выходных данных с -colors 255 , Тем не менее, просто чтобы не рисковать, я использовал -colors 255 для примеров выше. Уменьшение размера цветовой карты на один цвет само по себе не должно существенно влиять на качество результатов, так как тест с pngquant 255 продемонстрирую.

Другие вопросы по тегам