Топ питань
Часова шкала
Чат
Перспективи

BMP

З Вікіпедії, вільної енциклопедії

Remove ads

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

Коротка інформація Розширення:, MIME-тип: ...

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

Remove ads

Можливості формату

Узагальнити
Перспектива

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

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

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

Remove ads

Будова

Узагальнити
Перспектива

Офіційну інформацію щодо формату BMP можна знайти в MSDN або в довідці Microsoft Windows SDK (може йти в комплекті з деякими IDE)[5]. У файлі 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) можуть мати інші більш широкі можливості.

Remove ads

Структура файлу

Узагальнити
Перспектива
Thumb
Структура BMP файлу

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

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

BITMAPFILEHEADER

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

Більше інформації Поз. (hex), Розмір (байти) ...

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

Більше інформації Версія, Розмір (байти) ...

Через ідентичності полів у версіях 3, 4 і 5 може здатися що полем Size можна регулювати кількість полів, прибираючи невикористовувані. Насправді це не коректно, оскільки тут розмір грає роль версії (у версії CORE хоч і теж ідентичні поля, але іншого розміру і типу). Ніхто не гарантує що вам не можуть попастися заголовки менших або більших розмірів з іншим набором полів. Проте, Adobe Photoshop може при збереженні файлів BMP записувати структури інформаційних полів з розмірами 52 і 56 байт. По суті це урізана 4-та версія, яка містить тільки бітові маски каналів (56 байт — версія з альфа-каналом).

16-бітові інформаційні поля (версія CORE)

Зверніть увагу на те, що тут поля ширини і висоти містять беззнакові цілі, у той час як 32-бітові структури зберігають значення зі знаком.

Більше інформації Позиціяв файлі (hex), Позиціяв структурі (hex) ...

32-бітові інформаційні поля (версії 3, 4 і 5)

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

Більше інформації Позиціяв файлі (hex), Позиціяв структурі (hex) ...

Метод стиснення (biCompression 1E) може бути:

Більше інформації Значення, Ідентифіковано за ...

Таблиця кольорів

Таблиця кольорів (палітра) міститься у файлі зображення BMP безпосередньо після заголовка файлу BMP, заголовка DIB і після необов’язкових трьох або чотирьох бітових масок, якщо використовується заголовок BITMAPINFOHEADER з параметром BI_BITFIELDS (12 байт) або BI_ALPHABITFIELDS (16 байт). Таким чином, його зміщення є розміром BITMAPFILEHEADER плюс розмір заголовка DIB (плюс необов'язкові 12-16 байт для трьох або чотирьох бітових масок). Примітка: у Windows CE заголовок BITMAPINFOHEADER можна використовувати з параметром BI_ALPHABITFIELDS в члені biCompression.

Кількість записів у палітрі дорівнює або 2 n (де n — кількість бітів на піксель), або менша кількість, зазначена в заголовку (у форматі заголовка OS/2 BITMAPCOREHEADER підтримується лише повнорозмірна палітра). У більшості випадків кожен запис у таблиці кольорів займає 4 байти в порядку синього, зеленого, червоного, 0x00 (виключення див. нижче). Це індексується в BITMAPINFOHEADER в члені структури biBitCount.

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

Кольори в таблиці кольорів зазвичай вказуються у форматі RGBA32 із 4 байтами на запис. Таблиця кольорів, що використовується з OS/2 BITMAPCOREHEADER , використовує формат RGB24 із 3 байтами на запис. Для DIB, завантажених у пам'ять, таблиця кольорів може додатково складатися з 2-байтових записів – ці записи становлять індекси до поточної реалізованої палітри замість явних визначень кольору RGB.

Microsoft не забороняє наявність дійсної бітової маски альфа-каналу в BITMAPV4HEADER і BITMAPV5HEADER для індексованих кольорових зображень 1bpp, 4bpp і 8bpp, що вказує на те, що записи таблиці кольорів також можуть вказувати альфа-компонент за допомогою 8.8.8.[ 0-8].[0-8] формат через член RGBQUAD.rgbReserved. Однак деякі версії документації Microsoft забороняють цю функцію, вказуючи, що член RGBQUAD.rgbReserved «повинен бути нульовим».

Як згадувалося вище, таблиця кольорів зазвичай не використовується, якщо пікселі мають формат 16 біт на піксель (16 bpp) (і вище); зазвичай у цих файлах растрових зображень немає записів таблиці кольорів. Однак документація Microsoft (на вебсайті MSDN від 16 листопада 2010 р. ) визначає, що для 16bpp (і вище) таблиця кольорів може бути присутнім для зберігання списку кольорів, призначених для оптимізації на пристроях з обмеженою можливість кольорового відображення, а також вказує, що в таких випадках у цій таблиці кольорів немає індексованих записів палітри. Це може здатися протиріччям, якщо не робити різниці між обов’язковими записами палітри та додатковим списком кольорів.

Пам'ять пікселів

Біти, що представляють растрові пікселі, упаковані в рядки. Розмір кожного рядка округлюється до кратного 4 байтам

(32-бітове DWORD ) шляхом заповнення.

Для зображень з висотою понад 1 кілька доповнених рядків зберігаються послідовно, утворюючи масив пікселів.

Піксельний масив (растрові дані)

Масив пікселів являє собою блок 32-бітових DWORD, який описує зображення піксель за пікселем.

Зазвичай пікселі зберігаються «знизу вгору» , починаючи з лівого нижнього кута, переходячи зліва направо, а потім ряд за рядком знизу вгору зображення. Якщо не використовується BITMAPCOREHEADER , нестиснені растрові зображення Windows також можна зберігати зверху вниз, якщо значення висоти зображення є негативним.

У оригінальній OS/2 DIB єдиними чотирма допустимими значеннями глибини кольору були 1, 4, 8 і 24 біти на піксель (bpp). Сучасні заголовки DIB дозволяють використовувати піксельні формати з 1, 2, 4, 8, 16, 24 і 32 бітами на піксель (bpp). GDI+ також дозволяє 64 біта на піксель.

Байти заповнення (не обов’язково 0) мають бути додані до кінця рядків, щоб збільшити довжину рядків до чотирьох байтів. Коли масив пікселів завантажується в пам’ять, кожен рядок має починатися з адреси пам’яті, кратної 4. Це обмеження адреси/зміщення є обов’язковим лише для масивів пікселів, завантажених у пам’ять. Для цілей зберігання файлів лише розмір кожного рядка має бути кратним 4 байтам, тоді як зміщення файлу може бути довільним. 24-бітове растрове зображення з Width=1 матиме 3 байти даних на рядок (синій, зелений, червоний) і 1 байт заповнення, тоді як Width=2 матиме 6 байтів даних і 2 байти заповнення, Width=3 матиме 9 байтів даних і 3 байти заповнення, а Width=4 матиме 12 байтів даних без заповнення.

Стиснення

  • Індексовані кольорові зображення можуть бути стиснуті за допомогою 4-розрядного або 8-бітового алгоритму RLE або Хаффмана 1D.
  • Зображення OS/2 BITMAPCOREHEADER 2 24bpp можуть бути стиснуті за допомогою 24-бітного алгоритму RLE.
  • Зображення 16bpp і 32bpp завжди зберігаються без стиснення.
  • Зауважте, що зображення будь-якої глибини кольору можна зберігати без стиснення, якщо це потрібно.

Піксельний формат

  • Формат 1 біт на піксель (1 bpp) підтримує 2 різні кольори (наприклад: чорний і білий). Значення пікселів зберігаються в кожному біті, причому перший (крайній лівий) піксель у самому значущому біті першого байта. Кожен біт є індексом у таблицю з 2 кольорів. Невстановлений біт буде посилатися на перший запис таблиці кольорів, а встановлений біт – до останнього (другого) запису таблиці кольорів.
  • Формат 2-біт на піксель (2bpp) підтримує 4 різні кольори і зберігає 4 пікселі на 1 байт, крайній лівий піксель знаходиться в двох найбільш значущих бітах ( лише для Windows CE : ). Кожне значення пікселя є 2-бітовим індексом у таблиці до 4 кольорів.
  • Формат 4-біт на піксель (4bpp) підтримує 16 різних кольорів і зберігає 2 пікселі на 1 байт, причому крайній лівий піксель знаходиться у більш значному фрагменті. Кожне значення пікселя є 4-бітовим індексом у таблиці до 16 кольорів.
  • Формат 8 біт на піксель (8 bpp) підтримує 256 різних кольорів і зберігає 1 піксель на 1 байт. Кожен байт є індексом у таблицю до 256 кольорів.
  • Формат 16 біт на піксель (16 bpp) підтримує 65536 різних кольорів і зберігає 1 піксель на 2-байтове WORD. Кожне СЛОВО може визначати альфа-, червоний, зелений та синій вибірки пікселя.
  • Формат 24-бітного пікселя (24 bpp) підтримує 16 777 216 різних кольорів і зберігає значення 1 пікселя на 3 байти. Кожне значення пікселя визначає червоні, зелені та сині зразки пікселя (8.8.8.0.0 у нотації RGBAX). Зокрема, в порядку: синій, зелений і червоний (8 біт на кожну вибірку).
  • Формат 32-біт на піксель (32bpp) підтримує 4 294 967 296 різних кольорів і зберігає 1 піксель на 4-байтовий DWORD. Кожне DWORD може визначити альфа-, червоний, зелений та синій вибірки пікселя.

Щоб вирішити неоднозначність того, які біти визначають, які вибірки, заголовки DIB надають певні значення за замовчуванням, а також конкретні BITFIELDS, які є бітовими масками, які визначають належність певної групи бітів у пікселі до певного каналу. Наведена нижче діаграма визначає цей механізм:

Приклад 1

Thumb

Зверніть увагу, що растрові дані починаються з нижнього лівого кута зображення.

Нижче наведено приклад растрового зображення 2×2 пікселя, 24-розрядного (заголовок Windows DIB BITMAPINFOHEADER ) з піксельний формат RGB24.

Більше інформації Зміщення, Розмір ...

Приклад 2 растрового зображення 4×2 пікселя з кодуванням 32 біти/піксель

Приклад 2

Зверніть увагу, що растрові дані починаються з нижнього лівого кута зображення.

Нижче наведено приклад 32-розрядного растрового зображення розміром 4×2 пікселя зі значеннями непрозорості в альфа-каналі (заголовок Windows DIB BITMAPV4HEADER ) з піксельним форматом ARGB32.

Більше інформації Зміщення, Розмір ...
Remove ads

Примітки

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads