Каков формат BMP для изображений шкалы серого?

Каков формат BMP для изображений шкалы серого (особенно для 16 бит на пиксель)? wikipedia просто говорит о цветных изображениях для bmp.

Update:

Просто для обновления и информации для будущих посетителей, я собираюсь PGM, так как это несжатое и может поддерживать 16-битный серый цвет -масштаб. Другой вариант - использовать PNG, но он сжимает данные (это не то, что я хочу), как обсуждалось здесь.  Также обратите внимание, что изображение может выглядеть искаженным, так как большинство мониторов поддерживают 256 цветов, а не 4096 для 16 бит. Таким образом, изображение будет насыщенным.

Было удивительно знать, что BMP почти беспомощна в случае Gray-scale для 16-битных изображений.
Спасибо за людей, которые помогли мне понять проблему.

Ответ 1

Для изображений в оттенках серого я использовал бы 8-битный BMP. 8-битные BMP могут кодировать цвета с палитрой. Однако, если вы его не используете, вы можете просто интерпретировать значения цвета [0...255] как цвета от черного (0) до белого (255).

Изменить: Я бы не использовал BMP для 16-битных изображений в оттенках серого. Технически вы можете использовать формат BMP 16 бит на пиксель для кодирования 16-битных градаций серого (http://en.wikipedia.org/wiki/BMP_file_format#Pixel_format). Однако на практике это плохая идея (читай: hacky), так как эта глубина предназначена для кодирования альфа, красного, зеленого и синего образцов пикселей.

Лучшим форматом для хранения 16-разрядных данных в градациях серого является PNG.

Также спросите себя, действительно ли вам нужна эта сверхточность? Для большинства приложений 8 бит на пиксель просто отлично (= если у вас нет конкретных требований к точности, это будет так).

Ответ 2

Вы правы, BMP знает только цвета. Способ сделать это - создать палитру из 256 записей, где каждая запись имеет такое же значение для R, G, B: первая запись (0,0,0), вторая запись (1,1,1) и т.д. Теперь сделайте изображение 8 бит на пиксель с помощью палитры.

Изменить: учитывая ваше новое требование для 16-битных оттенков серого, я думаю, у вас есть 2 варианта: конвертировать в 8 бит или использовать другой формат, отличный от BMP.

Ответ 3

Как видно, TIFF и PNG поддерживают 16-битный оттенки серого.

http://en.wikipedia.org/wiki/Grayscale

Предполагая, что эти изображения, которые вы хотите сохранить, предназначены не только для отображения, но и для какой-либо почтовой обработки, где вам нужна дополнительная точность? Если нет, то я бы предложил удалить наименее значимые 8 бит и сохранить более простую 8-битную растровую карту с цветовой картой для сопоставления каждого значения с RGB со значением → (значение, значение, значение) RGB-сопоставление.

Ответ 4

Что такое формат BMP для изображений в оттенках серого?

Помимо использования палитры, вы можете создать BMP в градациях серого (8 бит на пиксель), написав BMP с помощью BITMAPV4HEADER. и установите bV4RedMask, bV4GreenMask и bV4BlueMask в bV4GreenMask и то же значение. Однако минимальное значение bcBitCount для такого формата равно 16, поэтому каждый пиксель все равно должен занимать два байта. Вы можете использовать второй байт для альфа-канала (прозрачность), хотя.

особенно для 16 бит на пиксель

Похоже, что ни одна версия BMP не поддерживает 16-битную глубину цвета. Хотя формат файла, по-видимому, позволяет это (bcBitCount=16 и bV4…Mask=0xFFFF), редакторы изображений и библиотеки отбрасывают лишние биты.

Некоторые документы ссылаются на файлы BMP 64-BPP, однако неясно, как это будет соответствовать полям BITMAPV4HEADER, поскольку все поля маски имеют размер 32 бита (поэтому невозможно указать маску канала для 64 BPP).

Другой вариант заключался в использовании PNG, но он сжимает данные (а это не то, что мне нужно), как обсуждалось здесь.

Вам не нужно сжимать файлы PNG, если вы не хотите. Используя уровень сжатия 0, вы поместите пиксели такими, какие они есть (плюс верхний/нижний колонтитул zlib).

Также обратите внимание, что изображение может выглядеть искаженным, так как большинство мониторов поддерживают 256 цветов, а не 4096 для 16-битных.

16-битная глубина позволила бы получить 65536 различных значений яркости на канал, а не 4096. Искажение звучит как проблема с гамма-кривой и не имеет отношения к вопросу о формате файла.