ImageMagick Преобразование BMP из 24-битного в 16-битный режим?

Я пытаюсь преобразовать BMP из 24 бит / пиксель в режим 16 бит / пиксель в ImageMagick.

convert /tmp/a/new/37.bmp -depth 5 -define bmp:format=bmp2 /tmp/a/new/37_v2_16bit.bmp
convert /tmp/a/new/37.bmp -depth 5 -define bmp:format=bmp3 /tmp/a/new/37_v3_16bit.bmp

Результат имеет одинаковые 8 бит на R., на G. и на B., в соответствии с выводом: identifier -verbose

Что я делаю неправильно? Как получить 16-битный цвет в BMP?

Спасибо!

PS

Глубина

глубина изображения. Это количество бит в пикселе. Допустимые значения: 8 или 16. http://linux.math.tifr.res.in/manuals/html/convert.html

знак равно

Официальная документация гласит (без ограничений):

Глубина

глубина изображения.

Это количество бит в образце цвета в пикселе. Используйте эту опцию, чтобы указать глубину необработанных изображений, глубина которых неизвестна, например, СЕРЫЙ, RGB или CMYK, или изменить глубину любого изображения после его прочтения.


конвертировать /tmp/a/new/37.bmp -colors 256 /tmp/a/new/37_256.bmp

делает файл меньше, но визуально он такой же! WTH?!)))))


конвертировать /tmp/a/new/37.bmp -colors 65536 /tmp/a/new/37_64k.bmp

тот же самый размер, та же самая визуальная картина.


convert /tmp/a/new/37.bmp -dither None -colors 256 /tmp/a/new/37_256_nd.bmp

немного меньше, но он не выглядит как 256-цветный! ошибка? 256 цветных BMP 800x600 составляет ~ 800x600x1 байт (без заголовков) ~ 480 000 байт. Но там написано ~650 000 байт)))) прикольная программа))

1 ответ

Решение

Документация, которую вы цитировали из linux.math... довольно старая (2001) и неверна в отношении -depth. Опция "-depth 16" не означает 16-битные пиксели (например, R5G6R5 или R5G5R5A1); Глубина 16 означает 48 бит / пиксель R16, G16, B16 или 64 бит / пиксель R16, G16, B16, A16 пикселей. "Официальная документация", которую вы цитировали (2015), верна.

ImageMagick не поддерживает такого рода 16-битные / пиксельные форматы, поэтому вам нужно хранить их в 8-битном / канальном формате и жить с большим размером файла.

Также представляется, что для изображений с 256 или менее цветами будет записано цветное изображение с 1, 4 или 8-битными индексами. Вам не нужно делать никаких специальных запросов, это будет сделано автоматически. Используйте "-compress none" для несжатых BMP. Текущий ImageMagick (версия 6.9.2-8) дает мне ожидаемый файл размером 480 КБ, если я начну с изображения размером 800x600 с более чем 256 цветами и использую

convert im.bmp -colors 256 -compress none out.bmp

ImageMagick поддерживает 16-битный формат BMP "битовые поля" во время чтения, но я не вижу никаких признаков того, что он может их записывать, и не пытался ни читать, ни писать такие изображения.

Это не ImageMagick, а ffmpeg, больше связанный с видео, можно ли создать 16-битное изображение в формате BMP, если вы имеете в виду формат 565?

ffmpeg -i ffmpeg-logo.png -sws_flags neighbor -sws_dither none -pix_fmt rgb565 -y ffmpeg-logo-16bit-nodither.bmp

Это намеренно отключает дизеринг, но если вы хотите, просто опустите части sws, например

ffmpeg -i ffmpeg-logo.png -pix_fmt rgb565 -y ffmpeg-logo-16bit-dithered.bmp

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

Судя по обсуждению в комментариях, похоже, что PNG был бы хорошим форматом для дословного сохранения старых снимков экрана, поскольку он использует сжатие без потерь, но, может быть, это неприменимо из-за использования со старинным программным обеспечением?

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