Ниже
приведена таблица, показывающая
назначение полей структуры 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).
|