BMP

Tento grafický formát pôvodne pochádza z dielne Microsoft Windows a v tomto operačnom systéme je plne podporovaný. Existuje niekoľko verzií tohto formátu, ale my sa tu budeme zaoberať len verziou Microsoft Windows Version 3.x

Aj keď je formát BMP dobre definovaný, neexistuje oficiálna špecifikácia publikovaná firmou Microsoft. Informácie o štruktúre a kódových metódach sú obsiahnuté v nespočetnom množstve príručiek, manuálov a tiež v Microsoft Windows Software Development Kit (SDK).

Organizácia súboru

Súbor sa dá logicky rozdeliť do štyroch častí: bitmapová hlavička, informačná hlavička, paleta a bitmapa. Z týchto štyroch sekcií je voliteľná iba paleta.

Bitmapová hlavička

typedef struct _Win3xBitmapHeader {
	WORD 	ImageFileType;      /* typ súboru, vždy ("BM") */
	DWORD 	FileSize;           /* fyzická veľkosť súboru v bajtoch */
	WORD	Reserved1;          /* vždy 0 */
	WORD	Reserved2;          /* vždy 0 */
	DWORD	ImageDataOffset;    /* začiatok bitmapových dát ako offset v bajtoch */
} WIN3XHEAD;
		
			
ImageFileType
obsahuje vždy dvojbajtové číslo pre identifikáciu typu súboru. Je to vždy 4D42h, teda BM.
FileSize
je celková veľkosť súboru a mala by sa zhodovať s jeho fyzickou veľkosťou.
ImageDataOffset
je offset v súbore od jeho začiatku, kde začína bitmapová sekcia.

Informačná hlavička

typedef struct _Win3xBitmapInfoHeader {
	WORD	HeaderSize;             /* veľkosť hlavičky */			
	DWORD   ImageWidth;             /* šírka obrázka v bodoch */
	DWORD   ImageHeight;            /* výška obrázku v bodoch */
	WORD    NumberOfPlanes;         /* počet rovín, vždy 1 */
	WORD    BitsPerPixel;           /* počet bitov na bod (1, 4, 8, 24) */
	DWORD   CompressionMethod;      /* použitá kompresná metóda (1, 2, 3) */
	DWORD   SizeOfBitmap;           /* veľkosť bitmapy v bajtoch */
	DWORD   HorzResolution;         /* horizontálne rozlíšenie v bodoch na meter */
	DWORD   VertResolution;         /* vertikálne rozlíšenie v bodoch na meter */
	DWORD   NumColorUsed;           /* počet farieb v obrázku */
	DWORD   NumSignificanttColor;	/* počet dôležitých farieb v palete */
} WIN3XINFOHEAD;
		
HeaderSize
je veľkosť informačnej hlavičky. Jej hodnota je 40.
ImageWidth, ImageHeight
je šírka a výška obrázka.
NubmerOfPlanes
je vždy 1, pretože BMP obrázky majú iba jednu farebnú rovinu.
CompressionMethod
indikuje typ použitého kódovania. 0 určuje, že bitmapa nie je kódovaná. 1 indikuje, že bola použitá osembitová RLE kompresia a 2 indikuje štvorbitovú RLE kompresiu.
SizeOfBitmap
je veľkosť komprimovaných dát v bajtoch. Táto hodnota býva 0, keď sú dáta nekomprimované. Vtedy sa veľkosť bitamových dát počíta z veľkosti obrázka.
HorzResulution, VertResulution
sú vertikálne a horizontálne hotnpty rozlíšenia v bodoch na meter a bývajú použité pre voľbu vhodného zobrazovacieho režimu.
NumColorsUsed
je počet farieb v palete. Ak je táto hosnota 0, potom počet položiek v palete maximálny vzhľadom na danú farebnú paletu NumColorUsed = 1 << BitsPerPixel
NumSignicifantColor
je počet významých farieb v palete, určených podľa ich frekfencie výskytu v obrázku. Teda čím je častejší výskyt farby, tým je významnejšia. Táto hodnota sa používa hlavne pri zobrazovaní na hardware, ktorý podporuje menej farieb ako obrázok pužíva.

Paleta

Všetky 1-, 4- aj 8-bitové BMP obrázky majú paletu. Veľkosť palety závisí od počtu farieb obrázka a je určená v hodnotou NumColorsUsed v informačnej hlavičke.

typedef struct _Win3xPalette {
	RGBQUAD	Palette[];	/* 2, 16, alebo 256 elementov */			
} WIN3XPALETTE;
			
Každá farba je v palete reprezentovaná štvorjbajtovou hodnotou.
typedef struct _Win3xRgbQuad {
	BYTE	Blue;		/* 8-bitová zložka modrej */
	BYTE	Green;		/* 8-bitová zložka zelenej */
	BYTE	Red;		/* 8-bitová zložka červenej */
	BYTE	Reserved;	/* 8-bitová vyhradená hodnota, vždy 0 */
} RGBQUAD;
			
Prvé dve farby v palete bývajú obvykle biela a čierna. Ostatné sú potom v ľubovoľnom poradí.

Obrazové dáta

Zvyšok súbora pozostáva z bitmapových dát, ktoré môžu byť buď nekomprimované, alebo komprimované RLE kompresiou.

V jednobitových obrázkoch reprezentuje jeden bajt osem obrazových bodov, kde najvýznamnejší bit je prvá bodová hodnota. Štvorbajtové obrázky sú uložené ako dva body na jeden baj, kde významnejší nibble je prvý bod, menej významý nibbl eje druhý bod. Osembitové obrazký samozrejme obsahujú jeden bajt na bod. Pri 24-bitových obrázkoch je jeden od reprezentovaný troma po sebe idúcimi bajtami v poradí červený, zelený a modrý kanál. Každý skanovací riadok v BMP súbore je vždy násobkom štyroch bajtov a tento počet je v prípade nutnosti doplnený nulami.

Kódovanie obrazových dát

Prevažná časť BMP súborov je ukladaná v nekomprimovanej podobe. Komprimujú sa iba obrazové dáta uložné v štyroch alebo ôsmych bitoch na bod. Pri zvyšných fomátoch sa do neodporúča, lebo tu pomerne ľahko dochádza k negatívnej kompresii. Obrazové dáta sú ukladané vo forme paketov dvoch typov: kódovaný a citovaný. Obidva pakety musia končiť na hranici skanovacieho riadka.

Kódový paket obsahuje dva bajty. Prvý je počet bodov v pakete, a druhý je bodová hodnota. Prvý bajt je vždy nenulový a má hodnotu 1-255 a jeho hodnota určuje, koľko krát má byť druhý bajt skopírovaný na výstup.

Citovaný paket obsahuje päť alebo viac bajtov. Prvý je vždy 0, aby signalizoval citovaný paket. Druhý bajt má hodnotu 3-255 a indikuje počet bajtov, ktoré následujú a ktoré majú byť čítané ako citované hodnoty. Citované hodnoty sa kopírujú na výstup.

Ešte existujú tzv. escape sekvencie, ktoré pozostávajú z dvoch bajtov. Prvý, tak ako u citovanéh paketu, je 0, a druhý môže nadobúdať hodnoty:

  • 0 - signalizuje koniec obrázka
  • 1 - signalizuje koniec skanovacieho riadku
  • 2 - signalizuje zmenu súradníc v zakódovaných dátach (delta escape sekvencia)
RLE metóda obvylke komprimuje dáta začínajúc na prvom riadku a končiac na poslednom. Delta escape sekvencia umožňuje, aby kódovací proces preskakoval v obrázku a kódoval časti obrázku v zhlukoch, bez ohľadu na skanovacie riadky. Keď je delta escape sekvencia detekovaná, následujúce dva bajty určujú horizontálne a vertikálne súradnice začiatku ďalšieho prúdu.