Формат 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 Заполняет выбранную область приемника белым цветом