Структура BMP файла

Ниже приведена таблица, показывающая назначение полей структуры BMP файла.

СмещениеДлина поляОписание поля (что тут находится)
Заголовок файла
02Код 4D42h — Буквы ‘BM’
24Размер файла в байтах
620 (Резервное поле)
820 (Резервное поле)
104Смещение, с которого начинается само    изображение (растр).
Заголовок BITMAP (Информация об изображении)
144Размер заголовка BITMAP (в байтах) равно 40
184Ширина изображения в пикселях
224Высота изображения в пикселях
262Число плоскостей, должно быть 1
282Бит/пиксел: 1, 4, 8 или 24
304Тип сжатия
3440 или размер сжатого изображения в байтах.
384Горизонтальное разрешение, пиксел/м
424Вертикальное разрешение, пиксел/м
464Количество используемых цветов
504Количество «важных» цветов.
Палитра (Карта цветов для N цветов), если используется
544*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).