Мне нужно было сделать конвертер изображений в код для дисплея от Nokia 5110. Я решил использовать .bmp файлы. Теперь расскажу что я узнал.
.bmp файл это бинарный файл, на Википедии хорошо расписано как он выглядит внутри, какая информация хранится в каждом бите и есть несколько примеров.
Также удобно использовать какой либо "hex editor" его можно использовать чтобы открыть изображение и увидеть исходный код в 16-ричной системе. У меня такой: "Hex Editor XVI32"
Пример bmp файла (4 пикселя разного цвета):
Сразу скажу что количество байт для записи горизонтальной строки (информация о пикселях), должно быть числом которое без остатка делится на 4, из-за этого иногда может использоваться заполнение (как в этом примере), это ненужная информация куда может быть записано любое значение, которая используется лишь для выравнивания массива пикселей под 4 байта.
Пиксели хранятся в памяти начиная с того который находится в левом нижнем углу и идут по порядку вправо, дойдя до конца строки идёт крайний левый пиксель на 1 строку выше, затем строка на которой он находится и т.д.
Вот как закодировано это изображение:
Адрес | Размер | Hex значение | Значение | Описание |
---|---|---|---|---|
BMP Header | ||||
0h | 2 | 42 4D | "BM" | ID field (42h, 4Dh) |
2h | 4 | 46 00 00 00 | 70 bytes (54+16) | Размер BMP файла |
6h | 2 | 00 00 | Unused | Application specific |
8h | 2 | 00 00 | Unused | Application specific |
Ah | 4 | 36 00 00 00 | 54 bytes (14+40) | Адрес по которому находится информация о пикселях |
DIB Header | ||||
Eh | 4 | 28 00 00 00 | 40 bytes | Количество байтов в DIB header (с этого момента) |
12h | 4 | 02 00 00 00 | 2 pixels (left to right order) | Ширина изображения в пикселях |
16h | 4 | 02 00 00 00 | 2 pixels (bottom to top order) | Высота изображения в пикселях |
1Ah | 2 | 01 00 | 1 plane | Number of color planes being used |
1Ch | 2 | 18 00 | 24 bits | Кол-во битов на пиксель |
1Eh | 4 | 00 00 00 00 | 0 | BI_RGB, no pixel array compression used |
22h | 4 | 10 00 00 00 | 16 bytes | Кол-во байт для пикселей на 1 горизонтальную строку (вместе с заполнением) |
26h | 4 | 13 0B 00 00 | 2835 pixels/meter horizontal | Print resolution of the image, 72 DPI × 39.3701 inches per meter yields 2834.6472 |
2Ah | 4 | 13 0B 00 00 | 2835 pixels/meter vertical | |
2Eh | 4 | 00 00 00 00 | 0 colors | Number of colors in the palette |
32h | 4 | 00 00 00 00 | 0 important colors | 0 means all colors are important |
Start of pixel array (bitmap data) | ||||
36h | 3 | 00 00 FF | 0 0 255 | Красный, Пиксель (0,1) |
39h | 3 | FF FF FF | 255 255 255 | Белый, Пиксель (1,1) |
3Ch | 2 | 00 00 | 0 0 | Заполнение для выравнивания 4 байта (может быть любое число) |
3Eh | 3 | FF 00 00 | 255 0 0 | Синий, Пиксель (0,0) |
41h | 3 | 00 FF 00 | 0 255 0 | Зелёный, Пиксель (1,0) |
44h | 2 | 00 00 | 0 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
Комментариев нет :
Отправить комментарий