Формат DIB (device independent bitmap) содержит таблицу цветов, которая содержит информацию о преобразовании пикселей в RGB формат. Фактически, данный формат не является объектом GDI, однако является очень удобной формой для хранения и передачи изображения между программами и компьютерами. Каждому пользователю компьютера известен этот формат – это не что иное, как файл с расширением *.bmp. Приведем описание формата этого файла.
Файл *.bmp начинается с секции заголовка, определенной структурой BITMAPFILEHEADER. Эта структура имеет пять полей:
Поле
| Размер
| Описание
|
bfType
| WORD
| Байты «ВМ» для битовых образов
|
bfSize
| DWORD
| Общий размер файла
|
bfReserved1
| WORD
| Установлено в 0
|
bfReserved2
| WORD
| Установлено в 0
|
bfOffBits
| DWORD
| Смещение битового образа от начала файла
|
За этой информацией следует другой заголовок, определенный структурой BITMAPINFOHEADER. Структура имеет 11 полей.
Поле
| Размер
| Описание
|
biSize
| DWORD
| Размер структуры в байтах
|
biWidth
| LONG
| Ширина битового образа в пикселях
|
biHaight
| LONG
| Высота битового образа в пикселях
|
biPlanes
| WORD
| Установлено в 1
|
biBitCount
| WORD
| Число битов цвета на пиксель (1,4,8,24)
|
biCompression
| DWORD
| Схема компрессии (если нет – 0)
|
biSizeImage
| DWORD
| Размер битов битового образа в байтах (нужен только при компрессии)
|
biXPelsPerMeter
| LONG
| Разрешение в пикселях на метр по горизонтали
|
biYPelsPerMeter
| LONG
| Разрешение в пикселях на метр по вертикали
|
biClrUsed
| DWORD
| Число цветов, используемых в изображении
|
biClrImportant
| DWORD
| Число важных цветов в изображении
|
Приведенная структура может иметь различный размер, определяемый полем biSize. Первые 5 параметров являются обязательными. Остальные могут присутствовать в файле, могут и нет. Кроме этого, пользователь может добавлять свои оригинальные записи в конец структуры. Если biClrUsed установлено в ноль и число битов на пиксель равно 1,4,8, то сразу за данной структурой следует таблица цветов, состоящая из двух или более структур RGBQUAD (при 1 – две, при 4 – шестнадцать, и т.д. ), каждая из которых определяет значение цвета:
Поле
| Размер
| Описание
|
rgbBlue
| BYTE
| Интенсивность голубого
|
rgbGreen
| BYTE
| Интенсивность зеленого
|
rgbRed
| BYTE
| Интенсивность красного
|
rgbReserved
| BYTE
| Равно 0
|
Число структур RGBQUAD может быть напрямую задано в поле biClrUsed.
За таблицей цветов следует массив битов, определяющих битовый образ. Этот массив начинается с нижней строки пикселей. Каждая строка начинается с левого пикселя. Каждый пиксель представлен 1, 4, 8 или 24 битами. Во-первых трех случаях число, записанное в битовом образе определяет номер RGBQUAD- структуры в таблице цветов. В случае 24-х бит – это, фактически, и есть 3 байта RGB-представления цвета. В последнем случае таблица цветов может отсутствовать.
Для вывода битовых образов, не зависящих от устройства, существует несколько функции GDI. Первая из них позволяет копировать битовый образ в контекст устройства:
int SetDIBitsToDevice(
HDC hdc,// указатель на контекст устройства
int XDest,// x-координата верхнего левого угла
int YDest,// y-координата верхнего левого угла
DWORDdwWidth,// ширина выводимого изображения
DWORD dwHeight,// высота выводимого изображения
int XSrc,// x-координата отступа в изображении
int YSrc,// y-координата отступа на контексте
UINT uStartScan,// первая сканируемая линия изображения
UINT cScanLines,// число сканируемых линий
CONST VOID *lpvBits,// адрес битового образа
CONST BITMAPINFO *lpbmi,//адрес структуры BITMAPINFO
UINT fuColorUse // признак RGB или палитры
);
Следует заметить, что в функции используется структура BITMAPINFO, а не присутствующая в файле BITMAPINFOHEADER, которая определена в Windows как:
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader; // Уже знакомая нам структура
RGBQUAD bmiColors[1]; // Таблица цветов
} BITMAPINFO;
Рассмотренная функция производит копирование битов в выбранный контекст. Другая функция, позволяет при этом масштабировать выводимое изображение, т.е. автоматически изменяет размер картинки до размеров области вывода:
int StretchDIBits(
HDC hdc,// указатель на контекст устройства
int XDest,// x-координата верхнего левого угла в контексте
int YDest,// y-координата верхнего левого угла в контексте
int nDestWidth,// ширина выводимого изображения в контексте
int nDestHeight,// высота выводимого изображения в контексте
int XSrc,//x-координата верхнего левого угла выводимой части изображения
int YSrc,//у-координата верхнего левого угла выводимой части изображенияint nSrcWidth,// ширина выводимого изображения в битовом образе
int nSrcHeight,//высота выводимого изображения в битовом образе
CONST VOID *lpBits,// адрес битового образа
CONST BITMAPINFO *lpBitsInfo,// адрес структуры BITMAPINFO
UINT iUsage,// флаг использования цвета
DWORD dwRop // растровая операция
);
Флаг использования цвета определяет, есть ли в структуре BITMAPINFO таблица палитры (значение флага - DIB_PAL_COLORS) или в битовом образе содержится полная информация о цвете (DIB_RGB_COLORS). Последний параметр функции определяет код растровой операции. Наиболее часто используемые из них:
BLACKNESS Заполняет выбранную область приемника черным цветом
DSTINVERT Инвертирует выбранную область приемника
NOTSRCCOPY Копирует изображение с инверсией.
SRCCOPY Копирует изображение
WHITENESS Заполняет выбранную область приемника белым цветом