BMP

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук
Windows Bitmap
Розширення файлу: .bmp, .dib
MIME тип: image/x-ms-bmp (unofficial)
Type code: 'BMP'
Uniform Type Identifier: com.microsoft.bmp
Тип формату: Графічний формат

BMP (Bitmap) — bitmap-формат або DIB (англ. device independent bitmap)-формат файлу зображень растрової графіки, в якому зображення зберігається у вигляді двовимірного масиву пікселів. запам'ятовує одно і багатокольорові (RGB) ілюстрації у формі Pixel. BMP-формат використовується в операційній системи Windows та OS/2. Дані цього формату включаються в двійкові файли ресурсів RES і в PE-файли.

Формат файлу BMP здатний зберігати 2D цифрові зображення довільної ширини, висоти та роздільної здатності, як монохромні так і кольорові, різної глибини кольору, і, необов'язково, зі стисненням данних, альфа-каналом та керуванням кольору. Специфікація Windows Metafile (WMF) охоплює формат файлу BMP. Серед іншого, wingdi.h визначає BMP-константи та структури.

Можливості формату BMP[ред.ред. код]

У даному форматі можна зберігати тільки одношарові растри. На кожен піксель в різних файлах може приходити різна кількість біт (глибина кольору). Microsoft пропонує бітності 1, 2, 4, 8, 16, 24, 32, 48 і 64. В бітності 8 і нижче він вказується індексом з таблиці кольорів (палітри), а при великих: безпосереднім значенням. Колір же в будь-якому випадку можна задати тільки в колірній моделі RGB, але в бітності 16 і 32 можна отримати Grayscale[ru] з глибиною до 16 і 32-ох біт відповідно. Часткова прозорість реалізована альфа-каналом різних бітностей, але при цьому прозорість без градацій можна побічно отримати RLE-кодуванням.

У більшості випадків пікселі зберігаються у вигляді відносно простого двовимірного масиву. Для бітності 4 і 8 доступно RLE-кодування, яке може зменшити їх розмір. Формат BMP так само підтримує вбудовування даних у форматах JPEG і PNG. Але останнє скоріше більше призначене не для компактного зберігання, а для обходу обмежень архітектури GDI, яка не передбачає пряму роботу із зображеннями форматів відмінних від BMP.

В останніх версіях формату BMP так само з'явилися можливості по управлінню кольором. Зокрема, можна вказувати кінцеві точки, виробляти гамма-корекцію і вбудовувати колірні профілі ICC[en].

Внутрішня будова ВМР[ред.ред. код]

Офіційну інформацію по формату BMP можна знайти в MSDN або в довідці Microsoft Windows SDK (може йти в комплекті з деякими IDE). У файлі wingdi.h від компанії Microsoft є всі оголошення мовою C++, які стосуються даного формату. У цей файл не були включені оголошення типів, так як від цього він може бути занадто громіздким. До того ж офіційні оголошення деякі розробники можуть вважати незручними і тому їх необхідність сумнівна. Якщо вам будуть потрібні оригінальні імена констант, структур, типів та їх полів, то всі вони є в тексті даної статті.

Максимальний розмір неподільних комірок (виключаючи поля бітових структур): 32 біта і тому формат можна класифікувати як 32-бітний. Винятком можуть бути 64-бітові пікселі, але значення їх каналів можна обробляти і 16-бітними словами. Порядок байтів в 16-бітних і 32-бітових комірках усюди від меншого до більшого. Цілі числа записуються в прямому коді[ru], зі знаком — в додатковому. Якщо порівнювати з апаратними архітектурами, то порядок байт і формат чисел відповідає архітектурі 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 файлу

BMP-файл складається з чотирьох частин:

  1. Заголовок файлу (BITMAPFILEHEADER)
  2. Заголовок зображення (BITMAPINFOHEADER, може бути відсутнім). BITMAPV4HEADER (Win95, NT4.0) BITMAPV5HEADER (Win98/Me, 2000/XP)
  3. Палітра (може бути відсутнім)
  4. Саме зображення

BITMAPFILEHEADER[ред.ред. код]

BITMAPFILEHEADER — 14-байтна структура, яка розташована в самому початку файлу. Зверніть увагу на те, що з самого початку структури збивається вирівнювання комірок. Якщо для вас воно важливе, то в оперативній пам'яті даний заголовок розташовуйте по парним адресами, які не кратні чотирьом (тоді 32-бітові комірки потраплять на вирівняні позиції).

Поз.
(hex)
Розмір
(байты)
Ім'я Тип WinAPI Опис
00 2 bfType WORD Відмітка для відмінності формату від інших (сигнатура формату). Може містити єдине значення 4D4216/424D16 (little-endian/big-endian).
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 складається з трьох частин:

  1. Структура з інформаційними полями.
  2. Бітові маски для вилучення значень колірних каналів (присутні не завжди).
  3. Таблиця кольорів (присутня не завжди).

У момент написання даної статті структура з інформаційними полями мала чотири версії: CORE, 3, 4 і 5. Для кожної версії Microsoft оголосила чотири окремі структури з різними іменами полів. У даній статті при згадці поля, яке присутнє в декількох структурах, береться загальна для всіх структур частина в кінці імені (наприклад, BitCount замість bcBitCount, biBitCount, bV4BitCount або bV5BitCount). Версію структури можна визначити по першій 32 -бітної осередку (WinAPI — тип DWORD), яка містить її розмір в байтах (беззнаковим цілим). Версія CORE відрізняється від всіх своєю компактністю і використанням виключно 16-бітних беззнакових полів. Інші три містять ідентичні комірки, до яких в кожній новій версії додавалися нові.

Нижче представлена ​​оглядова таблиця з інформаційними структурами:

Версія Розмір
(байти)
Ім'я структури Версія Windows 9x/NT[1] Версія Windows CE/Mobile[2] Примітки
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)[ред.ред. код]

У таблиці нижче поля представлені оглядово. Детальну інформацію ви можете знайти в розділах далі.

Позиція
в файлі
(hex)
Позиція
в структурі
(hex)
Розмір
(байти)
Ім'я
(версії 3/4/5)
Тип WinAPI Опис
0E 00 4 biSize
bV4Size
bV5Size
DWORD Розмір даної структури в байтах, який вказує так само на версію структури.
12 04 4 biWidth
bV4Width
bV5Width
LONG Ширина растра в пікселях. Вказується цілим числом зі знаком. Нуль і від'ємні не задокументовані.
16 08 4 biHeight
bV4Height
bV5Height
LONG Ціле число зі знаком, що містить два параметри: висота растра в пікселях (абсолютне значення числа) і порядок проходження рядків у двовимірних масивах (знак числа). Нульове значення не задокументовано.
1A 0C 2 biPlanes
bV4Planes
bV5Planes
WORD У BMP допустимо тільки значення 1. Це поле використовується в значках і курсорах Windows.
1C 0E 2 biBitCount
bV4BitCount
bV5BitCount
WORD Кількість біт на піксель .
1E 10 4 biCompression
bV4V4Compression
bV5Compression
DWORD Вказує на спосіб зберігання пікселів.
22 14 4 biSizeImage
bV4SizeImage
bV5SizeImage
DWORD Розмір піксельних даних в байтах. Може бути обнулено якщо зберігання здійснюється двовимірним масивом.
26 18 4 biXPelsPerMeter
bV4XPelsPerMeter
bV5XPelsPerMeter
LONG Кількість пікселів на метр по горизонталі і вертикалі.
2A 1C 4 biYPelsPerMeter
bV4YPelsPerMeter
bV5YPelsPerMeter
LONG
2E 20 4 biClrUsed
bV4ClrUsed
bV5ClrUsed
DWORD Розмір таблиці кольорів в комірках.
32 24 4 biClrImportant
bV4ClrImportant
bV5ClrImportant
DWORD Кількість комірок від початку таблиці кольорів до останньої використовуваної (включаючи її саму).
Додані у версії 4
Позиція
в файлі
(hex)
Позиція
в структурі
(hex)
Розмір
(байти)
Ім'я
(версиії 4/5)
Тип WinAPI Опис
36 28 4 bV4RedMask
bV5RedMask
DWORD Бітові маски для вилучення значень каналів: інтенсивність червоного, зеленого, синього і значення альфа-каналу.
3A 2C 4 bV4GreenMask
bV5GreenMask
DWORD
3E 30 4 bV4BlueMask
bV5BlueMask
DWORD
42 34 4 bV4AlphaMask
bV5AlphaMask
DWORD
46 38 4 bV4CSType
bV5CSType
DWORD Вид колірного простору].
4A 3C 36 bV4Endpoints
bV5Endpoints
CIEXYZTRIPLE Значення цих чотирьох полів береться до уваги тільки якщо поле CSType містить 0 (LCS_CALIBRATED_RGB). Тоді кінцеві точки і значення гами для трьох колірних компонент вказуються в цих полях.
6E 60 4 bV4GammaRed
bV5GammaRed
DWORD
72 64 4 bV4GammaGreen
bV5GammaGreen
DWORD
76 68 4 bV4GammaBlue
bV5GammaBlue
DWORD
Додані у версії 5
Позиція
в файлі
(hex)
Позиція
в структурі
(hex)
Розмір
(байти)
Ім'я Тип WinAPI Опис
7A 6C 4 bV5Intent DWORD Переваги при рендеринге растра.
7E 70 4 bV5ProfileData DWORD Зсув у байтах колірного профілю від початку BITMAPINFO.
82 74 4 bV5ProfileSize DWORD Якщо в BMP безпосередньо включається колірний профіль, то тут вказується його розмір в байтах.
86 78 4 bV5Reserved DWORD Зарезервовано і повинно бути обнулили.

Примітки[ред.ред. код]

  1. Інформація про версії взята з довідки по Microsoft Windows SDK, йде в комплекті з Microsoft Visual Studio 2008 и Embarcadero RAD Studio 2010 (розділ «Requirements» в статтях про дані структури).
  2. См. розділи «Requirements» в статтях «BITMAPCOREHEADER» і «BITMAPINFOHEADER» стосовно доWindows Mobile 6.5 на MSDN.