BMP (Bitmap) — bitmap-формат або DIB () — формат файлу зображень растрової графіки, де зображення зберігається у вигляді двовимірного масиву з пікселів, кожен піксель має власний колір. Запам'ятовує одно- й багатокольорові (RGB) ілюстрації у формі Pixel. Формат почав використовуватися в операційних системах Windows та OS/2, у новіших версіях яких поступившися форматам SVG, JPEG, GIF. Дані цього формату включаються в двійкові файли ресурсів RES і в PE-файли.
Формат файлу BMP здатний зберігати 2D цифрові зображення довільної ширини, висоти та роздільної здатності, як монохромні так і кольорові, різної глибини кольору, і, необов'язково, зі стисненням даних, альфа-каналом та керуванням кольору. Специфікація Windows Metafile (WMF) охоплює формат файлу BMP. Серед іншого, wingdi.h визначає BMP-константи та структури. Растрова графіка загалом і Bitmap зокрема залежать від роздільної здатності, так при збільшенні розмірів зображення буде поступово погіршуватися його якість.
Можливості формату
У даному форматі можна зберігати тільки одношарові растри. На кожен піксель в різних файлах може приходити різна кількість біт (глибина кольору). Microsoft пропонує бітності 1, 2, 4, 8, 16, 24, 32, 48 і 64. В бітності 8 і нижче він вказується індексом з таблиці кольорів (палітри), а при великих: безпосереднім значенням. Колір же в будь-якому випадку можна задати тільки в колірній моделі RGB, але в бітності 16 і 32 можна отримати відтінки сірого з глибиною до 16 і 32-ох біт відповідно. Часткова прозорість реалізована альфа-каналом різних бітностей, але при цьому прозорість без градацій можна побічно отримати RLE-кодуванням. Растрові зображення є прямокутною сіткою пікселів, сітка має певну кількістю пікселів та інформаційний вміст (глибину кольору) на піксель.
У більшості випадків пікселі зберігаються у вигляді відносно простого двовимірного масиву. Для бітності 4 і 8 доступно RLE-кодування, яке може зменшити їх розмір. Формат BMP так само підтримує вбудовування даних у форматах JPEG і PNG. Але останнє скоріше більше призначене не для компактного зберігання, а для обходу обмежень архітектури GDI, яка не передбачає пряму роботу із зображеннями форматів відмінних від BMP.
В останніх версіях формату BMP так само з'явилися можливості управління кольором. Зокрема, можна вказувати кінцеві точки, виконувати гама-корекцію і вбудовувати колірні .
Будова Офіційну інформацію щодо формату BMP можна знайти в MSDN або в довідці Microsoft Windows SDK (може йти в комплекті з деякими IDE). У файлі wingdi.h від компанії Microsoft є всі оголошення мовою C++, які стосуються даного формату. У цей файл не були включені оголошення типів, оскільки від цього він може стати занадто громіздким. До того ж офіційні оголошення деякі розробники можуть вважати незручними і тому їх необхідність сумнівна. Якщо вам будуть потрібні оригінальні імена констант, структур, типів та їх полів, то всі вони є в тексті даної статті.
Максимальний розмір неподільних комірок (за винятком полів бітових структур): 32 біта і тому формат можна класифікувати як 32-бітний. Винятком можуть бути 64-бітові пікселі, але значення їх каналів можна обробляти і 16-бітними словами. Порядок байтів в 16-бітних і 32-бітових комірках усюди від меншого до більшого. Цілі числа записуються в прямому коді, зі знаком — в доповняльному. Якщо порівнювати з апаратними архітектурами, то порядок байтів і формат чисел відповідає архітектурі x86.
Можна зустріти чотири числових типи: BYTE — 8-бітове беззнаковое ціле. WORD —16-бітове беззнаковое ціле. DWORD — 32-бітове беззнаковое ціле.
LONG —32-бітове ціле зі знаком. У форматі Windows Bitmap під структурами розуміється блок з послідовними комірками різного фіксованого розміру, у яких є умовні імена (є в багатьох мовах програмування), а не щось складніше (наприклад, потік команд довільного розміру).
У деяких елементів формату вказана версія Windows, починаючи з якої він підтримується. Мова йде в першу чергу про основні бібліотеки WinAPI такі як gdi32.dll, shell32.dll, user32.dll і kernel32.dll. Інші компоненти операційної системи (наприклад, GDI+,. NET, DirectX) можуть мати інші більш широкі можливості.
Структура файлу
BMP-файл складається з чотирьох частин: Заголовок файлу (BITMAPFILEHEADER) Заголовок зображення (BITMAPINFOHEADER, може бути відсутнім). BITMAPV4HEADER (Win95, NT4.0) BITMAPV5HEADER (Win98/Me, 2000/XP) Палітра (може бути відсутнім) Саме зображення
BITMAPFILEHEADER BITMAPFILEHEADER — 14-байтна структура, яка розташована в самому початку файлу. Зверніть увагу на те, що з самого початку структури збивається вирівнювання комірок. Якщо для вас воно важливе, то в оперативній пам'яті даний заголовок розташовуйте за парними адресами, які не кратні чотирьом (тоді 32-бітові комірки потраплять на вирівняні позиції). Поз.(hex) Розмір (байти) Ім'я Тип WinAPI Опис 00 2 bfType WORD Відмітка для відмінності формату від інших (сигнатура формату). Може містити єдине значення 4D4216/424D16 (little-endian/big-endian), що відповідає значенню BM в стандарті ASCII. BM — Windows 3.1x, 95, NT, … . BA — OS/2 struct bitmap масив CI — OS/2 struct color зображення CP — OS/2 const color вказівник IC — OS/2 struct зображення PT — OS/2 вказівник 02 4 bfSize DWORD Розмір файлу в байтах. 06 2 bfReserved1 WORD Зарезервовані і повинні містити нуль. 08 2 bfReserved2 WORD 0A 4 bfOffBits DWORD Положення піксельних даних відносно початку даної структури (в байтах)). Сигнатура формату при перегляді вмісту файлу текстом у двійковому режимі виглядає як пара ASCII-символів «BM».
BITMAPINFO BITMAPINFO у файлі йде відразу за BITMAPFILEHEADER. Адреса цього блоку в пам'яті безпосередньо так само передається деяким функціям WinAPI (наприклад, SetDIBitsToDevice або CreateDIBitmap). Крім цього, цей же блок використовується у форматах значків і курсорів Windows, але в даній статті цей момент не розглядається (див. окремі описи цих форматів). Дана структура є основною і описовою у форматі BMP і тому коли просто згадано ім'я поля, то мова йде про поле в даній структурі.
Блок BITMAPINFO складається з трьох частин: Структура з інформаційними полями. Бітові маски для вилучення значень колірних каналів (присутні не завжди). Таблиця кольорів (присутня не завжди).
У момент написання даної статті структура з інформаційними полями мала чотири версії: CORE, 3, 4 і 5. Для кожної версії Microsoft оголосила чотири окремі структури з різними іменами полів. У даній статті при згадці поля, яке присутнє в декількох структурах, береться загальна для всіх структур частина в кінці імені (наприклад, BitCount замість bcBitCount, biBitCount, bV4BitCount або bV5BitCount). Версію структури можна визначити по першому 32-бітному середовищу (WinAPI — тип DWORD), яке містить її розмір в байтах (беззнаковим цілим). Версія CORE відрізняється від всіх своєю компактністю і використанням виключно 16-бітних беззнакових полів. Інші три містять ідентичні комірки, до яких в кожній новій версії додавалися нові. +Інформаційні структури Версія</small> Розмір (байти) Ім'я структури Версія Windows 9x/NTІнформація про версії взята з довідки по Microsoft Windows SDK, йде в комплекті з Microsoft Visual Studio 2008 и Embarcadero RAD Studio 2010 (розділ «Requirements» в статтях про дані структури). Версія Windows CE/MobileДив. розділи «Requirements» в статтях «BITMAPCOREHEADER » і «BITMAPINFOHEADER » стосовно доWindows Mobile 6.5 на MSDN. Примітки CORE 12 BITMAPCOREHEADER 95/NT 3.1 і старше CE 2.0/Mobile 5.0 і старше Містить тільки ширину, висоту і бітність растра. 3 40 BITMAPINFOHEADER 95/NT 3.1 і старше CE 1.0/Mobile 5.0 і старше Містить ширину, висоту і бітність растра, також формат пікселів, інформацію про кольорові таблиці та роздільну здатність. 4 108 BITMAPV4HEADER 95/NT 4.0 і старше не підтримується Окремо виділені маски каналів, додана інформація про кольоровий простір і гаму. 5 124 BITMAPV5HEADER 98/2000 і старше не підтримується Додано вказівку кращої стратегії відображення та підтримка профілів ICC. Через ідентичності полів у версіях 3, 4 і 5 може здатися що полем Size можна регулювати кількість полів, прибираючи невикористовувані. Насправді це не коректно, оскільки тут розмір грає роль версії (у версії CORE хоч і теж ідентичні поля, але іншого розміру і типу). Ніхто не гарантує що вам не можуть попастися заголовки менших або більших розмірів з іншим набором полів. Проте, Adobe Photoshop може при збереженні файлів BMP записувати структури інформаційних полів з розмірами 52 і 56 байт. По суті це урізана 4-та версія, яка містить тільки бітові маски каналів (56 байт — версія з альфа-каналом).
16-бітові інформаційні поля (версія CORE) Зверніть увагу на те, що тут поля ширини і висоти містять беззнакові цілі, у той час як 32-бітові структури зберігають значення зі знаком.
Позиціяв файлі(hex) Позиціяв структурі(hex) Розмір (байти) Ім'я Тип WinAPI Опис 0E 00 4 bcSize DWORD Розмір даної структури в байтах, який вказує так само на версію структури (тут має бути значення 12). 12 04 2 bcWidth WORD Ширина (bcWidth) і висота (bcHeight) растра в пікселях. Вказуються цілим числом без знака. Значення 0 не задокументовані. 14 06 2 bcHeight WORD 16 08 2 bcPlanes WORD У BMP допустимо тільки значення 1. Це поле використовується в значках і курсорах Windows. 18 0A 2 bcBitCount WORD Кількість біт на піксель (список підтримуваних дивіться в окремому розділі нижче).
32-бітові інформаційні поля (версії 3, 4 і 5) У таблиці нижче поля представлені оглядово. Детальну інформацію ви можете знайти в розділах далі.