Заголовок изображения: BITMAPINFOHEADER



 

Как уже говорилось, вторая часть, характеризующая формат изображения, представляет собой 40-байтную структуру BITMAPINFOHEADER:

 

typedef struct tagBITMAPINFOHEADER { /* bmih */

DWORD biSize;

LONG biWidth;

LONG biHeight;

WORD biPlanes;

WORD biBitCount;

DWORD biCompression;

DWORD biSizeImage;

LONG biXPelsPerMeter;

LONG biYPelsPerMeter;

DWORD biClrUsed;

DWORD biClrImportant;

} BITMAPINFOHEADER;

 

Элементы структуры BITMAPINFOHEADER имеют следующие значения:

 

BiSize Число байт в структуре BITMAPINFOHEADER. Оно должно равняться 40 (или 0x00000028 шестнадцатеричное).
BiWidth Ширина изображения в пикселах.
BiHeight Высота изображения в пикселах.
BiPlanes Количество цветовых плоскостей. Этот элемент должен равняться 1, поскольку в независимом от устройства DIB формате данные имеют одну цветовую плоскость.
BiBitCount Количество бит, приходящихся на один пиксел. Этот элемент может иметь одно из следующих значений: 1, 4, 8 или 24.
BiCompression Определяет тип сжатия изображения.
BiSizeImage Размер изображения в байтах. Может равняться нулю, если изображение не сжато.
BiXPelsPerMeter Указывает предпочтительное горизонтальное разрешение в пикселах на метр. Приложение может использовать это значение для выбора такой разрешающей способности устройства, при которой изображение на экране выглядит лучше всего. На практике это значение используется редко.
BiYPelsPerMeter Указывает предпочтительное вертикальное разрешение в пикселах на метр. Аналогично предыдущему элементу.
BiClrUsed Число индексов в таблице цветов, которая фактически используется изображением. Если это значение равно нулю, используется максимальное для данного biBitCount количество цветов.
BiClrImportant Количество важных цветов изображения. Этот параметр определяет, сколько цветов должны отображаться на экране с максимально возможной точностью. Пикселы с другими цветами могут быть искажены. Если его значение - нуль, важны все цвета. Для 24-битных изображений этот и предыдущий элементы не имеют смысла.

Таблица цветов

 

Третья часть bmp-файла (которая может отсутствовать) содержит палитру – таблицу цветов, используемых в изображении. Таблица цветов, представляет собой массив 4-байтных структур RGBQUAD:

 

typedef struct tagRGBQUAD { /* rgbq */

BYTE rgbBlue;

BYTE rgbGreen;

BYTE rgbRed;

BYTE rgbReserved;

} RGBQUAD;

 

Первые три байта структуры RGBQUAD представляет относительную интенсивность синего, зеленого, и красного компонент цвета. Порядок следования компонент – BGR, обратный привычному RGB. Четвертый байт не используется и служит для выравнивания на границу слова (32 бита).

Массив содержит столько элементов, сколько цветов имеется в изображении, а именно, столько, сколько указано в элементе BiClrUsed заголовка изображения. Для изображений с 24-битными цветами, палитра отсутствует, потому что в таких изображениях каждый пиксель представляется значениями интенсивностей красной, зеленой и синей компонент (RGB) в области данных.

 

 

Данные изображения

 

Четвертая часть файла – это массив пикселей изображения, записанных построчно. Пиксели в каждой строке записываются слева направо, а строки изображения сохраняются снизу вверх. Это значит, что первый байт в массиве представляет пиксель в нижнем левом углу изображения и последний байт - в верхнем правом углу.

Число байт строки развертки, зависит от цветового формата и ширины изображения в пикселях. В случае необходимости, строка развертки должна дополняться нулями, чтобы заканчиваться на границе слова (т.е. длина строки должна быть кратна 4 байтам).

Элемент biBitCount (количество бит на пиксель) заголовка изображения определяет формат представления цвета пикселей, и может иметь следующие значения:

 

1 Двухцветное изображение. Таблица цветов содержит два элемента. Каждый бит в массиве данных изображения представляет пиксель. Если бит равен нулю, пиксель отображается цветом первого элемента цветовой таблицы. Если бит равен единице, пиксель имеет цвет второго элемента таблицы.
4 Изображение имеет не более 16 цветов. Для представления одного пикселя в массиве данных изображения используется 4 бита (полбайта). Например, байт изображения 0x1F представляет два пикселя. Первый пиксель имеет цвет первого элемента таблицы (старший полубайт), а второй пиксель имеет цвет пятнадцатого элемента таблицы (младший полубайт). (Элементы таблицы цветов нумеруются, начиная с  нуля).
8 Изображение имеет не более 256 цветов. Для представления одного пикселя в массиве данных изображения используется 8 бит (байта). Например, байт изображения 0x1F представляет пиксель, который имеет цвет тридцать первого элемента таблицы (0x1F=31).
24 Изображение имеет до 224 цветов. Последовательность каждых 3 байт в массиве данных изображения представляет относительную интенсивность синего, зеленого и красного компонент цвета пикселя. (Порядок обратный привычному - синий первый).

Сжатие данных изображения

 

Начиная с версии 3.0, WINDOWS допускает сжатие растровых изображений в файлах .bmp, с использованием достаточно простого метода группового кодирования (RLE - run-length encoded). Сжатие применяется для форматов с восемью или четырьмя битами на пиксель, т.е. для 256-ти и 16-цветных изображений. Двухцветные и полноцветные (true color) изображения не могут быть сжаты в этом формате.

Элемент biCompression заголовка изображения определяет тип сжатия, и может принимать одно из следующих значений:

BI_RGB (=0) - изображение не сжато;

BI_RLE8 (=1) - 8-битное групповое кодирование;

BI_RLE4 (=2) - 4-битное групповое кодирование.

Например, для сжатых 256-цветных изображений элемент biCompression в заголовке изображения равен константе BI_RLE8 (=1). Данные хранятся в виде блоков, состоящих из двух и более байт. Если первый байт блока не равен нулю, он представляет собой число пикселей в последовательности одного цвета. Это число может принимать значение от 1 до 255. Второй (и последний) байт блока является индексом в таблице цветов, по которой определяется цвет последовательности пикселей. Например, блок "0A 14" означает, что надо вывести 10 байт (шестнадцатеричное 0A) цветом, определенным двадцатым элементом (шестнадцатеричное 14) таблицы цветов.

Если первый байт блока равен нулю, это означает, что за ним следует некоторая команда. Длина блока в этом случае определяется командой, а значение второго байта конкретизирует команду:

 

Второй байт Значение
0 Конец строки
1 Конец изображения
2 Команда перехода (или Delta-команда)
n≥3 Абсолютный режим

 

Смысл первых двух команд понятен. Длина соответствующего им блока составляет два байта.

Команда перехода означает, что следующий выводимый пиксель будет смещен относительно текущего. Два байта, следующие за командой содержат беззнаковые байтовые значения, указывающие горизонтальное и вертикальное смещения. Например, блок "00 02 05 01" означает, что надо переместиться на 5 точек вправо и на 1 строку вниз. Такие команды применяются, когда надо вывести несколько маленьких деталей в разные места фонового изображения. Длина блока команды перехода составляет четыре байта.

Абсолютный режим применяется для записи последовательности одиночных пикселей, каждый из которых имеет цвет, отличный от цветов соседей. Второй байт блока служит не только признаком абсолютного режима, но и указывает, сколько пикселей записаны несжатыми. Индексы цветов этих пикселей следуют за признаком команды абсолютного режима. Если их число нечетное, то последовательность для выравнивания на границу двухбайтного слова дополняется нулем. Длина блока этой команды составляет от 6 до 258 байт в зависимости от значения второго байта блока.

Абсолютный режим применяется только для последовательности не менее чем 3 пикселя. Если разноцветных пикселей 1 или 2, они кодируются с повторителем равным единице. Например, последовательность пикселей

 

11 11 11 22 33 44 44

 

закодируется следующим образом:

 

03 11 01 22 01 33 02 44.

 

В результате, сжатое изображение занимает больше места, чем несжатое.

Рассмотрим пример сжатого методом группового кодирования 8-битного изображения (шестнадцатеричные значения с двумя цифрами во втором столбце представляют собой индексы цвета одиночного пикселя):


 

Сжатые данные Полные данные
10 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
03 04 04 04 04
00 03 45 56 67 00 45 56 67 (последний 00 - дополнение)
02 78 78 78
00 02 05 01 Перемещение на 5 точек вправо и на 1 строку вниз
02 78 78 78
00 00 Конец строки
09 1E 1E 1E 1E 1E 1E 1E 1E 1E 1E
00 01 Конец изображения RLE

 

Необходимо заметить, что сжатые данные довольно неустойчивы к ошибкам, особенно если они коснутся команд.

Сжатие 16-цветных изображений (элемент biCompression в заголовке изображения равен константе BI_RLE4 =2) выполняется аналогично рассмотренному. Различие заключается в том, что информация интерпретируется по тетрадам или полубайтам, т.е. по 4 бита.

Рассмотрим тот же пример (каждая шестнадцатеричная цифра в правом столбце представляют собой индекс цвета одиночного пикселя):

 

Сжатые данные Полные данные
10 0C 0 C 0 C 0 C 0 C 0 C 0 C 0 C 0 C
03 04 0 4 0
00 06 45 56 67 00 4 5 5 6 6 7
04 78 7 8 7 8
00 02 05 01 Перемещение на 5 вправо и на 1 вниз
04 78 7 8 7 8
00 00 Конец строки
09 1E 1 E 1 E 1 E 1 E 1
00 01 Конец изображения RLE

 

Интерпретация команд совпадает с ранее рассмотренным случаем. Существенное отличие наблюдается в режиме кодировки, когда первый байт блока не равен нулю и представляет собой число пикселей в последовательности, второй байт содержит НЕ ОДИН, А ДВА индекса цветов, первый в старшем полубайте (4 бита старшего разряда) и второй в младшем полубайте. В рассмотренном примере, код "05 06" соответствует последовательности 5 байт с чередующимися цветами " 0 6 0 6 0". Для изображений с чередованием цветов такое сжатие будет достаточно эффективно, но такие изображения встречаются очень редко.

Такой же метод кодирования и подобные форматы имеют другие графические файлы WINDOWS: файлы пиктограмм (или иконок) *.ico и файлы курсоров *.cur.

 

 


Дата добавления: 2019-03-09; просмотров: 196; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!