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 был бы хорошим форматом для дословного сохранения старых снимков экрана, поскольку он использует сжатие без потерь, но, может быть, это неприменимо из-за использования со старинным программным обеспечением?