Формат файлов растровой графики 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 и т.д.