На рисунке показана яркость пикселя bij принадлежащего матрице изображения В, используется как индекс при обращении к массиву структур RGBQUAD, хранящемуся в заголовке файла BMP и содержащему интенсивности цветов красного, зеленого и синего, представленные числовыми значениями в диапазоне 0÷255. Выбранный элемент массива с номером п представляет собой 32-битное слово, адресуемое к 16-106 цветовым оттенкам в формате RGB (256 градаций на каждую из трех составляющих, четвертый байт не используется). Далее графический драйвер Windows преобразует структуру RGBQUAD в величину, соответствующую установленному на компьютере видеорежиму. Например, в 8-битное слово для 256-цветового режима, 16-битное слово для режима High Color и т.п. Полученное значение непосредственно заносится в видеопамять и отображается на мониторе.
Файлы в формате BMP задаются с расширением ".bmp" и имеют следующую структуру. В начале файла содержится структура заголовка BITMAPFILEHEADER.
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef struct {
WORD bfType; // Тип файла (ASCII строка - "BM")
DWORD bfSize; // Размер файла в байтах
WORD bfReservedl; //Не используется
WORD bfReserved2; // Не используется
DWORD bfOffbits; //Смещение в байтах
// до начала изображения в файле
} BITMAPFILEHEADER;
Непосредственно за ней располагается структура BITMAPINFO, содержащая всю информацию об изображении. Она делится на две части: структуру BITMAPINFOHEADER, описывающую размеры и цветовой формат изображения, и массив структур RGBQUAD, определяющих цветовую палитру:
typedef struct {
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[N]; // N- количество элементов
// в таблице цветов, обычно 2, 16 или 256
} BITMAPINFO;
typedef struct { DWORD biSize; // Число байт, занимаемых структурой
// BITMAPINFOHEADER (40 байт)
DWORD biWidth; // Ширина изображения в пикселях
DWORD biHeight; // Высота изображения в пикселях
WORD biPlanes; // Число битовых плоскостей устройства, должно быть 1
WORD biBitCount; // Число бит на пиксель 1, 4, 8, 24
DWORD biCompression; // Тип сжатия
DWORD biSizelmage; // Размер сжатого изображения в байтах или ноль
DWORD biXPelsPerMeter; // Горизонтальное разрешение
// изображения, пиксель/метр
DWORD biYPelPerMeter; // Вертикальное разрешение изображения,
// пиксель/метр
DWORD biClrUsed; // Число используемых цветов DWORD biClrlmportant; // Число "важных" цветов
} BITMAPINFOHEADER;
Более подробно:
biSize - обычно используется для облегчения доступа к таблице цветов.
BiPlanes - определяет число битовых плоскостей; однако, поскольку цвет кодируется последовательными битами, это число всегда равно 1.
BiBitCount - этим полем определяется число цветов для кодирования изображения.
В зависимости от способа кодирования данная величина может принимать значения:
1-битовый образ изображения монохромный, т.е. изображение представлено всего двумя цветами, и каждый пиксель изображения задается всего одним битом. Таблица цветов
в этом случае содержит всего два элемента 0 и 1. Если значение пикселя 0, то ему присваивается первый цвет таблицы, если 1, то пикселю присваивается второй цвет таблицы.
4-битовый образ изображения полутоновой, то есть изображение содержит максимум 16 цветов, а каждый пиксель кодируется четырьмя битами. Массив bmiColors имеет 16 элементов (N=16). Цвет каждого пикселя задается по таблице цветов при помощи четырехбитного индекса. Например,
если первый байт изображения, состоящий из двух пикселей, имеет шестнадцатеричное значение 0x3А, то при отображении на мониторе цвет первого пикселя определяет четвертый элемент таблицы, а цвет второго -одиннадцатый.
8-битовый образ изображения имеет максимум 256 цветов, и каждый пиксель кодируется одним байтом. Таблица цветов содержит 256 значений, т.е. каждой яркости пикселя соответствует свой цвет из таблицы.
24-битовый образ задает истинные цвета (TrueColor) изображения, всего порядка 16*106. Каждый пиксель задается пакетом из трех байт, поэтому таблица цветов отсутствует, и яркость пикселя определяется значением его компонентов, то есть интенсивностями красного, зеленого и синего цветов.
biCompression - тип сжатия. Может принимать значения: BIRGB - сжатие отсутствует; BI_RLE8 - сжатие для формата 8 бит на пиксель; BI_RLE4 - сжатие для формата 4 бита на пиксель.
biXPelsPerMeter и biYPelsPerMeter - могут использоваться для выбора из списка ресурсов пиктограммы, наиболее подходящей для данного
устройства.
biClrUsed - число цветов, используемых данным битовым образом. Если О, то используются все цвета палитры (указанные в массиве bmiColors).
biClrlmportant - используется для управления алгоритмом отображения цветов. Так, если четыре различных приложения отображают на экране по одному битовому образу с 75 цветами каждый, то адаптер, выводящий 256 цветов одновременно, не сможет полностью аутентично отобразить на экране все 4 картинки. В этом случае используется механизм замены цветов - ищется битовый образ с наименьшим приоритетом и его "лишние" цвета заменяются наиболее подходящими.