BMP (ад ) — фармат захоўвання растравых выяў, распрацаваны кампаніяй Microsoft, падтрымка якога інтэгравана ў аперацыйныя сістэмы Windows і OS/2. Файлы фармату BMP могуць мець пашырэнні .bmp, .dib і .rle

У гэтым фармаце можна захоўваць толькі аднаслаёвыя растры.

Фармат дазваляе задаваць для розных файлаў розную глыбіню колеру (колькасць біт колеру на піксель). 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 таксама з’явіліся магчымасці па кіраванні колерам. У прыватнасці, можна паказваць канчатковыя кропкі, вырабляць гама-карэкцыю і ўбудоўваць каляровыя профілі ICC.

DIB і DDB Пры выкарыстанні фармату DIB ( — апаратна-незалежная бітавая карта) праграміст можа атрымаць доступ да ўсіх элементаў структур, якія апісваюць малюнак, пры дапамозе звычайнага ўказальніка. Але гэтыя даныя не выкарыстоўваюцца для непасрэднага кіравання экранам, так як яны заўсёды захоўваюцца ў сістэмнай памяці, а не ў спецыялізаванай відэапамяці.

Фармат пікселя ў аператыўнай памяці можа адрознівацца ад таго фармату, які павінен заносіцца ў відэапамяць для індыкацыі пункту такога ж колеру. Напрыклад, у DIB-фармаце можа выкарыстоўвацца 24 біта для задання пікселя, а графічны адаптар у гэты момант можа працаваць у рэжыме HiColor з каляровай глыбінёй 16 біт. Пры гэтым ярка-чырвоная кропка ў апаратна-незалежным фармаце будзе задавацца трыма байтами 0000FF16, а ў відэапамяці — словам F80016. Пры капіяванні малюнка на экран сістэма будзе марнаваць дадатковы час на пераўтварэнне кодаў колеру з 24-бітнага фармату ў фармат відэабуфера.

Фармат DDB ( — апаратна-залежная бітавая карта) заўсёды змяшчае каляровыя коды, якія супадаюць з кодамі відэабуфера, але ён можа захоўвацца як у сістэмнай, так і ў відэапамяці. У абодвух выпадках ён змяшчае толькі коды колеру ў тым фармаце, які забяспечыць перасылку выявы з АЗП у відэапамяць пры дапамозе простага капіяванняЕвченко А. И. OpenGL и DirectX. Программирование графики (Для профессионалов), 2006 г. Стр. 183..

Унутраная будова Афіцыйную інфармацыю па фармаце BMP можна знайсці ў MSDN або даведцы Microsoft Windows SDK (можа ісці ў камплекце з некаторымі IDE). У файле WinGDI.h ад кампаніі Microsoft ёсць усе аб’явы на мове C++, якія тычацца гэтага фармату.

Максімальны памер непадзельных ячэек (выключаючы поля бітавых структур): 32 біта і таму фармат можна класіфікаваць як 32-бітны. Выключэннем могуць быць 64-бітныя пікселі, але іх значэнні каналаў можна апрацоўваць і 16-бітнымі словамі. Парадак байт у 16-бітныя і 32-бітных ячэйках паўсюль ад малодшага да старэйшага (). Цэлыя лікі запісваюцца ў прамым кодзе, са знакам — у дадатковым. Калі параўноўваць з апаратнымі архітэктурамі, то парадак байт і фармат лікаў адпавядае x86.

У гэтым артыкуле для ўказанні тыпаў выкарыстоўваюцца імёны тыпаў WinAPI як у дакументацыі Microsoft.

Акрамя спецыфічных (апісаныя асобна ў тэксце артыкула) можна сустрэць чатыры лікавых тыпа: 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 і блока BITMAPINFO. Апошні змяшчае: Інфармацыйныя поля. Бітавыя маскі для здабывання каляровых значэнняў каналаў (апцыянальныя). Табліца колераў (апцыянальная). Каляровы профіль (апцыянальны). Піксельныя даныя. Пры захоўванні ў файле ўсе загалоўкі ідуць з самага першага байта.

Піксельныя даныя могуць знаходзіцца на адвольнай пазіцыі ў файле (яна паказваецца ў поле OffBits структуры BITMAPFILEHEADER), у тым ліку і ў выдаленні ад загалоўкаў. Апцыянальны каляровай профіль з’явіўся ў версіі 5 і ён таксама можа свабодна размяшчацца, але яго пазіцыя паказваецца ад пачатку BITMAPINFO (у поле ProfileData).

У аператыўнай памяці (напрыклад, пры ўзаемадзеянні з WinAPI-функцыямі GDI) з загалоўкаў выключаецца структура BITMAPFILEHEADER.

Пры гэтым Microsoft рэкамендуе размяшчаць каляровай профіль адразу за загалоўкамі ў адзіным блокуСм. раздел «Remarks» статьи «BITMAPV5HEADER structure» на MSDN..

Піксельныя даныя могуць мець адвольнае размяшчэнне ў памяці і іх адрас паказваецца ў параметрах працэдур.

У любым выпадку рэкамендуецца ў памяці ўсе блокі змяшчаць па адрасах кратных чатыром: у загалоўках ёсць 32-бітныя ячэйкі, а да піксельных даных такое патрабаванне паказана ў дакументацыіСм. раздел «Remarks» в статье «BITMAPINFO structure» на MSDN..

Гэта патрабаванне справядліва толькі для аператыўнай памяці: пры захоўванні ў файле яго прытрымлівацца не абавязкова.

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 складаецца з трох частак: Структура з інфармацыйнымі палямі. Бітавыя маскі для здабывання каляровых значэнняў каналаў (прысутнічаюць не заўсёды). Табліца колераў (прысутнічае не заўсёды). Пра бітавыя маскі і табліцу колераў глядзіце ніжэй у асобных раздзелах. Тут далей пойдзе апісанне структуры з інфармацыйнымі палямі.

У момант напісання гэтага артыкула структура з інфармацыйнымі палямі мела чатыры версііСм. статью «Bitmap Header Types» в MSDN.: CORE, 3, 4 і 5 (абазначэнні версій прыведзены ўмоўныя у рамках гэтага артыкула для кароткасці).

Для кожнай версіі Microsoft абвясціла чатыры асобныя структуры з рознымі імёнамі палёў.

У гэтым артыкуле пры згадванні поля, якое прысутнічае ў некалькіх структурах, бярэцца агульная для ўсіх структур частка ў канцы імя (напрыклад, BitCount замест bcBitCount, biBitCount, bV4BitCount або bV5BitCount).

Версію структуры можна вызначыць па першай 32-бітнай вочку (WinAPI-тып DWORD), якая змяшчае яе памер у байтах (беззнаковым цэлым).

Версія CORE адрозніваецца ад усіх сваёй кампактнасцю і выкарыстаннем выключна 16-бітных беззнаковых палёў. Астатнія тры змяшчаюць ідэнтычныя ячэйкі, да якіх у кожнай новай версіі дадаваліся новыя.

Ніжэй прадстаўлена аглядная табліца па інфармацыйных структурах: Версія Памер (байты) Імя структуры Версія 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 можа здацца, што полем Памер можна рэгуляваць колькасць палёў, прыбіраючы непатрэбныя.

У рэчаіснасці гэта не карэктна, так як тут памер гуляе ролю версіі (у версіі 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