Ниже приведена таблица, показывающая назначение полей структуры BMP файла.
Смещение | Длина поля | Описание поля (что тут находится) |
Заголовок файла | ||
0 | 2 | Код 4D42h — Буквы ‘BM’ |
2 | 4 | Размер файла в байтах |
6 | 2 | 0 (Резервное поле) |
8 | 2 | 0 (Резервное поле) |
10 | 4 | Смещение, с которого начинается само изображение (растр). |
Заголовок BITMAP (Информация об изображении) | ||
14 | 4 | Размер заголовка BITMAP (в байтах) равно 40 |
18 | 4 | Ширина изображения в пикселях |
22 | 4 | Высота изображения в пикселях |
26 | 2 | Число плоскостей, должно быть 1 |
28 | 2 | Бит/пиксел: 1, 4, 8 или 24 |
30 | 4 | Тип сжатия |
34 | 4 | 0 или размер сжатого изображения в байтах. |
38 | 4 | Горизонтальное разрешение, пиксел/м |
42 | 4 | Вертикальное разрешение, пиксел/м |
46 | 4 | Количество используемых цветов |
50 | 4 | Количество «важных» цветов. |
Палитра (Карта цветов для N цветов), если используется | ||
54 | 4*N | Палитра |
Элемент палитры представляет собой четырёхбайтовую запись (структуру). В этой структуре хранятся составляющие R-красного, G-зеленого и B-синего цветов. Один байт зарезервирован. Палитра может и не использоваться, например в True Color.
Структура элемента палитры:
typedef struct tagRGBQUAD
{
char rgbBlue;
char rgbGreen;
char rgbRed;
char rgbReserved;
} RGBQUAD;
В поле тип сжатия должно стоять 0 — сжатие не используется, 1 — RLE8 сжатие, 2 — RLE4 сжатие. RLE8 — используется для сжатия 256-ти цветного изображения, RLE4 — используется для сжатия 16-ти цветного изображения.
В поле по смещению 28 (Бит/пиксел) должно стоять 1 — черно-белое изображение, 4 — 16-ти цветное, 8 — 256-ти цветное, 24 — True Color
typedef unsigned long DWORD; // Двойное слово — 32 бита (разряда)
typedef unsigned int WORD; // Слово — 16 бит (разрядов)
typedef signed long LONG;
typedef unsigned int UINT;
// Заголовок файла
typedef struct tagBITMAPFILEHEADER
{
UINT bfType; // ‘BM’ = 4D42h
DWORD bfSize;
UINT bfReserved1;
UINT bfReserved2;
DWORD bfOffBits; // Смещение к растру
} BITMAPFILEHEADER;
// Заголовок Bitmap
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;
ВАЖНО!
Изображение сохраняется построчно СНИЗУ-ВВЕРХ. Для хранения каждой строки выделяется кратное 4 количество байт. В незначащих байтах хранится мусор.
Старшему биту или тетраде соответствует самый левый пиксел. При хранении изображения True Color каждому пикселу соответствуют три последовательные байта, хранящие составляющие цвета B, G, R; (не R, G, B).