Формат файлов растровой графики Bitmap
В этой статье мы рассмотрим формат, структуры и поля Bitmap файлов, а также методы обработки и работы с ними. Эта информация будет полезна для начинающих программистов при написании разнообразных собственных программ работы с графикой. Итак, начнём…
Все BMP-файлы хранятся в формате независимом от графического устройства (DIB-формат).
Структурно файл растрового изображения в формате BMP состоит минимум из трёх, и максимум из
четырёх блоков. Первая часть файла - это заголовок файла, описываемый структурой
BITMAPFILEHEADER, размер которой 14 байт и предназначенной для идентификации файла как
растрового графического изображения и хранения общей информации о нём.
typedef struct tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER,
*PBITMAPFILEHEADER;
bfType – должен содержать два ASCII-символа: "BM", которые разумеется обозначают bitmap.
Соответствующие шестнадцатеричному значению равному 0x424D. При других значения этого поля
файл не является растровым изображение, принятым в Microsoft Windows.BfSize – равен размеру файла в байтах. Его можно использовать для определения целостности файла, а также для выделения нужно количества памяти под весь файл. Значение bfSize не является размером самого растрового изображения в памяти.
BfReserved1 – не документировано и не используется. Должно быть равно нулю.
BfReserved2 – не документировано и не используется. Должно быть равно нулю.
BfOffBits – указывает байтовое смещение до начала растрового изображения. Используется для определения местонахождения массива aBitmapBits в файле.
Второй блок размером в 40 байт содержит информацию о характеристиках самого растрового
изображения и описывается структурой BITMAPINFOHEADER.
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, FAR *LPBITMAPINFOHEADER,
*PBITMAPINFOHEADER;
biSize – содержит собственный размер структуры BITMAPINFOHEADER в байтах. Это значение должно
быть равно 0x28.biWidth – содержит ширину изображения в пикселях.
biHeight – содержит высоту изображения в пикселях.
Biplanes – должен быть равен единице, так как BMP-файлы, какого бы они типа не были, хранятся в независимом от устройства формате с одной цветовой плоскостью.
biBitCount – содержит число бит на пиксел. Должно иметь значение 1,4, 8 или 24. Обычно используется в конъюнкции с biClrUsed и biClrImportant.
BiCompression – показывает, храниться ли данное изображение в сжатом или не сжатом виде, а также указывает метод его упаковки.
BiSizeImage – содержит размер растрового изображения в байтах. Может быть нулевым, если изображение не сжато.
BiXPelsPerMeter – указывает предпочтительное разрешение по горизонтали в пикселах на метр.
BiYPelsPerMeter – указывает предпочтительное разрешение по вертикали в пикселах на метр.
BiClrUsed – обычно содержит число цветов, используемое в растровом изображении и определяемое массивом bmiColors типа RGBQUAD. Если этот параметр равен нулю, как это обычно и бывает, в изображении используется максимальное количество цветов, возможное для изображения данного типа.
BiClrImportant – содержит число важных цветов изображения. Если этот параметр равен нулю, то все цвета в изображении считаются важными.
За структурой BITMAPINFOHEADER следует массив структур RGBQUAD. Структуры RGBQUAD определяют RGB значения интенсивности для каждого из цветов в палитре устройства. В двадцатичетырёхбитных изображениях массив структур RGBQUAD является цветовым массивом и палитра отсутствует. А также в структурах RGBQUAD может отсутствовать последняя запись - rgbReserved. В монохромных, четырёх и восьмибитных растровых изображения массив структур RGBQUAD является палитрой, а значение каждого пиксела индексам в этом массиве.
typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
typedef RGBQUAD FAR* LPRGBQUAD;
rgbBlue – содержит интенсивность синего цвета. Допустимые значения от 0 до 255.rgbGreen – содержит интенсивность зелёного цвета. Допустимые значения от 0 до 255.
rgbRed - содержит интенсивность красного цвета. Допустимые значения от 0 до 255.
rgbReserved – не используется. Должно быть нулю.
Также Bitmap можно описать структурой BITMAPINFO. Она включает в себя структуру BITMAPINFOHEADER и массив структур RGBQUAD.
typedef struct tagBITMAPINFO { // bmi
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO;
Цветовой массив содержит информацию о цвете и состоит из элементов размер которых указан в параметре biBitCount. Например, для монохромных растровых изображений размер элемента будет равен одному биту, а значит, структур RGBQUAD может быть только две. В каждом элементе содержаться индекс в массиве структур RGBQUAD.
Вывод на экран массива цветов производиться снизу вверх и начинается с левого нижнего угла изображения. Однако двадцати четырехбитных изображения выводятся в верхнего левого угла сверху вниз.
В заключении хотелось бы отметить, что в Microsoft Windows растровые изображения используются практический везде. В ресурсах приложений, в контексте устройства(DC) и т.д. растровые изображения хранятся без заголовка файла Bitmap, то есть без структуры BITMAPFILEHEADER. А также в Win32 API присутствует большое количество функций для работы с битматами, такие как CreateBitmap, CreateCompatibleBitmap, CreateDIBitmap и т.д.