Используйте один из следующих 3, упорядоченных от наименьшего до наибольшего количества вспомогательных тегов в выходном файле:
convert -colors 2 -define png:include-chunk=none -verbose input.png output.png
convert -colors 2 -define png:exclude-chunk=bkgd -verbose input.png output.png
convert -colors 2 -background #000000 -verbose input.png output.png
Корень этой проблемы в том, что ImageMagick по умолчанию помечает изображение белым фоновым цветом (bKGD) PNG. chunk (я бы сказал, без необходимости), а затем добавляет этот цвет в палитру, если его там еще нет, даже если на изображении нет пикселей этого цвета. Ваше конкретное изображение не имеет белого после преобразования в 2-цветное, поэтому ненужный тег цвета фона становится 3-м цветом, и его больше нельзя сохранить как 1-битное индексированное цветное изображение. См. также от автора чат.
Причина, по которой другим не удалось воспроизвести проблему, вероятно, заключается в том, что они тестировали изображения, где один из двух цветов оказался белым.
Первый вариант с -define png:include-chunk=none
позволяет избежать проблемы, так как вообще не выводит какие-либо вспомогательные фрагменты PNG (например, bKGD, gAMA, cHRM, tEXt, tIME). Как pngcrush -rem alla
. Я бы предпочел это для менее загроможденного файла (без этого IM добавит несколько из них, даже если их не было во входном файле). Примечание. Существует также простая опция -strip
, которая следует избегать большинства из них, но начиная с версии 6.9.3 он не отключает bKGD из-за ошибки.
Второй с -define png:exclude-chunk=bkgd
удаляет только оскорбительный фрагмент фона.
Третий вариант с -background #000000
сохраняет все вспомогательные фрагменты PNG, включая bKGD, но устанавливает его черным, одним из двух цветов, присутствующих в вашем изображении, поэтому он все еще может быть 1-битным. Отрегулируйте цвет для изображения, в котором нет ни белого, ни черного.
Обратите внимание, что для всего этого я включаю переключатель -verbose
. Не слишком многословный; просто переходит от нуля к двум строкам вывода состояния, где вы заметите «2c», если изображение осталось двухцветным, или «3c», если нет. Он также сообщит вам, было ли уменьшение палитры с потерями или нет. Он также выводит «8-битный sRGB» для большинства изображений, даже для изображений с палитрой с менее чем 8 битами на пиксель; это не ошибка, как в вашем комментарии к другому ответу @johnfound, это относится не к битам на пиксель, а к компоненту битов на цвет. Он может быть более 8-битным для (редких) изображений с глубоким цветом.
person
WinTakeAll
schedule
28.03.2016