21 августа 2014 г.

Описание формата изображения BMP или как он выглядит внутри

Мне нужно было сделать конвертер изображений в код для дисплея от Nokia 5110. Я решил использовать .bmp файлы. Теперь расскажу что я узнал.

.bmp файл это бинарный файл, на Википедии хорошо расписано как он выглядит внутри, какая информация хранится в каждом бите и есть несколько примеров. 

Также удобно использовать какой либо "hex editor" его можно использовать чтобы открыть изображение и увидеть исходный код в 16-ричной системе. У меня такой: "Hex Editor XVI32"



Пример bmp файла (4 пикселя разного цвета):

Сразу скажу что количество байт для записи горизонтальной строки (информация о пикселях), должно быть числом которое без остатка делится на 4, из-за этого иногда может использоваться заполнение (как в этом примере), это ненужная информация куда может быть записано любое значение, которая используется лишь для выравнивания массива пикселей под 4 байта.

Пиксели хранятся в памяти начиная с того который находится в левом нижнем углу и идут по порядку вправо, дойдя до конца строки идёт крайний левый пиксель на 1 строку выше, затем строка на которой он находится и т.д.

Вот как закодировано это изображение:

АдресРазмерHex значениеЗначениеОписание
BMP Header
0h242 4D"BM"ID field (42h, 4Dh)
2h446 00 00 0070 bytes (54+16)Размер BMP файла
6h200 00UnusedApplication specific
8h200 00UnusedApplication specific
Ah436 00 00 0054 bytes (14+40)Адрес по которому находится информация о пикселях
DIB Header
Eh428 00 00 0040 bytesКоличество байтов в DIB header (с этого момента)
12h402 00 00 002 pixels (left to right order)Ширина изображения в пикселях
16h402 00 00 002 pixels (bottom to top order)Высота изображения в пикселях
1Ah201 001 planeNumber of color planes being used
1Ch218 0024 bitsКол-во битов на пиксель
1Eh400 00 00 000BI_RGB, no pixel array compression used
22h410 00 00 0016 bytesКол-во байт для пикселей на 1 горизонтальную строку (вместе с заполнением)
26h413 0B 00 002835 pixels/meter horizontalPrint resolution of the image,
72 DPI × 39.3701 inches per meter yields 2834.6472
2Ah413 0B 00 002835 pixels/meter vertical
2Eh400 00 00 000 colorsNumber of colors in the palette
32h400 00 00 000 important colors0 means all colors are important
Start of pixel array (bitmap data)
36h300 00 FF0 0 255Красный, Пиксель (0,1)
39h3FF FF FF255 255 255Белый, Пиксель (1,1)
3Ch200 000 0Заполнение для выравнивания 4 байта (может быть любое число)
3Eh3FF 00 00255 0 0Синий, Пиксель (0,0)
41h300 FF 000 255 0Зелёный, Пиксель (1,0)
44h200 000 0Заполнение для выравнивания 4 байта (может быть любое число)
Пиксели в изображении могут быть описаны различным количеством бит:

  • 1-бит на пиксель (1bpp), этот формат поддерживает 2 цвета (к примеру чёрный и белый). 0 == цвет левого нижнего пикселя, 1 == второй цвет.
  • 2-бита на пиксель (2bpp), этот формат поддерживает 4 цвета (У меня не получилось сохранить файл в этом формате)
  • 4-бита на пиксель (4bpp), этот формат поддерживает 16 цветов, не понял как он их хранит, в теории файл должен хранить палитру красок, 4-битное число определяет какой цвет из палитры использовать (это используется и в 8, 2, 1 битных форматах)
  • 8-бит на пиксель (8bpp), этот формат поддерживает 256 цветов, может использовать как палитру так и хранить сам цвет (RGB):
Bit     7   6   5   4   3   2   1  0
Data   R  R  R  G  G  G  B  B

  • 16-бит на пиксель (16bpp), этот формат поддерживает 65536 цветов, может хранить альфа-канал (прозрачность).


  • 24-бит на пиксель (24bpp), этот формат поддерживает 16,777,216 цветов, цвет хранится как BGR, синий, зелёный и красный, на каждый цвет 1 байт (8 бит).
  • 32-бита на пиксель (24bpp), этот формат поддерживает 4,294,967,296 цветов, может быть такого вида


О том как хранятся цвета в пикселях указано в битовых масках которые начинаются по адресу 36h (если они есть). Может быть к примеру по 8 бит на цвет (RGB) и 8 бит на альфа-канал.

Источник:
wikipedia

Комментариев нет :

Отправить комментарий