Битовые изображения в формате DIB
Изображения DIB, в отличие от изображений DDB, являются аппаратно-независимыми, поэтому без дополнительного преобразования их нельзя отображать на экране с помощью функций BitBlt и StretchBlt. В операционной системе Windows битовые изображения хранятся в файлах с расширением имени bmp, при этом используется аппаратно-независимый формат DIB.
Формат bmp-файлов представлен на рис. 3.1
Рис. 3.1
Файл, содержащий битовое изображение, начинается со структуры BITMAPFILEHEADER. Эта структура описывает тип файла и его размер, а также смещение области битов изображения.
typedef struct tagBITMAPFILEHEADER {
WORD bfType; // Признак BMP – файла, 42 4D (коды букв ВМ)
DWORD bfSize; // Размер файла
WORD bfReserved1; // Первое резервное поле - всегда ноль.
WORD bfReserved2; // Второе резервное поле - тоже ноль
DWORD bfOffBits; // Смещение от начала файла до первого
// байта графических данных
} BITMAPFILEHEADER, *PBITMAPFILEHEADER;
Сразу после структуры BITMAPFILEHEADER в файле следует структура BITMAPINFO, которая содержит описание изображения и таблицу цветов.
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader;
RGBQUADbmiColors[1];
} BITMAPINFO, *PBITMAPINFO;
Описание изображения (размеры изображения, метод компрессии, размер таблицы цветов и т. д.) находится в структуре BITMAPINFOHEADER.
typedef struct tagBITMAPINFOHEADER{
DWORD biSize; // Размер BITMAPINFOHEADER в байтах.
LONG biWidth; // Ширина картинки в пикселах
LONG biHeight; // Высота картинки в пикселах
WORD biPlanes; // Количество битовых плоскостей (=1, см. MSDN)
WORD biBitCount; // Количество бит на пиксел (определяет
// Mаксимальное число цветов в bitmap)
DWORD biCompression; // Cпособ сжатия (0 - данные не сжимаются).
DWORD biSizeImage; // Размер изображения в байтах (без заголовков)
LONG biXPelsPerMeter; // Число пикселов на метр по горизонтали
LONG biYPelsPerMeter; // Число пикселов на метр по вертикали
DWORD biClrUsed; // Количество элементов палитры, хранящихся
// после заголовка
DWORD biClrImportant; // Количество разных цветов, действительно
// используемых в рисунке.
} BITMAPINFOHEADER, *PBITMAPINFOHEADER;
В некоторых случаях (не всегда) в файле может присутствовать палитр а –таблица цветов (как массив структур RGBQUAD), присутствующих в изображении.
typedef struct tagRGBQUAD
{
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
Палитра отсутствует, если число бит на пиксел равно 24. Также палитра не нужна и для некоторых цветовых форматов 16 и 32 бит на пиксел.
После палитры (если она есть) в файле BMP записывается растр в виде битового (а точнее, байтового массива). В битовом массиве последовательно записываются байты строк растра. Количество байт в строке должно быть кратно четырем, поэтому если количество пикселов по горизонтали не соответствует такому условию, то справа в каждую строку дописывается некоторое число битов (выравнивание строк на границу двойного слова).
Точное значение смещения битов изображения находится в структуре BITMAPFILEHEADER.