Заголовок зображення: 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 представляє відносну інтенсивність синього, зеленого, і червоного компонентів кольору. Обертаю ваша увага на те, що порядок проходження компонентів зворотний звичному R-G-B. Четвертий байт не використовується і служить для вирівнювання на межу слова.

Масив містить стільки елементів, скільки квітів є в зображенні, точніше, стільки, скільки вказано в елементі Biclrused заголовка зображення. Для зображень з 24-бітовими квітами, палітра відсутній, тому що в таких зображеннях кожен піксел представляється значеннями інтенсивностей червоною, зеленою і синій компонент (RGB) в області даних. Кольори в таблиці повинні бути впорядковані в порядку важливості. Це допомагає драйверу дисплея показувати зображення пристрої, який не може відображати так багато квітів, як міститься у зображенні.

 

Власне зображення

 

Четверта частина файлу bmp - це масив пікселів зображення записаний відрядковий. Піксели в кожному рядку записуються зліва направо а рядки зображення зберігаються від низу до верху. Це означає що перший байт у масиві представляє піксел в нижньому лівому кутку зображення і останній байт - у верхньому правому кутку. Звертаю вашу увагу на це обставина. Порядок проходження рядків (від низу до верху) зворотний порядку проходження рядків у відеопам'яті.

 

Число байт, що представляють рядок розгортки, залежить від колірного формату і ширини зображення в пікселах. У разі потреби, рядок розгортки повинна доповнюватися нулями, щоб закінчуватися на межі подвійного слова (яке складається з чотирьох байт).

Елемент bibitcount (кількість битий на піксел) заголовка зображення визначає формат представлення кольору пікселів. Ми вже говорили, що він може приймати значення 1, 4, 8 або 24, які означають наступне:

1 - Одноколірне зображення. Таблиця квітів містить два елементи. Кожен біт в масиві даних зображення представляє піксел. Якщо біт рівний нулю, піксел відображається кольором першого елементу колірної таблиці. Якщо біт рівний одиниці, піксел має колір другого елементу таблиці.

4 - Зображення має не більше 16 квітів. Для уявлення одного піксела в масиві даних зображення використовується 4 бита (півбайта). Наприклад, байт зображення 0x1f представляє два піксела. Перший піксел має колір першого елементу таблиці (старший півбайт), і другий піксел має колір п'ятнадцятого елементу таблиці (молодший півбайт). (Елементи таблиці квітів нумеруються починаючи з нуля).

8 - Зображення має не більше 256 квітів. Для уявлення одного піксела в масиві даних зображення використовується 8 битий (байта). Наприклад, байт зображення 0x1f представляє піксел, який має колір тридцять першого елементу таблиці (0x1F=31.).

24 - Зображення має до 2^24 квітів. Послідовність кожних 3 байт у масиві даних зображення представляє відносну інтенсивність синього, зеленого і червоного компонентів кольору піксела. (Порядок зворотний звичному - синій перший)