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

Добавил: admin
Дата добавления: 25-01-2011

Комментарии: