Заголовок зображення: 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 байт у масиві даних зображення представляє відносну інтенсивність синього, зеленого і червоного компонентів кольору піксела. (Порядок зворотний звичному - синій перший)