BITMAPINFO
BITMAPFILEHEADER
BITMAPINFO
BITMAPINFOHEADER
RGBQUAD
Как видите структура BITMAPINFO - это просто набор двух структур. Она объявлена в файле wingdi.h,
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO, FAR *LPBITMAPINFO, *PBITMAPINFO;
Итак, первая структура у нас это 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 - размер структуры в байтах и должен быть равен 40 байтам.
- biWidth & biHeight - содержат высоту и ширину растра в байтах.
- biPlanes - смысл непонятен, так как здесь всегда 1.
- biBitCount - число битов на пиксель может быть разное и зависит от типа палитры. Могут быть числа 1,2,4,8,24
- biCompression - алгоритм сжатия, вот значения:
0 нет
1 RLE-8
2 RLE-4 - biSizeImage - размер растра в байтах и бывает нужно только для сжатых растров.
- biXPelsPerMeter & biYPelsPerMeter - показывают сколько пикселей на метр, обычно 0 ;-)
- biClrUsed & biClrImportant - количество используемых цветов и количество значимых цветов. Обычно 0 :-)
Следующая структура - это RGBQUAD описанная в файле wingdi.h. Это не одна структура, а набор структур, которые представляют из себя паритру.
typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
Кто знаком с понятием цветов, то это набор цветов RGB, то есть интенсивности составляющей красной, зеленой и синей. Количество структур зависит от типа растра. Если растр на 256 цветов, то и структур будет 256. Цветовая таблица вообще отсутсвует в растрах с 24 битным изображением Hi Color.
Теперь давайте вспомним наш код в шагах. Прочитав первую заголовочную структуру мы присваиваем два одинаковых указателя.
lpInfo=(LPBITMAPINFO)ptrBmp;
lpHeader=(LPBITMAPINFOHEADER)ptrBmp;
lpRGB = (RGBQUAD*)(ptrBmp+lpHeader->biSize);
Ну и правильно, так как BITMAPINFO и BITMAPINFOHEADER начинаются с одного места и только начало структуры RGBQUAD необходимо вычислить.