Princip zpracování rastrových obrázků BMP & PCX
09. Marec, 2012, Autor článku: Vávra David, Elektrotechnika, Informačné technológie
Ročník 5, číslo 3
Pridať príspevok
První část článku se zabývá principem zpracování rastrových obrázků BMP a PCX. Popisuje tyto formáty, způsob práce s barvami a u PCX formátu popisuje i způsob komprese. Těchto poznatků bylo využito k vytvoření vlastního programu demonstrujícího zpracování obrázků BMP a PCX a umožňujícího několik základních funkcí, jako např. rotaci o 90° vlevo i vpravo, vertikální i horizontální převrácení, inverzi všech i jednotlivých barev. Zjednodušeným popisem programu se pak zabývá druhá část článku.
1. Grafický formát BMP
Bitmapový soubor se skládá z následujících částí:
- Bitmap-File header (bitmapová hlavička)
- Bitmap-Information header (informační hlavička o bitmapě)
- Paleta barev (u 24 bitového obrázku se paleta barev nenachází)
- Pole bytů definující bitmapu
Obrázek 1. Ukázka souboru 3×5.bmp v hexadecimálním tvaru
Bitmap-File header | ||||
---|---|---|---|---|
Offset | Délka | Význam | 3×5.bmp (hex) | 3×5.bmp (dec) |
0 | 2 | identifikace BMP souboru | 42 4D | BM |
2 | 4 | celková velikost souboru v bytech | 82 00 00 00 | 130 bytů |
6 | 2 | musí být 0 | 00 00 | 0 |
8 | 2 | musí být 0 | 00 00 | 0 |
10 | 4 | začátek obrazových dat v bytech | 76 00 00 00 | 118 bytů |
Bitmap-Information header | ||||
Offset | Délka | Význam | 3×5.bmp (hex) | 3×5.bmp (dec) |
14 | 4 | určuje počet bytů hlavičky (vždy 40) | 28 00 00 00 | 40 bytů |
18 | 4 | šířka obrazu v bodech | 05 00 00 00 | 5 px |
22 | 4 | výška obrazu v bodech | 03 00 00 00 | 3 px |
26 | 2 | počet bitových rovin | 01 00 | 1 |
28 | 2 | počet bitů na obrazový bod | 04 00 | 4 |
30 | 4 | komprese: 0 = žádná, 1 = 4b RLE, 2 = 8b RLE | 00 00 00 00 | 0 |
34 | 4 | velikost obrázku v bytech (nesmí být 0) | 0C 00 00 00 | 12 Byte |
38 | 4 | horizontální rozlišení v pixelech na metr | 00 00 00 00 | 0 px/m |
42 | 4 | vertikální rozlišení v pixelech na metr | 00 00 00 00 | 0 px/m |
46 | 4 | aktuální počet barev v paletě, 0 = všechny | 00 00 00 00 | 0 |
50 | 4 | počet významných barev: 0 = všechny barvy | 00 00 00 00 | 0 |
Paleta barev
Definuje pole – RGB struktury skládající se z barev použitých v bitmapě. Barvy v tabulce jsou uspořádané s rostoucím významem. Toto je výhodné není-li zobrazovací zařízení schopné zobrazit všechny barvy použité v bitmapě. Paleta obrázku BMP má velikost jako počet barev*4 byty. Paleta má význam, pokud je počet bitů 1, 4 nebo 8. Při použití 24 bitů na bod je barva uložená přímo v datech jako postupnost hodnot jednotlivých barevných složek RGB. Takže například data 10, 60, 30 znamenají, že červená je 10, zelená 60 a modrá 30. Na jeden bod je třeba uložit vždy 3 byty. Protože se v paletě ukládá i byte navíc, je pro 256 barev potřeba uložit namísto 786 bytů 1024.
Tabulka demonstrující příklad uložení palety 16 barevného obrázku:
B | G | R | - | B | G | R | - | ||
---|---|---|---|---|---|---|---|---|---|
[0] | 84 | 252 | 84 | 0 | [8] | 0 | 168 | 0 | 0 |
[1] | 252 | 252 | 84 | 0 | [9] | 168 | 168 | 0 | 0 |
[2] | 84 | 84 | 252 | 0 | [A] | 0 | 0 | 168 | 0 |
[3] | 252 | 84 | 252 | 0 | [B] | 168 | 0 | 168 | 0 |
[4] | 84 | 252 | 252 | 0 | [C] | 0 | 168 | 168 | 0 |
[5] | 252 | 252 | 252 | 0 | [D] | 168 | 168 | 168 | 0 |
[6] | 0 | 0 | 0 | 0 | [E] | 84 | 84 | 84 | 0 |
[7] | 168 | 0 | 0 | 0 | [F] | 252 | 84 | 84 | 0 |
Pole bytů definující bitmapu
Je určené podle hlavičky a tabulky barev. Data, které následují hned po tabulce barev, jsou tvořena z pole bytů reprezentující postupnost řádků bitmapy (scan line). Každý scan line se skládá z postupnosti bytů reprezentujících postupnost pixelů ve scan line, v postupnosti zleva doprava. Velikost bitů reprezentujících scan line-novou hloubku barevného formátu a šířku v pixelech bitmapy. Pokud je nutné, tak scan line musí vynulovat nepoužité prázdné bity po 32-bitový okraj. Ale segment okraje se může vyskytnout leckde v bitmapě. Scan lines v bitmapě jsou uložené zespoda nahoru. To znamená, že první byte v poli reprezentuje pixel v levém dolním rohu bitmapy a poslední reprezentuje pixel v pravém horním rohu.
2. Grafický formát PCX
PCX soubor se skládá z následujících částí:
- Hlavička PCX souboru
- Pole bytů definující bitmapu
- Paleta barev (u 8 bitového obrázku)
Obrázek 2. Ukázka souboru 3×5.pcx v hexadecimálním tvaru
Hlavička souboru PCX | ||||
---|---|---|---|---|
Offset | Délka | Význam | 3×5.pcx (hex) | 3×5.pcx (dec) |
0 | 1 | identifikace PCX souboru | 0A | 10 |
1 | 1 | číslo verze | 05 | 5 |
2 | 1 | komprese: 0 = žádná, 1 = RLE | 01 | 1 |
3 | 1 | počet bitů na pixel v obrazové rovině | 04 | 4 |
4 | 8 | souřadnice obrazu X1, Y1, X2, Y2 | 00 00 00 00 04 00 02 00 | 0,0,4,2 |
12 | 2 | horizontální rozlišení | 2C 01 | 300 |
14 | 2 | vertikální rozlišení | 2C 01 | 300 |
16 | 48 | paleta barev (maximálně 16 barev) | - | - |
64 | 1 | rezervovaná položka | 00 | 1 |
65 | 1 | počet obrazových (bitových) rovin | 01 | 1 |
66 | 2 | počet bytů na obrazový řádek (sudý počet) | 04 00 | 4 |
68 | 2 | interpretace palety: 1 = barvy, 2 = odstíny šedi | 01 | 1 |
70-127 | 58 | nepoužito, možné využití aplikací | - | - |
Paleta barev
U 1 a 4 bitových obrázků je paleta uložena v hlavičce souboru. U 8 bitových je uložena na konci souboru a od obrazových dat ji odděluje byte „0c“. Barvy jsou uloženy jako jednotlivé barevné složky RGB.
Komprimace rastrových dat v souborech typu PCX
Používá se modifikovaný algoritmus RLE, který má u PCX stále stejnou podobu – bez ohledu na typ komprimovaného obrázku. Nemusíme rozlišovat, zda se jedná o 1, 4, 8 či 24 bitový obrázek. Pracujeme s proudem bytů, kde maximální délka proudu odpovídá délce obrazového řádku. Postupně se načítá obrazový řádek a zjišťuje se počet bytů se stejnou hodnotou. Blok za sebou jdoucích bytů se stejnou hodnotou je zapsán jako dvojice bytů – první byte udává počet opakování, druhý byte hodnotu. Počitadlo je inicializováno na hodnotu „c0“ – pokud dekomprimační program narazí na byte větší než „c0“, ví, že se jedná o dvoubytový komprimovaný blok.
Jednotlivé byty, které nejsou součástí bloku s hodnotou menší než „c0“, jsou do komprimovaného souboru zapsány v původní podobě. Aby nenastala kolize s počitadlem, musí byty, které mají hodnotu větší než „c0“ uložit jako dvojice bytů „c1“ a „xx“ – tj. jako blok o délce jednoho bytu s barvou pixelu uloženou ve druhém bytu. V tomto případě nastává prodloužení výstupního souboru. Pouhým přeindexováním bytů a úpravou palety barev je možné měnit komprimační poměr u PCX souborů (ideální je, aby paleta byla setříděna tak, že nejčastěji používané barvy jsou uloženy na začátku.
Příklad komprimace tří posloupností bytů:
01 01 01 01 01 => C5 01
01 01 01 01 01 04 01 01 => C5 01 04 C2 01
01 01 01 01 01 FF 01 01 => C5 01 C1 FF C2 01
3. Vlastní program pro zpracování rastrových obrázků BMP & PCX
„Editor BMP & PCX“ byl naprogramován jako praktická ukázka principu prohlížení a úpravy BMP a PCX obrázků. Pro vytvoření tohoto programu bylo použito programovacího jazyka „Python“ a knihovny wxWidgets, které umožňují multiplatformní programování.
Obrázek 3. Ukázka vlastního programu
Program obsahuje 2 třídy. Jedna obsahuje grafické rozhraní programu a druhá pak samotnou třídu s funkcemi pro veškerou práci s obrázky.
Základní proměnné:
- nazev – obsahuje název souboru
- cesta – obsahuje celou cestu k souboru
- data – pole všech dat načtených ze souboru (v 16 soustavě po bytech)
- hlavicka1 – u BMP Bitmap-File header, u PCX celá hlavička (v 16 soustavě po bytech)
- hlavicka2 – u BMP Bitmap-Information header (v 16 soustavě po bytech)
- obrazovaData – samotná obrazová data z načteného souboru (v 16 soustavě po bytech)
- obraz – čistá data obrazu (pro každý bod obsahuje x, y, r, g, b, odkaz do palety)
Proměnné obsahující jednotlivé parametry získané z hlaviček:
BMP: identifikace, delkaSouboru, zacatekObrazu, velikostHlavicky, sirka, vyska, bitovychRovin, pocetBitu, komprese, velikost, rozliseniH, rozliseniV, pocetBarev, dulezitychBarev
PCX: identifikace, verze, komprese, bouroviny, souradniceX1, souradniceY1, souradniceX2, souradniceY2, rozliseniH, rozliseniV, paletaBarev, pocetRovin, bytuNaRadek, paletaInfo, ostatní
Funkce pro inverzi všech barev:
Volá funkci pro vytvoření obrazu s parametrem „inverze = [255, 255, 255]“, což při vytváření obrazu zajistí inverzi všech barev. Hodnoty v závorce jsou [R, G, B] nastaveny na 255. Při vytváření obrazu se v absolutní hodnotě od těchto hodnot odečítají skutečné hodnoty RGB – pracuje se buďto přímo s daty obrazu nebo s paletou barev (inverze palety).
Funkce pro inverzi červené barvy:
Volá funkci pro vytvoření obrazu s parametrem „inverze = [255, 0, 0]“, což při vytváření obrazu zajistí inverzi červené barvy. Hodnoty v závorce jsou [R, G, B], kde R je nastaveno na 255 a GB na 0. Při vytváření obrazu se v absolutní hodnotě od těchto hodnot odečítají skutečné hodnoty RGB – pracuje se buďto přímo s daty obrazu nebo s paletou barev (inverze palety).
Funkce pro inverzi zelené barvy:
Volá funkci pro vytvoření obrazu s parametrem „inverze = [0, 255, 0]“, což při vytváření obrazu zajistí inverzi zelené barvy. Hodnoty v závorce jsou [R, G, B], kde G je nastaveno na 255 a RB na 0. Při vytváření obrazu se v absolutní hodnotě od těchto hodnot odečítají skutečné hodnoty RGB – pracuje se buďto přímo s daty obrazu nebo s paletou barev (inverze palety).
Funkce pro inverzi modré barvy:
Volá funkci pro vytvoření obrazu s parametrem „inverze = [0, 0, 255]“, což při vytváření obrazu zajistí inverzi modré barvy. Hodnoty v závorce jsou [R, G, B], kde B je nastaveno na 255 a RG na 0. Při vytváření obrazu se v absolutní hodnotě od těchto hodnot odečítají skutečné hodnoty RGB – pracuje se buďto přímo s daty obrazu nebo s paletou barev (inverze palety).
Funkce pro otočení obrazu doleva a doprava o 90°, vertikální a horizontální převrácení:
Volá funkci pro vytvoření obrazu s patřičnými parametry, což při vytváření obrazu zajistí otočení nebo převrácení. V podstatě se jen mění způsob načítání obrazu.
4. Závěr
Grafický formát BMP patří mezi velmi používané grafické formáty, což je z technologického pohledu docela paradoxní, protože je poměrně složitý na zpracování a přitom nabízí pouze minimum užitečných vlastností. Důvodem je to, že formát byl navržen firmami IBM a Microsoft jako základní rastrový obrazový formát pro jejich operační systémy. U formátu PCX jsou data uložena buď v nekomprimované podobě nebo v komprimovaném tvaru. Nekomprimované PCX se však prakticky nepoužívají.
Samotný program, jako praktická ukázka prohlížení a úpravu BMP a PCX obrázků, byl vytvořen v programovacím jazyce „Python“ za použití knihoven wxWidgets, které umožňují multiplatformní programování. Pro úpravu těchto obrázků poskytuje několik základních funkcí: rotaci o 90° vlevo i vpravo, vertikální i horizontální převrácení, inverzi všech i jednotlivých barev.
Zdroje
- ROOT.CZ: Grafický formát BMP – používaný a přitom neoblíbený [online]. [cit. 2011-10-04]. Dostupný z WWW:
http://www.root.cz/clanky/graficky-format-bmp-pouzivany-a-pritom-neoblibeny - ROOT.CZ: PCX prakticky – implementace komprimace RLE [online]. [cit. 2011-10-04]. Dostupný z WWW:
http://www.root.cz/clanky/pcx-prakticky-implementace-komprimace-rle