Описание формата BMP для Window 3.0 (DIB)

Основным отличием файлов нового формата (DIB) - Device Independent Bitmap (аппаратно-независимый битовый образ) является то, что в них используется кодировка цветов с одной битовой плоскостью.

Файлы битовых образов нового формата начинаются со структуры BITMAPFILEHEADER:

typedef struct tagBITMAPFILEHEADER
{
word bfType; // тип файла (для битового образа - BM)
dword bfSize; // размер файла в dword
word bfReserved1; // не используется
word bfReserved2; // не используется
dword bfOffbits; //смещение данных битового образа от заголовка в байтах
}

Непосредственно за ней располагается структура BITMAPINFO, содержащая всю информацию о битовом образе. Она делится на две части: структуру BITMAPINFOHEADER, описывающей размеры и цветовой формат битового образа, и массив структур RGBQUAD, определяющей цветовую палитру:

typedef struct tagBITMAPINFO
{
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
}

typedef struct tagBITMAPINFOHEADER
{
dword biSize; //число байт, занимаемых структурой BITMAPINFOHEADER
dword biWidth; //ширина битового образа в пикселах
dword biHeight; //высота битового образа в пикселах
word biPlanes; //число битовых плоскостей устройства
word biBitCount; //число битов на пиксель
dword biCompression; //тип сжатия
dword biSizeImage; //размер картинки в байтах
dword biXPelsPerMeter;//горизонтальное разрешение устройства, пиксел/м
dword biYPelPerMeter; //вертикальное разрешение устройства, пиксел/м
dword biClrUsed; //число используемых цветов
dword biClrImportant; //число "важных" цветов
} BITMAPINFOHEADER;

Более подробно о структуре BITMAPINFOHEADER:

    biSize - обычно используется для облегчения доступа к таблице цветов.

    biPlanes - определяет число битовых плоскостей; однако, поскольку цвет кодируется последовательными битами, это число всегда равно 1.

    biBitCount - этим полем определяется число цветов, используемых битовым образом. В зависимости от способа кодирования, может принимать значения:

      1 - битовый образ монохромный, и таблица цветов должна содер- жать два элемента. Каждый бит в массиве данных кодирует один пиксел. Если значение бита - 0, то пиксел становится первым цветом таблицы; если - 1, пиксел становится вторым цветом таблицы.
      4 - битовый образ имеет максимум 16 цветов, и массив bmiColors (таблица цветов) имеет до 16 элементов. Цвет каждого пиксела оп- ределяется по таблице цветов при помощи четырехбитного индекса. Например, если первый байт данных имеет значение 3Ah, то при отображении битового образа цвет первого пиксела определяет четвертый элемент таблицы цветов, а цвет второго - одиннадцатый.
      8 - битовый образ имеет максимум 256 цветов, и таблица цветов имеет до 256 элементов. Каждый байт массива данных определяет цвет одного пиксела.
      24 - битовый образ имеет максимум 2 в 24-й степени цветов. Таблица цветов пуста, а цвет пикселов определяется пакетами из трех байтов, описывающими цветовые интенсивности красного, зеле- ного и голубого цветов.

    biCompression - тип сжатия. Может принимать значения: BI_RGB - сжатие отсутствует; BI_RLE8 - сжатие для формата 8 бит на пиксел; BI_RLE4 - сжатие для формата 4 бита на пиксел.

    biXPelsPerMeter и biYPelsPerMeter - могут использоваться для выбора из списка ресурсов пиктограммы, наиболее подходящей для данного устройства.

    biClrUsed - число цветов, используемых данныи битовым образом. Если 0, то используются все цвета палитры (указанные в массиве bmiColors).

    biClrImportant - используется для управления алгоритмом отображения цветов. Так, если четыре различных приложения отображают на экране по одному битовому образу с 75 цветами каждый, то адаптер, выводящий 256 цветов одновременно, не сможет полностью аутентично отобразить на экране все 4 картинки. В этом случае используется механизм замены цветов - ищется битовый образ с наименьшим приоритетом и его "лишние" цвета заменяются наиболее подходящими.

typedef struct tagRGBQUAD
{
byte rgbRed; //интенсивность красного
byte rgbGreen; //интенсивность зеленого
byte rgbBlue; //интенсивность голубого
byte rgbRserved; //не используется
} RGBQUAD;

После того, как все параметры битового образа определены, в файле идут сами скан-строки битовой плоскости, причем первой скан-строкой в формате DIB считается нижняя скан-строка (т.е. начало координат находится в левом нижнем углу изображения).
Скан-строки выровнены по 32-битной границе - dword !!!

Вернуться к списку графических форматов