BMP

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 14. října 2020; kontroly vyžadují 9 úprav .
Bitmapa Windows
Rozšíření .bmp[1] , [1] nebo [1].dib.rle
MIME typ obrázek/bmp [2] [3]
Vývojář Microsoft [4] [5]
Typ formátu rastrová grafika
 Mediální soubory na Wikimedia Commons

BMP (z angl.  B it m ap Picture ) je formát bitmapového úložiště vyvinutýspolečností Microsoft . Soubory ve formátu BMP mohou mít přípony .bmp , .dib a .rle .

S formátem BMP pracuje velké množství programů, protože jeho podpora je integrována do operačních systémů Windows a OS/2 . Data v tomto formátu jsou navíc zahrnuta v binárních souborech zdrojů RES a v souborech PE .

V tomto formátu lze uložit pouze jednovrstvé rastry. Každý pixel v různých souborech může mít různý počet bitů (barevnou hloubku). Microsoft nabízí bitové hloubky 1, 2, 4, 8, 16, 24, 32, 48 a 64. V bitových hloubkách 8 a nižších je barva označena indexem z tabulky barev (palety) a pro větší jedničky, přímou hodnotou. V každém případě lze barvu zadat pouze v barevném modelu RGB (jak při přímém zadání v pixelu, tak v tabulce barev), ale v 16 a 32 bitech můžete získat stupně šedi s hloubkou až 16 a 32 bitů, resp. Částečná transparentnost je realizována alfa kanálem bitových hloubek od 16 bitů a výše.

Ve většině případů jsou pixely uloženy jako relativně jednoduché dvourozměrné pole. Pro bitové hloubky 4 a 8 je k dispozici kódování RLE , které může zmenšit jejich velikost. Formát BMP také podporuje vkládání dat JPEG a PNG . Ale ten druhý pravděpodobně není určen pro kompaktní úložiště, ale pro obcházení omezení architektury GDI , která neumožňuje přímou práci s obrázky jinými než formáty BMP. Nejnovější verze formátu BMP také zavedly možnosti správy barev. Zejména můžete určit koncové body, provádět gama korekci a vkládat profily barev ICC.

DIB a DDB

Při použití formátu DIB ( Device Independent Bitmap )  může programátor přistupovat ke všem prvkům struktur, které popisují obrázek, pomocí běžného ukazatele. Tato data se však nepoužívají pro přímé ovládání obrazovky, protože jsou vždy uložena v systémové paměti, nikoli ve vyhrazené video paměti . Formát pixelů v paměti RAM se může lišit od formátu, který musí být uložen ve videopaměti, aby indikoval bod stejné barvy. Například formát DIB může k určení pixelu používat 24 bitů a grafický adaptér může v tu chvíli pracovat v režimu HiColor s barevnou hloubkou 16 bitů. V tomto případě bude jasně červený bod v hardwarově nezávislém formátu specifikován třemi bajty 0000FF 16 a ve video paměti - slovem F800 16 . Při kopírování obrázku na obrazovku stráví systém další čas převodem barevných kódů z 24bitového formátu do formátu vyrovnávací paměti videa .

Formát DDB ( Device Dependent Bitmap )  vždy obsahuje barevné kódy, které odpovídají kódům video vyrovnávací paměti , ale lze jej uložit jak do systémové, tak do video paměti. V obou případech obsahuje pouze barevné kódy ve formátu, který zajistí přenos obrazu z RAM do videopaměti pomocí jednoduchého kopírování [6] .

Vnitřní struktura

Oficiální informace o formátu BMP lze nalézt v MSDN nebo v nápovědě Microsoft Windows SDK (může být součástí některých IDE). Soubor WinGDI.h od společnosti Microsoft má všechny deklarace C++ pro tento formát. Tento článek však nezahrnoval deklarace typu, protože to může být příliš těžkopádné. Kromě toho mohou někteří vývojáři považovat oficiální oznámení za nepohodlná, a proto je jejich relevance pochybná. Pokud potřebujete originální názvy konstant, struktur, typů a jejich polí, pak jsou všechny v textu tohoto článku.

Maximální velikost nedělitelných buněk (mimo polí bitových struktur): 32 bitů a proto lze formát klasifikovat jako 32 bitů. Výjimkou mohou být 64bitové pixely, ale jejich hodnoty kanálu lze zpracovat také pomocí 16bitových slov. Pořadí bajtů v 16bitových a 32bitových buňkách je všude od nízké po vysokou (little-endian). Celá čísla jsou zapsána v přímém kódu s dodatečným přihlášením . Ve srovnání s hardwarovými architekturami odpovídá pořadí bajtů a formát čísel x86 .

Tento článek používá k určení typů názvy typů WinAPI jako v dokumentaci společnosti Microsoft. Kromě konkrétních (popsaných samostatně v textu článku) lze nalézt čtyři číselné typy:

Ve formátu Windows Bitmap jsou struktury chápány jako blok s po sobě jdoucími buňkami různých pevných velikostí, které mají podmíněné názvy (existují v mnoha programovacích jazycích), a nikoli něco složitějšího (například příkazový proud libovolné velikosti).

Některé prvky formátu mají verzi systému Windows, od které jsou podporovány. Hovoříme především o hlavních knihovnách WinAPI jako je gdi32.dll, shell32.dll, user32.dll a kernel32.dll. Jiné součásti operačního systému (např. GDI+, .NET, DirectX) mohou mít jiné, pokročilejší schopnosti.

Obecná struktura

Data ve formátu BMP se skládají ze tří hlavních bloků různých velikostí:

  1. Záhlaví ze struktury BITMAPFILEHEADER a bloku BITMAPINFO . Poslední obsahuje:
    1. informační pole.
    2. Bitové masky pro extrahování hodnot barevných kanálů (volitelné).
    3. Vzorník barev (volitelné).
  2. Barevný profil (volitelné).
  3. Pixelová data .

Při uložení do souboru pocházejí všechna záhlaví z prvního bajtu. Pixelová data mohou být umístěna na libovolné pozici v souboru (uvádí se v poli OffBits struktury BITMAPFILEHEADER), včetně vzdálenosti od záhlaví. Volitelný barevný profil se objevil ve verzi 5 a lze jej také libovolně umístit, ale jeho poloha je specifikována od začátku BITMAPINFO (v poli ProfileData).

V RAM (například při interakci s funkcemi GDI WinAPI) je struktura BITMAPFILEHEADER vyloučena ze záhlaví. Microsoft zároveň doporučuje umístit barevný profil hned za nadpisy do jednoho bloku [7] . Pixelová data mohou mít v paměti libovolné umístění a jejich adresa je uvedena v parametrech procedury. V každém případě se doporučuje uchovávat všechny bloky v paměti na adresách dělitelných čtyřmi: v hlavičkách jsou 32bitové buňky a takový požadavek na pixelová data je uveden v dokumentaci [8] . Tento požadavek platí pouze pro RAM: při uložení do souboru není nutné jej dodržovat.

BITMAPFILEHEADER

BITMAPFILEHEADER je 14bajtová struktura, která se nachází na samém začátku souboru. Vezměte prosím na vědomí, že od samého začátku struktury se ztratí zarovnání buněk. Pokud je to pro vás důležité, umístěte tuto hlavičku do paměti RAM na sudé adresy, které nejsou násobkem čtyř (pak 32bitové buňky padnou do zarovnaných pozic).

Poz.
(hexadecimální)
Velikost
(bajty)
název typ WinAPI Popis
00 2 bfType SLOVO Značka pro odlišení formátu od ostatních (podpis formátu). Může obsahovat jedinou hodnotu 4D42 16 /424D 16 (little-endian/big-endian).
02 čtyři bfSize DWORD Velikost souboru v bajtech.
06 2 bfReserved1 SLOVO Rezervováno a musí být nula.
08 2 bfReserved2 SLOVO
0A čtyři bfOffBits DWORD Poloha pixelových dat vzhledem k začátku této struktury (v bajtech).

Podpis formátu při prohlížení obsahu souboru jako textu v binárním režimu vypadá jako dvojice znaků ASCII "BM".

BITMAPINFO

BITMAPINFO přichází bezprostředně za BITMAPFILEHEADER v souboru. Adresa tohoto bloku v paměti je také přímo předána některým funkcím WinAPI (například SetDIBitsToDevice nebo CreateDIBitmap). Kromě toho se stejný blok používá ve formátech ikon a kurzorů Windows, ale tento bod není v tomto článku zohledněn (viz samostatné popisy těchto formátů). Tato struktura je základní a popisná ve formátu BMP, takže když je jednoduše zmíněn název pole, jedná se o pole v této struktuře.

Blok BITMAPINFO se skládá ze tří částí:

  1. Struktura s informačními poli.
  2. Bitové masky pro extrakci hodnot barevných kanálů (ne vždy k dispozici).
  3. Tabulka barev (ne vždy k dispozici).

O bitových maskách a tabulce barev viz níže v samostatných částech. Zde bude následovat popis struktury s informačními poli.

V době psaní tohoto článku měla struktura s informačními poli čtyři verze [9] : CORE, 3, 4 a 5 (označení verzí je v tomto článku pro stručnost podmíněno). Pro každou verzi Microsoft deklaroval čtyři samostatné struktury s různými názvy polí. V tomto článku se při zmínce o poli, které je přítomno v několika strukturách, část společná pro všechny struktury bere na konec názvu (například BitCount místo bcBitCount, biBitCount, bV4BitCount nebo bV5BitCount). Verzi struktury lze určit podle první 32bitové buňky (typ WinAPI DWORD), která obsahuje její velikost v bajtech (celé číslo bez znaménka). Verze CORE se od všech liší svou kompaktností a použitím výhradně 16bitových nepodepsaných polí. Zbývající tři obsahují identické buňky, do kterých byly v každé nové verzi přidány nové.

Níže je uvedena přehledná tabulka informačních struktur:

Verze Velikost
(bajty)
Název struktury Verze Windows 9x / NT [10] Windows CE / mobilní verze [11] Poznámky
JÁDRO 12 BITMAPCOREHEADER 95/NT 3.1 a starší CE 2.0/Mobile 5.0 a vyšší Obsahuje pouze šířku, výšku a bitovou hloubku rastru.
3 40 BITMAPINFOHEADER 95/NT 3.1 a starší CE 1.0/Mobile 5.0 a vyšší Obsahuje šířku, výšku a bitovou hloubku rastru a také formát pixelů, tabulku barev a informace o rozlišení.
čtyři 108 BITMAPV4HEADER 95/NT 4.0 a starší není podporováno Samostatně vybrané masky kanálů, přidané informace o barevném prostoru a gama.
5 124 BITMAPV5HEADER 98/2000 a starší není podporováno Přidána strategie zobrazování preferencí a podpora profilů ICC.

Vzhledem k identitě polí ve verzích 3, 4 a 5 se může zdát, že pole Velikost může řídit počet polí a odstranit nepoužitá. Ve skutečnosti to není správné, protože zde velikost hraje roli verze (ve verzi CORE jsou pole také totožná, ale jiné velikosti a typu). Nikdo nezaručuje, že nezískáte menší nebo větší nadpisy s jinou sadou polí. Adobe Photoshop však může při ukládání souborů BMP uložit 52bajtové a 56bajtové struktury informačních polí. Ve skutečnosti se jedná o zkrácenou 4. verzi, která obsahuje pouze bitové masky kanálů (56 bajtů - verze s alfa kanálem).

16bitová informační pole (verze CORE)

Všimněte si, že zde pole šířka a výška obsahují celá čísla bez znaménka, zatímco 32bitové struktury ukládají hodnoty se znaménkem.

Pozice
v souboru
(hexadecimální)
Pozice
ve struktuře
(hexadecimální)
Velikost
(bajty)
název typ WinAPI Popis
0E 00 čtyři bcSize DWORD Velikost této struktury v bajtech, udávající také verzi struktury (zde by měla být 12).
12 04 2 bcWidth SLOVO Šířka (bcWidth) a výška (bcHeight) rastru v pixelech. Určeno jako celé číslo bez znaménka. Hodnota 0 není zdokumentována.
čtrnáct 06 2 bcVýška SLOVO
16 08 2 bcPlanes SLOVO Jediná platná hodnota v BMP je 1. Toto pole se používá v ikonách a kurzorech Windows.
osmnáct 0A 2 bcBitCount SLOVO Počet bitů na pixel (viz seznam podporovaných bitů v samostatné části níže).
32bitová informační pole (verze 3, 4 a 5)

Níže uvedená tabulka poskytuje přehled polí. Podrobné informace naleznete v sekcích níže.

Pozice
v souboru
(hexadecimální)
Pozice
ve struktuře
(hexadecimální)
Velikost
(bajty)
Název
(verze 3/4/5)
typ WinAPI Popis
0E 00 čtyři biSize
bV4Size
bV5Size
DWORD Velikost této struktury v bajtech, udávající také verzi struktury (viz tabulka verzí výše).
12 04 čtyři biWidth
bV4Width
bV5Width
DLOUHO Šířka rastru v pixelech. Určeno jako celé číslo se znaménkem. Nula a zápor nejsou zdokumentovány.
16 08 čtyři biVýška
bV4Výška
bV5Výška
DLOUHO Celé číslo se znaménkem, které obsahuje dva parametry: výšku rastru v pixelech (absolutní hodnota čísla) a pořadí, ve kterém se řetězce objevují ve dvourozměrných polích (znaménko čísla). Hodnota null není zdokumentována.
1A 0C 2 dvouplošníky
bV4Planes
bV5Planes
SLOVO Jediná platná hodnota v BMP je 1. Toto pole se používá v ikonách a kurzorech Windows.
1C 0E 2 biBitCount
bV4BitCount
bV5BitCount
SLOVO Počet bitů na pixel (viz seznam podporovaných bitů v samostatné sekci níže ).
1E deset čtyři biCompression
bV4V4Compression [12]
bV5Compression
DWORD Určuje způsob ukládání obrazových bodů (viz část níže ).
22 čtrnáct čtyři biSizeImage
bV4SizeImage
bV5SizeImage
DWORD Velikost pixelových dat v bajtech. Může být nastaveno na nulu, pokud je úložiště dvourozměrné pole.
26 osmnáct čtyři biXPelsPerMeter
bV4XPelsPerMeter
bV5XPelsPerMeter
DLOUHO Počet pixelů na metr vodorovně a svisle (viz část " Rozlišení obrázku " v tomto článku).
2A 1C čtyři biYPelsPersPerMeter
bV4YPelsPerMeter
bV5YPelsPerMeter
DLOUHO
2E dvacet čtyři biClrUsed
bV4ClrUsed
bV5ClrUsed
DWORD Velikost tabulky barev v buňkách.
32 24 čtyři biClrImportant
bV4ClrImportant
bV5ClrImportant
DWORD Počet buněk od začátku tabulky barev po poslední použitou (včetně sebe).
Přidáno ve verzi 4
Pozice
v souboru
(hexadecimální)
Pozice
ve struktuře
(hexadecimální)
Velikost
(bajty)
Název
(verze 4/5)
typ WinAPI Popis
36 28 čtyři bV4RedMask
bV5RedMask
DWORD Bitové masky pro extrakci hodnot kanálu : červená, zelená, modrá intenzita a hodnota alfa kanálu.
3A 2C čtyři bV4GreenMask
bV5GreenMask
DWORD
3E třicet čtyři bV4BlueMask
bV5BlueMask
DWORD
42 34 čtyři bV4AlphaMask
bV5AlphaMask
DWORD
46 38 čtyři bV4CSType
bV5CSType
DWORD Druh barevného prostoru .
4A 3C 36 bV4Endpoints
bV5Endpoints
CIEXYZTRIPLE Hodnota těchto čtyř polí se bere v úvahu pouze v případě, že pole CSType obsahuje 0 (LCS_CALIBRATED_RGB). Poté jsou v těchto polích zadány koncové body a hodnoty gama pro tři barevné složky.
6E 60 čtyři bV4GammaRed
bV5GammaRed
DWORD [13]
72 64 čtyři bV4GammaGreen
bV5GammaGreen
DWORD [13]
76 68 čtyři bV4GammaBlue
bV5GammaBlue
DWORD [13]
Přidáno ve verzi 5
Pozice
v souboru
(hexadecimální)
Pozice
ve struktuře
(hexadecimální)
Velikost
(bajty)
název typ WinAPI Popis
7A 6C čtyři bV5Záměr DWORD Předvolby vykreslování rastru .
7E 70 čtyři bV5ProfileData DWORD Bytový posun profilu barev od začátku BITMAPINFO (viz také část Profil barev dále v tomto článku).
82 74 čtyři bV5ProfileSize DWORD Pokud je barevný profil přímo zahrnut v BMP, je zde uvedena jeho velikost v bajtech.
86 78 čtyři bV5Vyhrazeno DWORD Rezervováno a musí být nastaveno na nulu.

Bitness obrázku (pole BitCount)

Pole BitCount obsahuje počet bitů na pixel. Pokud je tam uvedena nenulová hodnota, jedná se o skutečnou bitovou hloubku. Pokud jsou pixely uloženy ve formátu JPEG nebo PNG, je uveden nulový obsah pole BitCount. Potom bude skutečná bitová hloubka určena těmito formáty. Bity čistého formátu BMP jsou uvedeny v tabulce níže:

Bit Byte BITMAPINFO RLE Masky kanálů Softwarová podpora
JÁDRO 3, 4, 5 Windows 9x a NT Windows CE a Mobile GDI+ a .NET
jeden Ano Ano Ne Ne Ano Ano Ano
2 ¼ Ano Ano Ne Ne Ne Ano Ne
čtyři ½ Ano Ano Ano Ne Ano Ano Ano
osm jeden Ano Ano Ano Ne Ano Ano Ano
16 2 Ne Ano Ne Ano Ano Ano Ano
24 3 Ano Ano Ne Ne Ano Ano Ano
32 čtyři Ne Ano Ne Ano Ano Ano Ano
48 6 Ne Ano Ne Ne Ne Ne Ano
64 osm Ne Ano Ne Ne Ne Ne Ano

Poznámky k tabulce:
1. Sloupec "BITMAPINFO" zobrazuje podporu bitové hloubky pouze od společnosti Microsoft.
2. Windows CE 1.0 a 1.01 podporují pouze bitové hloubky 1 a 2 [14] .
3. GDI+ verze 1.0 16bitové barevné kanály lze pouze číst a okamžitě je převést na 8bitové [15] .

V bitových hloubkách 8 a nižších je barva pixelu označena indexem v tabulce barev, ve vyšších bitech přímou hodnotou v barevném modelu RGB . Alfa kanál lze volitelně přidat v 16 a 32 bitech, v 64 bitech je trvale přítomen.

Tabulka ukazuje pouze bitness, který Microsoft zdokumentoval. Samotný formát neobsahuje žádná zásadní omezení pro použití jakýchkoli zde neuvedených bitů.

1bitové soubory BMP s čistě černou (bit off) a bílou (bit on) se nazývají monochromatické. Takové soubory se obvykle používají jako masky pro jiné bitmapy. Možná jste neustále naráželi právě na takové 1bitové rastry. Formát Windows Bitmap ve skutečnosti neklade žádná omezení na to, jaké barvy budou použity pro jednotlivé bitové hodnoty.

Můžete se také setkat s následujícími názvy bitů: CGA pro dva bity, EGA pro čtyři, HiColor (HighColor) pro 16 bitů, TrueColor pro 24 a 32 bitů s průsvitností, DeepColor pro vysoké bity a případně další. Tyto názvy pocházejí z vývoje barevných bitmapových displejů a odkazují spíše na jejich barevnou hloubku . V době, kdy byl tento článek napsán (2014), se takové názvy již dlouho nepoužívaly kvůli silnému rozšíření 24bitových zařízení (místo toho je jednoduše uvedena barevná hloubka v bitech nebo jejich počet). A soubory BMP s nižší bitovou bitvou se ve větší míře ukládají nikoli pro zobrazení na zařízeních CGA nebo EGA, ale pro kompaktnost ve srovnání s 24bitovými a 32bitovými formáty při použití malého počtu barev.

Kompresní pole

Pro každou skupinu bitů se používají samostatné omezené hodnoty komprese, ale v souhrnu jsou jejich hodnoty jedinečné. Microsoft zdokumentoval následující hodnoty (v tabulce jsou uvedeny názvy konstant od této společnosti):

Význam Konstantní jméno Platí
pro BitCount
Úložiště pixelů Výškový znak Verze Windows
9x/NT CE
0 BI_RGB jakékoli kromě nuly dvourozměrné pole +/- 95/NT3.1 CE 1.0
jeden BI_RLE8 osm RLE kódování + 95/NT3.1 (ne pod.)
2 BI_RLE4 čtyři RLE kódování + 95/NT3.1 (ne pod.)
3 BI_BITFIELDS 16 a 32 2D pole s maskami barevných kanálů +/- 95/NT3.1 CE 2.0
čtyři BI_JPEG 0 ve vloženém souboru jpeg ?/− [16] 98/2000 (ne pod.)
5 BI_PNG 0 ve vloženém souboru PNG ?/− [16] 98/2000 (ne pod.)
6 BI_ALPHABITFIELDS 16 a 32 2D pole s barvami a maskami alfa kanálů +/- (ne pod.) .NET 4.0

Vzorník barev

Tabulka barev je součástí bloku BITMAPINFO a lze ji použít dvěma způsoby:

  1. Je nutně přítomen v bitových hloubkách 8 a nižších, ve kterých je barva pixelu určena indexem buňky z něj.
  2. V bitových hloubkách 8 a vyšších, ve kterých je barva indikována okamžitou hodnotou, je tabulka přítomna, pokud je použita hlavička jiné než CORE verze, ve které pole ClrUsed obsahuje nenulovou hodnotu. Zde se již používá k optimalizaci barev při práci se zařízeními pomocí palet (v dokumentaci není přesně řečeno, jak se optimalizace provádí).

Pozice tabulky barev je určena od jejího začátku bloku BITMAPINFO. Standardně přichází hned za informační strukturou (její velikost bez znaménka v bajtech lze přečíst z prvního 32bitového pole). Ale mezi strukturou s poli a tabulkou barev lze pro extrakci barevných kanálů použít čtyřbajtové bitové masky (platí pouze pro 16 a 32 bity). Jsou zde pouze v případě, že je použita informační struktura verze 3 (Velikost = 40) a pole Komprese obsahuje 3 (BI_BITFIELDS) nebo 6 (BI_ALPHABITFIELDS). Potom je třeba k velikosti informačních polí přidat 12 bajtů (pokud je zadáno BI_BITFIELDS) nebo 16 bajtů (pokud je zadáno BI_ALPHABITFIELDS) [17] . Ukazuje se 6 možností umístění stolu:

Verze
záhlaví
Pozice (hexadecimální) Poznámky
V souboru V BITMAPINFO
JÁDRO 1A 0C masky kanálů nejsou podporovány
3 36 28 Komprese neobsahuje 3 nebo 6
42 34 Komprese = 3 (BI_BITFIELDS)
46 38 Komprese = 6 (BI_ALPHABITFIELDS)
čtyři 7A 6C masky kanálů jsou vloženy
do informačních polí
5 8A 7B

Počet buněk v tabulce je určen poli BitCount a ClrUsed. Při bitové hloubce 8 a méně se maximální počet buněk v tabulce bere jako 2 bity : 2 v jednobitovém rastru, 4 ve dvoubitovém rastru, 16 ve 4bitovém rastru a 256 v 8 - bit jedna. V dané bititě tabulka vždy obsahuje tento maximální počet buněk, pokud je použita hlavička verze CORE (Velikost = 12) nebo pokud pole ClrUsed obsahuje v jiných verzích 0. Ve všech ostatních případech bez ohledu na bitovou hodnotu tabulka obsahuje tolik buněk, kolik je uvedeno v poli ClrUsed [18] .

Tabulka samotná je jednorozměrné pole, které může obsahovat tři typy buněk:

  1. 32bitová struktura RGBQUAD . Používá se, pokud je v BITMAPINFO použita informační struktura verze 3, 4 nebo 5. V samotné struktuře RGBQUAD je barva v modelu RGB uvedena ve čtyřech bajtových buňkách (všechny mají typ BYTE WinAPI): rgbBlue (modrá) , rgbGreen (zelená), rgbRed (červená) a rgbReserved (rezervovaná a musí být nastavena na nulu).
  2. 24bitová struktura RGBTRIPLE . Platí, pokud BITMAPINFO začíná strukturou BITMAPCOREHEADER. RGBTRIPLE se skládá ze tří bajtových buněk (WinAPI typu BYTE), které určují barvu v modelu RGB : rgbtBlue (modrá), rgbtGreen (zelená) a rgbtRed (červená).
  3. 16bitové indexy barev (celá čísla bez znaménka) v aktuální logické paletě kontextu zařízení ( systémové objekty Windows GDI ). Toto zobrazení je dostupné pouze při spuštěné aplikaci. Formát BMP nepodporuje explicitní označení použití takové tabulky, a proto na to aplikace sama upozorní funkce WinAPI ve speciálních parametrech (obvykle konstanta DIB_PAL_COLORS).

V celé tabulce nelze použít všechny buňky a pole ClrImportant obsahuje počet buněk od začátku tabulky po poslední použitou (včetně sebe). Hodnota 0 v poli ClrImportant znamená, že je použita celá tabulka. Zapojené buňky je lepší umístit na úplný začátek tabulky a doporučuje se seřadit je v sestupném pořadí podle důležitosti (v případě, že musíte snížit jejich počet).

Masky pro extrahování hodnot barevného kanálu

Pokud je obraz 16 nebo 32 bitů, lze pro extrakci barevných kanálů zadat 32bitové masky. Je to proto, že 16 není násobkem 3, a proto mohou být bity přiděleny různými způsoby. Pro pohodlí používají 32bitové obrázky 8bitové kanály, a proto se jejich podpora může zdát nadbytečná. Ve skutečnosti zde maska ​​umožňuje povolit / zakázat alfa kanál nebo nastavit pořadí komponent, které vám vyhovuje, a nejen upravit jejich rozlišení. Při použití masek je buňka pixelu čtena celá jako odpovídající strojové slovo v little-endian.

Přítomnost bitových masek závisí na verzi informačních polí struktury BITMAPINFO a pole Komprese v ní. Pro verzi CORE nelze zadat libovolné masky, protože neexistuje pole Komprese a samostatná pole masky. V jiných verzích jsou masky barev povoleny, pokud komprese obsahuje 3 (BI_BITFIELDS). Maska alfa kanálu se vždy používá ve verzích 4 a 5. Protože Windows CE nepodporuje tyto dvě verze, ve kterých je pro ně speciální pole, byla pro třetí verzi zavedena hodnota 6 (BI_ALPHABITFIELDS) pole Komprese, který přidává jak barevné masky, tak maskovací alfa kanál (podporovaný od Windows CE .NET 4.0).

Pozice bitových masek je pevná bez ohledu na verzi záhlaví: 36 h v celém souboru nebo 28 h od začátku bloku BITMAPINFO. Ve verzích 4 a 5 se na tomto místě nacházejí pole určená přímo pro ně. Ve verzi 3 by se bitové masky měly nacházet hned za informačními poli, a tak přesně spadají do pozic odpovídajících polí ve starších verzích. Vezměte prosím na vědomí, že ve třetí verzi, pokud existují masky, je tabulka barev posunuta o 12 nebo 16 bajtů dopředu, umístěná bezprostředně za nimi. 4bajtové barevné masky jsou v pořadí červená, zelená, modrá. Maska alfa kanálu je již za nimi.

Dokumentace společnosti Microsoft se vztahuje pouze na jeden povinný požadavek na bitové masky: každá maska ​​musí být souvislá. O případu průniku masek je tam řečeno, že je žádoucí to nedělat [19] . Microsoft také říká, že není nutné používat všechny bity pixelu [20] . Neexistují žádné požadavky na obsah nepoužitých bitů.

Všimněte si, že nikdo nezaručuje, že lze použít masky širší než 8 bitů. A nic se neříká o případě, kdy jakýkoli kanál bude mít nulovou masku (například když se opravdu nepoužívá). Zde je možná situace, kdy všechny komponenty budou mít nulové masky a zůstane jeden alfa kanál (který v tomto případě může obsadit všechny bity). Nulová maska ​​barevného kanálu může být interpretována dvěma způsoby: její hodnota je brána jako nula, nebo pixely tohoto kanálu nejsou při kreslení ovlivněny. Pokud vezmeme první interpretaci s jediným alfa kanálem, pak alfa kanál v podstatě nastaví stupeň zčernání pixelu. Kromě vágních možností je tu i jedna zajímavá. Vzhledem k tomu, že křižovatky nejsou zakázány, je možné nastavit všechny kanály do jedné polohy a tím získat stupně šedi .

Některý software má omezenou sadu podporovaných bitových masek. Níže uvedená tabulka uvádí možnosti dostupné v těchto omezených prostředích:

Bitness * Hodnoty masky (hexadecimálně) Softwarová podpora
Červené Zelená Modrý Alfa Nepoužitý Windows 9x [21] GDI+ [22] a .NET [23]
16 (A) 7C00 03E0 001F 0000 8000 Ano Ano
7C00 03E0 001F 8000 0000 Ne Ano
F800 07E0 001F 0000 0000 Ano Ano
(b) FFFF FFFF FFFF 0000 0000 Ne Ano
32 (A) 00FF:0000 0000:FF00 0000:00 FF 0000:0000 FF00:0000 Ano Ano
00FF:0000 0000:FF00 0000:00 FF FF00:0000 0000:0000 Ne Ano

Poznámky k tabulce:
(a) Tyto sady se standardně používají při 16 a 32 bitech, pokud nejsou specifikovány masky pro extrakci barev.
(b) Tato sada masek ve své podstatě implementuje 16bitové stupně šedi.

Pixelová data

V souboru lze polohu pixelových dat nalézt v poli OffBits struktury BITMAPFILEHEADER. Za běhu aplikace ukládá adresu pixelových dat tam, kde je to vhodné. V dokumentaci Microsoftu jsou také zmíněny tzv. sbalené bitmapy , které jsou označeny jedinou adresou bloku BITMAPINFO. U takových bitmap následují pixelová data bezprostředně za záhlavím (včetně, kromě informačních polí, bitových masek a barevné tabulky) [24] .

Velikost pixelových dat v bajtech je uložena v poli SizeImage struktury BITMAPINFO. Je tam zapsána „surová“ velikost toho souvislého bloku, který obsahuje data pro tvorbu pixelů (bez ohledu na formát), a ne nějaký rozbalený. Ve výchozím nastavení musí toto pole obsahovat aktuální hodnotu, protože jej lze použít k přesnému zjištění, kolik bajtů by se mělo ze souboru přečíst, abychom získali pixely. Je však legální ponechat toto pole nulové při ukládání pixelů jako dvourozměrných polí (když pole Komprese obsahuje hodnotu 0 (BI_RGB), 3 (BI_BITFIELDS) nebo 6 (BI_ALPHABITFIELDS) [25] ). Pak lze velikost pixelů v případě potřeby poměrně rychle vypočítat na základě bitové hloubky, šířky a výšky rastru.

Existují tři způsoby, jak uložit obrazové body ve formátu Windows Bitmap (viz také část Kompresní pole v tomto článku):

  1. 2D pole .
  2. RLE kódování (pouze pro 4 a 8 bitů).
  3. Ve formátech JPEG nebo PNG .

Níže uvedené podsekce popisují každou z nich samostatně.

Určení barvy a hodnoty alfa kanálu

K určení barvy při uložení ve formátu BMP se bez ohledu na to, jak je specifikována, používají pouze celá čísla bez znaménka. Samotnou barvu pixelu lze nastavit dvěma způsoby:

  1. Index v tabulce barev (s bitovou hloubkou 8 a nižší).
  2. Okamžitá hodnota v barevném modelu RGB (s bity nad 8).

Druhý je užitečný, když je sada barev poměrně velká nebo nepředvídatelná (například při zpracování obrazu). První metoda poskytuje jak kompaktní rozvržení s malou sadou barev, tak určité pohodlí při správě použitých barev (stačí změnit hodnotu barvy v paletě). Samotná tabulka barev je specifikována buď jako 16bitové indexy bez znaménka v systémové paletě (viz část " Tabulka barev " v tomto článku), nebo v RGB jako v pixelu, ale výhradně pomocí 8bitových hodnot kanálu.

Index v tabulce barev je číslo buňky v ní od začátku tabulky (používá se souvislé číslování od nuly). Pro každou bitovou hloubku je maximální index zásadně omezen hodnotou 2 bitová hloubka - 1. Ve skutečnosti je omezen i počtem prvků v tabulce (podrobnosti v sekci " Tabulka barev " tohoto článku). Společnost Microsoft nezdokumentovala chování, když je zadán index mimo tabulku, ale GDI v tomto případě bere černou barvu.

V bitových hloubkách nad 8 je barva pixelu indikována přímo v barevném modelu RGB: úroveň červené, zelené a modré je indikována samostatně. Nulová hodnota kteréhokoli z kanálů znamená úplnou absenci odpovídajícího odstínu a maximum: jeho úplnou přítomnost. Rozlišení hodnot kanálu je variabilní a má své vlastní v každé bitové hloubce (konkrétní hodnoty naleznete v části o ukládání pixelů ve dvourozměrném poli tohoto článku). Přitom v bitových hloubkách 16 a 32 lze nastavit nejen libovolné rozlišení, ale i individuální pro každý kanál (např. 5 bitů pro červenou a modrou, ale 6 bitů pro zelenou). Navzdory velkému množství možností nastavení rozlišení hodnot není v dokumentaci Microsoftu uvedeno, jak změnit rozlišení hodnoty. Z tohoto důvodu mohou různí výrobci softwaru získat různé výsledky při změně bitové hloubky.

Při přímém nastavování barvy pixelu, kromě hodnot RGB, umožňuje formát Windows Bitmap volitelně také nastavit hodnoty alfa kanálu . Pokud jde o bitovou hodnotu a kódování hodnot, je shodný s barevnými kanály: má libovolnou bitovou hodnotu a používají se celá čísla bez znaménka. Pokud jde o shodu hodnot, nula odpovídá úplné průhlednosti a maximální dostupný počet odpovídá úplnému vyplnění.

Dvourozměrné pole

Pixely libovolné bitové hodnoty mohou být uloženy ve dvourozměrném poli. Při této metodě ukládání obsahuje pole Komprese hodnotu 0 (BI_RGB), 3 (BI_BITFIELDS) nebo 6 (BI_ALPHABITFIELDS). Pokud se použije hlavička verze CORE, pak jsou pixely stejně uloženy pouze jako dvourozměrné pole.

V tomto rozložení jsou rastrové pixely zapsány jako jednopixelové vodorovné pruhy, které Microsoft ve své dokumentaci často nazývá „ skenuje “ (v ruštině je nejbližší slovo lines ). V paměti jsou tyto řádky zapsány v pořadí, ale s kladnou Výška: počínaje od spodního ( anglicky  bottom-up bitmap ) a se zápornou Height: od samého vrcholu ( anglicky  top-down bitmap ). V každém vodorovném řádku jsou pixely zapsány pouze zleva doprava. Pixely menší než 8 bitů jsou umístěny v bajtech a vyplňují bity od nejvyšší k nejnižší, což má za následek hexadecimální/binární číselné hodnoty pixelů podobnější výstupnímu obrázku. Pokud je bitová hloubka 16 nebo 32, pak je zpracování prováděno celými strojovými slovy stejné velikosti s pořadím bitů od nízké po vysokou (little-endian). Řádky bez ohledu na velikost buňky musí být doplněny nulami až do násobku čtyř bajtů velikosti [8] . Z tohoto důvodu se při nenásobné šířce obrázku mohou na konci řádků objevit nevyužité bity nebo celé bajty. Ale díky zaručené násobnosti velikosti řádku lze zpracování provádět s 8-, 16- nebo 32-bitovými strojovými slovy, jak si vyberete. A Microsoft má stále následující trend v bitových hloubkách větších než 8: modrá (modrá) složka je umístěna v nižších bitech / prvních bajtech, zelená (zelená) v dalších a červená (červená) je starší / nejvzdálenější, a pokud existuje alfa kanál, pak je v nejvýznamnějších bitech/posledních bajtech.

Níže uvedený diagram ukazuje uspořádání pixelů v bitech menších než 8 :

bitů 7 6 5 čtyři 3 2 jeden 0
1 bit 0 jeden 2 3 čtyři 5 6 7
2 bity 0 jeden 2 3
4 bity 0 jeden

Při 16 a 32 bitech jsou pixely zpracovávány strojovými slovy stejné velikosti (za předpokladu pořadí bajtů little-endian), která aplikují masky bitů kanálu . Pokud nejsou zadány žádné jednotlivé bitové masky, bude struktura vypadat následovně. Při 16 bitech je každému kanálu přiřazeno 5 bitů. Modrá je v nejméně významných bitech (maska ​​001F 16 ), zelená je na pozici 5 (maska ​​03E0 16 ), červená: začíná od 10. bitu (maska ​​7C00 16 ) a zbývající nejvýznamnější bit 15 se nepoužívá. Pokud je použito 32 bitů, pak je standardně každému kanálu přiřazen bajt (8 bitů). Komponenty jsou uspořádány podobně: modrá v nízkých bitech (maska ​​0000:00FF 16 ), zelená začínající bitem 8 (maska ​​0000:FF00 16 ), červená začínající bitem 16 (maska ​​00FF:0000 16 ) a horní bajt je nepoužívá se (používá se jako alfa kanál, pouze pokud jej zobrazíte přímo) [26] . Protože se předpokládá, že se čte v pořadí bajtů little-endian, pokud čtete hodnoty z paměti bajt po bajtu, budou ve stejném pořadí (modrá bude na prvním místě).

S bitovou hloubkou 24 má každý kanál bajt a s bitovou hloubkou 48 a 64 : 16bitové strojové slovo. Ve všech třech případech v paměti jdou barevné složky v pořadí: modrá, zelená, červená. V 64bitových BMP jsou barvy navíc následovány 16bitovým alfa kanálem. Pokud chcete zpracovat 64bitový pixel jedním strojovým slovem, pak v little-endian blue bude spodních 16 bitů a alfa kanál bude ve vyšších. Zelená bude vedle červené a modrá - vedle alfa. A můžete vidět, že ve 24 bitech formát pixelů odpovídá struktuře RGBTRIPLE z tabulky barev.

RLE kódování

Použití kódování RLE společností Microsoft je zdokumentováno pouze pro bitové hloubky 4 a 8. Při použití v BITMAPINFO musí pole Komprese obsahovat 2 (BI_RLE4) při bitové hloubce 4 nebo 1 (BI_RLE8) s osmibitovými pixely. Výška rastru musí být zadána jako kladné číslo.

Ve formátu Windows Bitmap lze kódování RLE přirovnat ke kreslení pomocí jednoduchých příkazů. Kreslení začíná od levého dolního pixelu (pozor: v rastrech obecně může být levý horní pixel známější) a pokračuje doprava a nahoru. Pixely mimo velikost bitmapy nejsou vykresleny (toto není uvedeno v dokumentaci, ale GDI vykazuje toto chování). Instrukce RLE umožňují přerušit kreslení vodorovné čáry, celého obrázku a také přesunout kreslící kurzor na jinou pozici. V důsledku toho se některé pixely nemusí vykreslit. Dokumentace výslovně neuvádí barvy pro nevykreslené pixely, v důsledku čehož se může interpretace lišit: chybějící pixely buď zůstanou průhledné, nebo získají barvu s indexem 0. Pokud uděláme první předpoklad, pak můžeme říci, že 4- a 8 -bitové režimy díky RLE implicitně podporují transparentnost, ale toto chování není zaručeno.

Tvorba obrazu při RLE kódování se provádí příkazy. Každý příkaz musí nutně začínat sudou adresou (zarovnanou na 16bitovou hranici). Existuje pět příkazů, které jsou definovány dvojicí bajtů:

Bajt 1
(hexadecimálně)
Bajt 2
(hexadecimálně)
Popis
01..FF _ _ 00..FF _ _ Počínaje aktuální pozicí a pohybem doprava nakreslete tolik pixelů, kolik je určeno v prvním bajtu. Hodnoty pro pixely jsou převzaty z druhého bajtu. V 8bitových BMP je celý bajt hodnotou. Ve 4bitech se z něj postupně odebírá nejvyšší nibble a poté nejnižší nibble (čtyři bity).
00 00 Přesuňte kurzor na začátek (zcela vlevo) další (horní) horizontály.
00 01 Zastavit kreslení (dosaženo konce).
00 02 Posuňte kurzor doprava a nahoru o hodnoty zadané v následujících dvou bytech. První následující bajt obsahuje hodnotu pro horizontální posun a další bajt obsahuje hodnotu pro vertikální posun. Obě hodnoty: celá čísla bez znaménka (nelze je posunout doleva ani dolů).
00 03..FF _ _ Z aktuální pozice a dále doprava nakreslete pixely s hodnotami, které následují za tímto párem bajtů. Druhý bajt příkazu obsahuje počet pixelů, které se mají překreslit (jmenovitě pixely, nikoli bajty). V 8bitovém rastru se bajtový proud bere tak, jak je. Ve 4bitech se již čtou nibble: horní 4 bity z bajtu pro první pixel, spodní 4 bity pro další atd. z následujících bajtů. Tento proud může končit lichým počtem bajtů a instrukce vyžadují 16bitové zarovnání. Pokud k tomu dojde, přidá se další bajt (na jeho obsahu nezáleží).

Po dosažení pravého okraje vodorovné roviny se neprovádí žádný posun na další. Proto je potřeba konkrétně vložit příkaz k ukončení řádku. A jak můžete vidět z tabulky, sada příkazů vám neumožňuje posunout se dolů nebo vrátit se do vodorovné polohy. Proto můžete přestat kreslit, pokud dosáhnete horního okraje.

Vkládání dat ve formátech JPEG a PNG

Počínaje Windows 98/ME a 2000/XP vám systémové funkce umožňují ukládat pixely ve formátech JPEG a PNG . O míře podpory těchto dvou formátů systémem není nic známo.

Chcete-li vložit JPEG nebo PNG, musíte resetovat pole BitCount v BITMAPINFO a zadat hodnotu 4 (BI_JPEG) nebo 5 (PI_PNG) v Compression. Hodnota pole SizeImage se v tomto případě bude rovnat velikosti souboru JPEG nebo PNG, který je vložen na místo obrazových dat tak, jak je. Šířka a výška v záhlaví jsou již uvedeny pro dekódovaný obrázek. O znaménku pole Výška pro tento konkrétní případ dokumentace přímo nic neříká, ale zřejmě je nutné zapsat zápornou hodnotu [16] .

Rozlišení obrázku

Pro porovnání bezrozměrných pixelů s rozměry materiálu se používají pole XPelsPerMeter a YPelsPerMeter. V těchto polích celé číslo udává, kolik pixelů v tomto obrázku připadá na jeden lineární metr, samostatně horizontálně (XPelsPerMeter) a vertikálně (YPelsPerMeter). Microsoft deklaroval tato dvě pole jako číselný typ se znaménkem, ale dokumentace neříká nic o záporných hodnotách. O hodnotě nula se také nic neříká, ale je logičtější ji brát jako neurčité rozlišení, když je neznámá nebo nemá žádnou hodnotu.

Rozlišení se často uvádí ne s odkazem na metrické rozměry, ale v bodech na palec ( DPI / PPI ). Pro posun tam a zpět se bere palec rovný 25,4 mm (anglický palec). Matematické vzorce pro převod pixelů/palec (PPI) na pixely/metr (PPM) a naopak:

Pokud máte zájem o přesný celočíselný překlad, pak vyjdou následující výrazy:

PPM = (PPI * 5000 + 64) / 127 PPI = (PPM * 127 + 2500) / 5000

Po nich se zaokrouhlí na nejbližší celé číslo. Pokud chcete zaokrouhlit dolů, nepřidávejte polovinu dělitele. Pokud chcete nahoru, přidejte dělitel zmenšený o jedna.

Níže jsou uvedeny předem vypočítané hodnoty PPM pro některé PPI/DPI:

  • 96 ppi ≈ 3780 str./min (pro monitory Microsoft)
  • 72 ppi ≈ 2835 ppm ( Apple pro monitory)
  • 150 dpi ≈ 5906 str./min
  • 300 dpi ≈ 11811 str./min
  • 600 dpi ≈ 23 622 str./min

Barevný prostor

V informačních polích je hlavním polem určujícím barevný prostor pole CSType. Jeho povolené hodnoty jsou uvedeny v tabulce níže:

Význam
BITMAPINFO verze [27]
Konstantní jméno Popis
hex Text
0 (Ne) čtyři LCS_CALIBRATED_RGB Úprava na základě hodnot Endpoints, GammaRed, GammaGreen a GammaBlue.
73524742 'sRGB' čtyři LCS_sRGB Je použit barevný prostor sRGB .
57696E20 "Vyhrát" [28] čtyři LCS_WINDOWS_COLOR_SPACE Výchozí systémový prostor (sRGB).
4C494E4B 'ODKAZ' 5 PROFILE_LINKED Barevný profil v jiném souboru.
4D424544 'MBED' 5 PROFILE_EMBEDDED Barevný profil obsažený v tomto souboru.

Microsoft deklaroval hodnoty konstant nikoli jako číselné hodnoty, ale jako čtyřznakové textové hodnoty [29] . V tomto případě tvoří kódy znaků bajty 32bitové hodnoty (kód ASCII znaku zcela vpravo je dolní bajt, kód znaku nejvíce vlevo je horní bajt). Při prohlížení binárního obsahu souboru jako textu se takové hodnoty zakódované v ASCII zobrazí pozpátku (například „KNIL“ spíše než „LINK“).

Koncové body a hodnoty gama

Formát Windows Bitmap umožňuje korekci barev zadáním červených, zelených a modrých koncových bodů a také hodnot gama . K tomu musí pole CSType obsahovat hodnotu 0 (LCS_CALIBRATED_RGB). Opravné hodnoty se zapisují do polí Endpoints, GammaRed, GammaGreen a GammaBlue (u ostatních hodnot CSType jsou tato čtyři pole ignorována).

36bajtové pole EndPoints je struktura CIEXYZTRIPLE, která se skládá ze tří polí ciexyzRed (červený koncový bod), ciexyzGreen (zelený bod) a ciexyzBlue (modrý). Tato tři pole jsou zase také CIEXYZ struktury se třemi poli ciexyzX, ciexyzY a ciexyzZ typu FXPT2DOT30. PXPT2DOT30 je 32bitové číslo s pevnou řádovou čárkou bez znaménka se 2 vysokými bity pro celočíselnou část a 30 nízkými bity pro zlomkovou část.

Hodnota gama se zapisuje do příslušných polí pro každý barevný kanál zvlášť: GammaRed (červená), GammaGreen (zelená) a GammaBlue (modrá). V deklaraci informačních struktur Microsoft pro tato pole specifikoval typ DWORD. Zároveň je v souboru WinGDI.h vhodnější deklarace typu FXPT16DOT16 (na základě typu long), což je 32bitové číslo bez znaménka se zlomkovou částí v dolních 16 bitech a celé číslo. část v 16 vyšších. Je třeba poznamenat, že v MSDN je na stránkách o strukturách BITMAPV4HEADER a BITMAPV5HEADER vše řečeno. V článku o struktuře LOGCOLORSPACE je řečeno, že v podobných polích by měl být vysoký a nízký bajt nastaven na nulu (ve skutečnosti je místo formátu 16.16 použit formát 8.8, který je umístěn uprostřed 32 -bitová buňka) [30] .

Níže jsou uvedeny hodnoty výše uvedených čtyř polí podle barevného prostoru sRGB [31] :

Pole Význam
Zlomkové hex
EndPoints.ciexyzRed.ciexyzX 0,64 28F5C28F
EndPoints.ciexyzRed.ciexyzY 0,33 151EB852
EndPoints.ciexyzRed.ciexyzZ 0,03 01EB851F
EndPoints.ciexyzGreen.ciexyzX 0,30 13333333
EndPoints.ciexyzGreen.ciexyzY 0,60 26666666
EndPoints.ciexyzGreen.ciexyzZ 0,10 06666666
EndPoints.ciexyzBlue.ciexyzX 0,15 0999999A
EndPoints.ciexyzBlue.ciexyzY 0,06 03D70A3D
EndPoints.ciexyzBlue.ciexyzZ 0,79 328F5C29
GammaRed
GammaGreen
GammaBlue
2.20 0002199A [32]
Barevný profil

V souboru BMP lze v případě potřeby určit barevný profil buď přímým zahrnutím, nebo odkazem na jiný soubor. Profily se objevily v páté verzi BMP a zatím pouze zde jsou pro ně speciální pole. Barevné profily jsou podporovány pouze ve formátu ICC [33] [34] .

Při použití barevných profilů musíte nejprve zadat následující hodnoty pro pole CSType:

  • 4C494E4B 16 (PROFILE_LINKED) - Pokud je profil použit v jiném souboru.
  • 4D424544 16 (PROFILE_EMBEDDED) - pokud je profil přímo vložen do BMP.

V každém případě pole ProfileData určuje posun profilu v bajtech od začátku bloku BITMAPINFO. Pokud je profil vestavěný, pak v ProfileSize musíte zadat jeho velikost v bajtech (pokud je připojitelný, pak by toto pole mělo být nastaveno na nulu). Bez ohledu na variantu Microsoft doporučuje umístit profil za pixelová data při uložení do souboru a hned za nadpis [35] v RAM při interakci s funkcemi WinAPI .

Formát ICC používá ve své hlavičce převážně 32bitové buňky nebo násobky této velikosti buňky [36] . Na základě toho, pokud je profil přímo zahrnut v BMP, pak se doporučuje uložit jej do RAM na adresu, která je násobkem čtyř bajtů.

Pokud je profil externí, místo jeho obsahu je do BMP umístěn textový řetězec s cestou k souboru. Musí být v jednobajtovém kódování Windows 1252 (standardní kódování pro západoevropské jazyky) a končit nulovým bajtem. Dokumentace neříká nic o oddělovačích komponent cesty, a proto s největší pravděpodobností můžete použít obě levá lomítka " \ " a "pravá" "/" . Cesta může být jak relativní, tak úplná a síťová [35] . A protože se při specifikaci cesty používá jednobajtové kódování, není nutné tento řetězec zarovnávat v paměti RAM.

Předvolby vykreslování

Předvolby vykreslování ( anglicky  rendering intents ) zavedlo International Color Consortium ( International Color Consortium) a určují priority v případě, kdy při přechodu z barevného podprostoru podporovaného jedním zařízením ( anglicky  gamut ) do podprostoru jiného jsou barvy použito na obrázku, chybí v cíli. Existuje také definice z ICC, která definuje předvolby vykreslování jako styl mapování barevných hodnot z jednoho popisu obrázku do druhého (originál v angličtině: „style of mapping color values ​​​​from one image description to other“ ) [37 ] . Microsoft zahrnul speciální pole Intent ve formátu BMP, které může nabývat hodnot zcela podle specifikace ICC. Pro více informací se proto prosím podívejte do dokumentace konsorcia, jejíž nejnovější verzi lze stáhnout z color.org [38] . V Microsoftu jsou tyto preference stručně popsány v článku Rendering Intents na MSDN.

Předvolba je uvedena v poli Záměr bloku BITMAPINFO a je dostupná pouze s 5. verzí informačních polí. Hodnoty mohou být následující:

Význam Konstantní název
pro BMP
Název
ICC
Jméno
Microsoft
Konstanta
ze souboru Icm.h
Konstanta
pro DEVMODE
jeden LCS_GM_BUSINESS nasycení Grafický INTENT_SATURATION(2) DMICM_SATURATE(1)
2 LCS_GM_GRAPHICS média-relativní kolorimetrický důkaz INTENT_RELATIVE_COLORIMETRIC(1) DMICM_COLORIMETRIC(3)
čtyři LCS_GM_IMAGES percepční obrázek INTENT_PERCEPTUAL(0) DMICM_CONTRAST(2)
osm LCS_GM_ABS_COLORIMETRIC ICC-absolutní kolorimetrický
(relativní kolometrický)
Zápas INTENT_ABSOLUTE_COLORIMETRIC(3) DMICM_ABS_COLORIMETRIC(4)

Microsoft pro tuto charakteristiku deklaroval minimálně tři sady konstant, které se liší svým významem a používají se na různých místech [39] . Zde jsou pro případ, že byste je potřebovali rychle porovnat. Hodnoty konstant s předponou „INTENT_“ jsou přesně stejné jako hodnoty použité v souborech profilu ICC [40] . Konstanty s předponou "DMICM_" jsou deklarovány v souboru WinGDI.h pro strukturu DEVMODE. Konstanty "LCS_GM_" používané v BMP jsou tam deklarovány a jsou určeny především pro strukturu LOGCOLORSPACE. Existují také názvy vlastností tiskárny. Jsou podobné těm ve sloupci "Název Microsoftu", ale s "Grafika" a "Obrázky".

Výchozí hodnota, která je vhodná především pro fotografie a obrázky, může být 4 (LCS_GM_IMAGES). Jako takový jej doporučuje jak Microsoft [41] , tak ICC [42] .

Příklad programu v C

Následující program otevře 24bitový soubor BMP v XWindow, barevná hloubka musí být 32bitová, ale nefunguje při nižším barevném podání, protože to komplikuje příklad:

/* Kompilováno s řádkem: cc -o xtest xtest.c -I/usr/X11R6/include -L/usr/X11R6/lib -lX11 -lm */ #include <X11/Xlib.h> #include <X11/Xutil.h> #include <X11/Xatom.h> #include <X11/keysym.h> #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> #include <math.h> #include "bitmap.h" /* Definice záhlaví BMP zde, jak je popsáno dříve v tomto článku (struktury musí být sbalené po 2 bajtech!) */ statický XImage * CreateImageFromBuffer ( Display * , unsigned char * , int , int ); main ( int argc , char * argv []) { Displej * dis ; výhra okna ; /* Naše okno */ XEvent událost ; /* Vývoj */ GC gc ; /* Grafický kontext */ XImage * obrázek ; int n , šířka , výška , fd , velikost ; unsigned char * data ; BITMAPFILEHEADER bmp ; BITMAPINFOHEADER inf ; char * buf ; if ( arg < 2 ) { chyba ( "použijte: soubor xtest.bmp \n " ); výstup ( 1 ); } if (( fd = open ( argv [ 1 ], O_RDONLY )) == -1 ) { printf ( "Chyba při otevírání bitmapy \n " ); výstup ( 1 ); } čtení ( fd , & bmp , sizeof ( BITMAPFILEHEADER )); read ( fd , & inf , sizeof ( BITMAPINFOHEADER )); šířka = inf . biWidth ; výška = inf . biVýška ; if (( dis = XOpenDisplay ( getenv ( "DISPLAY" ))) == NULL ) { printf ( "Nelze se připojit X server:%s \n " , strerror ( errno )); výstup ( 1 ); } win = XCreateSimpleWindow ( dis , RootWindow ( dis , DefaultScreen ( dis )), 0 , 0 , šířka , výška , 5 , BlackPixel ( dis , DefaultScreen ( dis )), WhitePixel ( dis , DefaultScreen ( dis ))); XSetStandardProperties ( dis , win , argv [ 1 ], argv [ 0 ], None , argv , argc , NULL ); gc = DefaultGC ( dis , DefaultScreen ( dis )); /* Někdy toto místo není ve struktuře vyplněno */ if ( inf . biSizeImage == 0 ) { /* Vypočítejte velikost */ velikost = šířka * 3 + šířka % 4 ; velikost = velikost * výška ; } jinak { velikost = inf . biSizeImage ; } buf = malloc ( velikost ); if ( buf == NULL ) { chyba ( "malloc" ); výstup ( 1 ); } printf ( "velikost = %d přidělených bajtů \n " , velikost ); /* Přesun na začátek samotného obrázku */ lseek ( fd , bmp . bfOffBits , SEEK_SET ); /* Načíst do vyrovnávací paměti */ n = čtení ( fd , buf , velikost ); printf ( "velikost = %d přečtených bytů \n " , n ); image = CreateImageFromBuffer ( dis , buf , width , height ); /* Smažte vyrovnávací paměť - již ji nepotřebujeme */ zdarma ( buf ); XMapWindow ( dis , win ); XSelectInput ( dis , win , ExposureMask | KeyPressMask ); zatímco ( 1 ) { XNextEvent ( dis , & událost ); if ( event . xany . window == win ) { switch ( event . type ) { případ odhalit : XPutImage ( dis , win , gc , obrázek , 0 , 0 , 0 , 0 , obrázek -> šířka , obrázek -> výška ); zlomit ; pouzdro KeyPress : if ( XLookupKeysym ( & event . xkey , 0 ) == XK_q ) { XDestroyImage ( obrázek ); XCloseDisplay ( dis ); zavřít ( fd ); exit ( EXIT_SUCCESS ); } zlomit ; výchozí : zlomit ; } } } } /* Vytvoří Ximage ze souboru BMP, protože obrázek BMP je uložen obráceně * a zrcadlená smyčka to opraví */ XImage * CreateImageFromBuffer ( Display * dis , unsigned char * buf , int width , int height ) { int hloubka , obrazovka ; XObrázek * img = NULL ; int i , j ; int numBmpBytes ; size_t numImgBytes ; int32_t * imgBuf ; int ind = 0 ; int řádek ; int teplota ; int ih , iw ; /* Čísla řádků a sloupců podle */ int nový_ind ; /* Nový index */ obrazovka = DefaultScreen ( dis ); hloubka = DefaultDepth ( dis , obrazovka ); teplota = šířka * 3 ; čára = teplota + šířka % 4 ; /* Délka řetězce včetně zarovnání */ numImgBytes = ( 4 * ( šířka * výška )); imgBuf = malloc ( numImgBytes ); /* Velikost přidělená pro BMP v souboru, včetně zarovnání */ numBmpBytes = řádek * výška ; for ( i = 0 ; i < numBmpBytes ; i ++ ) { bez znaménka int r , g , b ; /* Přeskočit odsazení */ if ( i >= temp && ( i % line ) >= temp ) pokračovat ; b = buf [ i ]; i ++ ; g = buf [ i ]; i ++ ; r = buf [ i ]; /* Vypočítat nový index tak, aby se odrážel svisle */ iw = ind % šířka ; ih = ind / šířka ; new_ind = iw + ( výška - ih - 1 ) * šířka ; imgBuf [ new_ind ] = ( r | g << 8 | b << 16 ) << 8 ; ind ++ ; } img = XCreateImage ( dis , CopyFromParent , hloubka , ZPixmap , 0 , ( char * ) imgBuf , šířka , výška , 32 , 0 ); XInitImage ( img ); /* Pořadí bitů a bajtů na PC by mělo být takto */ img -> byte_order = MSBFirst ; img -> bitmap_bit_order = MSBFirst ; návrat img ; }

Viz také

  • ICO (File Format)  je příbuzný formát od společnosti Microsoft pro ukládání ikon a kurzorů myši.

Poznámky

  1. 1 2 3 http://fileformats.archiveteam.org/wiki/BMP
  2. https://www.iana.org/assignments/media-types/image/bmp
  3. Leonard S. Windows Image Media Types  (anglicky) - IETF , 2016. - 12 s. doi : 10.17487/RFC7903
  4. http://www.digitalpreservation.gov/formats/fdd/fdd000189.shtml
  5. https://msdn.microsoft.com/en-us/library/dd183391.aspx
  6. Evchenko A. I. OpenGL a DirectX. Grafické programování (pro profesionály), 2006, s. 183.
  7. Viz část „Poznámky“ v článku „ Struktura BITMAPV5HEADER Archived 21 March 2014 at the Wayback Machine “ na MSDN.
  8. 1 2 Viz část „Poznámky“ v článku „ Struktura BITMAPINFO Archivováno 27. února 2014 na Wayback Machine “ na MSDN.
  9. Viz " Bitmap Header Types Archived 22. září 2014 na Wayback Machine " na MSDN.
  10. Informace o verzi jsou převzaty z nápovědy Microsoft Windows SDK, která je součástí sady Microsoft Visual Studio 2008 a Embarcadero RAD Studio 2010 (část Požadavky v článcích o těchto strukturách).
  11. Viz sekce "Požadavky" v " BITMAPCOREHEADER Archived 16. září 2014 na Wayback Machine " a " BITMAPINFOHEADER Archived 19. dubna 2014 na Wayback Machine " pro Windows Mobile 6.5 na MSDN.
  12. Název pole „bV4V4Compression“ zdvojený s „V4“ je uveden v dokumentaci a deklaraci struktury v souboru WinGDI.h (viz například „ Struktura BITMAPV4HEADER Archived 11 October 2013 at Wayback Machine “ na MSDN.).
  13. 1 2 3 Microsoft oznámil pole Gamma* jako DWORD, ale GDI má pro taková pole speciální typ, FXPT16DOT16.
  14. Viz část "Poznámky" v BITMAPINFOHEADER Archivováno 19. dubna 2014 na Wayback Machine (pod "Windows Mobile 6.5") na MSDN.
  15. Viz část „Poznámky“ v článku „ Konstanty formátu obrazových pixelů archivované 4. května 2014 na Wayback Machine “ (pod „GDI+“) na MSDN.
  16. 1 2 3 MSDN obsahuje větu "Pokud je bV5Height záporná, což znamená shora dolů DIB , bV5Compression musí být buď BI_RGB nebo BI_BITFIELDS." (překlad: "Pokud je bV5Height záporná, označující DIB shora dolů, pak bV5Compression musí být buď BI_RGB nebo BI_BITFIELDS" ). Možná zde nebylo objasněno, že se to týká pouze kódování RLE, protože jeden z příkladů kreslení rastru JPEG označuje přesně zápornou výšku (hledejte řádek „bmi.bmiHeader.biHeight“ v článku Testování tiskárny pro JPEG nebo Podpora PNG Archivovaná kopie 14. listopadu 2013 na Wayback Machine “ na MSDN).
  17. Buďte opatrní. V článku MSDN " BITMAPINFOHEADER Archived 19. April 2014 on the Wayback Machine " pro Windows Mobile 6.5 obsahuje popis pole biClrUsed větu "Pokud se biBitCount rovná 16 nebo 32, optimální paleta barev začíná hned po třech maskách DWORD." (překlad: " Pokud je biBitCount 16 nebo 32, pak optimální paleta barev začíná hned po třech maskách DWORD "). Ve stejném článku výše, v popisu pro pole biCompression, je napsáno „Udává, že bitmapa není komprimována a že tabulka barev se skládá ze tří barevných masek DWORD…“ a níže je to podobné jako „sestává ze čtyř barevných masek DWORD “ (překlady: „Udává, že bitmapa není komprimována a že tabulka barev se skládá ze tří barevných masek DWORD“ a „ sestává ze čtyř barevných masek DWORD “). Podobné informace jsou obsaženy v článku " Struktura BITMAPINFOHEADER Archived 9. února 2014 na Wayback Machine " pro Windows 9x/NT. To vše lze interpretovat tak, že v bitových hloubkách 16 a 32 za informačními poli (struktura BITMAPINFOHEADER) jsou nutně tři 32bitové masky pro extrakci hodnot barevných kanálů. Navíc, pokud komprese obsahuje 3 (BI_BITFIELDS) nebo 6 (BI_ALPHABITFIELDS), pak se za ně přidají další tři nebo čtyři podobné masky, které zase zabírají tabulku barev, a znemožňují tak použití 16bitových indexů optimálních barev v logickém paleta (možná v tomto případě v biClrUsed musí být 6 nebo 8 a biClrImportant musí být 0, aby další masky nebyly náhodně zpracovány jako indexy v paletě).
    Ve skutečnosti se věci mají poněkud jinak.
  18. Stránka dokumentace MSDN " Bitmap Header Types Archived 22 September 2014 at Wayback Machine " obsahuje větu "Bitmapy, které mají 1, 4 nebo 8 bpp, musí mít tabulku barev s maximální velikostí založenou na bpp." (překlad: "Bitmapy s bitovou hloubkou 1, 4 nebo 8 musí obsahovat tabulku barev s maximální velikostí odpovídající bitové." ). Toto je zjevně chyba a autor aplikoval podmínky struktury CORE, která by skutečně měla mít maximum (viz sekce „Poznámky“ v článku „ Struktura BITMAPCOREINFO Archived 3 May 2015 at the Wayback Machine “), na všechny ostatní verze struktur. V jiném článku " Struktura BITMAPINFO Archived 24 June 2014 at the Wayback Machine " o tabulce barev říká "Počet položek v poli závisí na hodnotách členů biBitCount a biClrUsed struktury BITMAPINFOHEADER." (překlad: „počet prvků v poli závisí na hodnotách polí biBitCount a biClrUsed struktury BITMAPINFOHEADER“ ) a v článcích struktur verze 3, 4, 5 (viz např. „ Struktura BITMAPV5HEADER Archivováno 11. října 2013 na Wayback Machine “) v popisu pole BitCount je všude napsáno „člen bmiColors BITMAPINFO obsahuje až 256 záznamů“ (podobně jako pro jiná čísla bitů; překlad fráze: „the Člen bmiColors BITMAPINFO obsahuje až 256 záznamů” ).
  19. Viz například popis bitů 16 a 32 pro pole bV5BitCount v článku „ Struktura BITMAPV5HEADER Archived 11 October 2013 at the Wayback Machine “ na MSDN.
  20. V nápovědě MSDN a Microsoft Windows SDK obsahuje článek „ Struktura BITMAPINFOHEADER Archived 9. února 2014 na Wayback Machine “ matoucí větu „Všechny bity v pixelu nemusí být použity.“ (překlad: " Nepoužívejte všechny bity v pixelu "). Jedná se o překlep (napsali „mít“ místo „potřebovat“), který chybí v podobném bloku v článku o páté verzi Archived 11, 2013 on Wayback Machine (ve čtvrté tato věta chybí).
  21. Tyto informace lze nalézt v nápovědě Microsoft Windows SDK, která je součástí hlavních IDE.
  22. Viz „ Image Pixel Format Constants Archived 4 May 2014 at Wayback Machine “ na GDI+ na MSDN.
  23. Viz „ PixelFormat Enumeration Archived 23. června 2013 na Wayback Machine “ o .NET Framework 1.1 na MSDN.
  24. Viz " Poznámky archivované 24. června 2014 na Wayback Machine " v článku "BITMAPINFO" na MSDN.
  25. Dokumentace (například článek „ Struktura BITMAPV5HEADER Archived 11. října 2013 na Wayback Machine “ na MSDN) říká, že pro pole Komprese lze zadat nulovou velikost s hodnotou 0 (BI_RGB). To samozřejmě platí i pro hodnoty 3 (BI_BITFIELDS) a 6 (BI_ALPHABITFIELDS), protože se liší pouze ve vnitřní struktuře pixelů, nikoli v jejich velikosti.
  26. V podstatě jedna ku jedné jako ve struktuře RGBQUAD použité v tabulce barev.
  27. Na MSDN článek „ Struktura BITMAPV4HEADER Archived 11 October 2013 at the Wayback Machine “ zmiňuje pouze jednu hodnotu pole CSType (LCS_CALIBRATED_RGB). Úplný seznam dostupných hodnot pro verze 4 a 5 najdete v tématu Použití struktur ve WCS 1.0 archivované 3. května 2015 na Wayback Machine .
  28. Po "Win" je další mezera.
  29. Použití tohoto stylu konstantních hodnot pouze v poli CSType je pravděpodobně výsledkem vlivu specifikace ICC, ve které jsou 32bitovým značkám přidělovány podobné hodnoty v souborech barevných profilů . 
  30. Viz část „Poznámky“ v článku „ LOGCOLORSPACE Structure Archived 14 April 2013 at the Wayback Machine “ na MSDN.
  31. Čísla převzata z „ Standardní výchozí barevný prostor pro Internet – sRGB archivováno 20. srpna 2011 na Wayback Machine “. Všechny hodnoty byly zaokrouhleny nahoru, pokud byl nastaven úplně první vyřazený pravý bit.
  32. S dolním bytem nastaveným na nulu bude hodnota 00001A00 16 (zaokrouhleno nahoru).
  33. Tento formát je popsán ve specifikaci ICC.1:2010, odkaz na který je na konci tohoto článku.
  34. Viz část „Poznámky“ v článku „ Struktura BITMAPV5HEADER Archived 11. října 2013 na Wayback Machine “ na MSDN.
  35. 1 2 Viz Používání struktur ve WCS 1.0 Archivováno 3. května 2015 na Wayback Machine na MSDN.
  36. Viz část „7.2 Hlavička profilu“ ve specifikaci ICC.1:2010.
  37. Definice je uvedena ve specifikaci ICC.1:2010 v sekci 3.1.27 na str. 21.
  38. Ve verzi 4.3 specifikace (nejnovější v době psaní tohoto článku) je toto téma rozsáhle pokryto v sekcích "0.4 Rendering intents" (v úvodu; str. 8), "6.2 Rendering intent" (v hlavním obsahu; s. 26) a „D. 6 Diskuse o kolorimetrických záměrech“ (v přílohách; s. 109).
  39. Mapování konstant jsou převzata ze souboru Icm.h (komentovaný blok přímo nad deklaracemi konstant "INTENT_").
  40. Viz část "7.2.15 Pole záměru vykreslení (byty 64 až 67)" specifikace ICC.
  41. Viz část „Picture Intent“ v článku „ Rendering Intents Archived 18. září 2012 na Wayback Machine “ na MSDN.
  42. Ve specifikaci dole na straně 41.

Literatura

Microsoft (MSDN a SDK)

Microsoft Windows SDK  je sada pro vývojáře, která obsahuje soubory nápovědy a soubory C++. K tématu tohoto článku jsou relevantní soubory WinGDI.h a Icm.h, ze kterých byly především převzaty hodnoty konstant. Nejnovější verzi této sady lze zdarma stáhnout z webu společnosti Microsoft (v tomto článku byly použity verze 6.0 a 7.1).

Společnost Microsoft nemá samostatnou specifickou dokumentaci speciálně pro formát BMP. Jeho struktury a další prvky jsou však popsány v rámci subsystému GDI. Tento popis je v nápovědě, která je součástí výše uvedené sady SDK a také na webu MSDN . Navíc je v druhém případě přítomen pro různé platformy a nezávisle v nápovědě Visual Studia. Ve většině případů jsou informace totožné, ale na některých místech může být trochu více faktů (například nápověda SDK obsahuje více informací o podpoře Windows).

Základní informace naleznete v nápovědě GDI pro platformy Windows 9x a NT. Odkazy na stránky v této části, které odkazují pouze na formát, nikoli na funkce WinAPI pro práci s ním:

Platformy Windows Compact 2013 (CE 6.0) a Mobile 6.5 mají pouze popisy tří struktur, ale pro tyto platformy:

Odkazy na další stránky z MSDN související s formátem BMP:

Ostatní

Specifikace správy barev ICC poskytuje informace o profilech barev (včetně formátu souboru ICC) a také o předvolbách vykreslování. Tuto specifikaci lze stáhnout z oficiálních stránek konsorcia color.org . V době psaní tohoto článku je nejnovější verze 4.3 (prosinec 2010). Přímé odkazy na PDF z webu ICC:

  • Specifikace ICC.1:2010 (verze profilu 4.3.0.0) „Správa barev obrazové technologie – architektura, formát profilu a datová struktura“.
  • Errata ke specifikaci (nalezeny chyby a překlepy; publikováno 24. září 2013).