Hlavní navigace

Grafický formát TGA prakticky

9. 11. 2006
Doba čtení: 10 minut

Sdílet

V dnešním článku dokončíme popis grafického formátu TGA. Ukážeme si interní strukturu hlaviček typických souborů typu TGA - černobílých obrázků, obrázků s barvovou paletou, hi-color obrázků a konečně i obrázků plnobarevných. Také si popíšeme jeden z podporovaných způsobů komprimace rastrového obrazu - kódování RLE.

Obsah

1. TGA typu 1 bpp (black and white)
2. TGA typu 8 bpp ve stupních šedi (grayscale)
3. TGA typu 8 bpp s barvovou paletou
4. TGA typu 16 bpp s jednobitovou průhledností (hi-color)
5. TGA typu 24 bpp (true color bez alfa kanálu)
6. TGA typu 32 bpp (true color s alfa kanálem)
7. Komprimace rastrových dat v souborech typu TGA
8. Obsah dalšího pokračování tohoto seriálu

1. TGA typu 1 bpp (black and white)

Nejjednodušším typem grafického souboru typu TGA jsou obrázky nazývané přiléhavě anglickým souslovím black and white. Opravdu se jedná o obrázky obsahující pouze plně černé a plně bílé pixely. Termínu černobílý obrázek se pro jistotu vyhýbám, protože by mohlo dojít k myšlenkové záměně za obrázek uložený ve stupních šedi (viz v podstatě nesprávně používané termíny „černobílá televize“ a „černobílá fotka“). Tento typ obrázků je však nazýván grayscale a jedná se o kvalitativně i kvantitativně odlišné obrázky.

Pixely jsou v obrázcích typu black and white uloženy po osmicích, které tvoří jeden byte. Každý jednotlivý bit z bytu slouží pro uložení barvy jednoho pixelu – černá barva je uložena jako bit s hodnotou nula a barva bílá jako bit s hodnotou jedna, z toho také vychází výše uvedené označení 1 bpp (jeden bit na pixel). U černobílých TGA obrázků je zajímavé, že je některé prohlížecí programy zobrazují inverzně, tj. pixely uložené s nulovou hodnotou jsou zobrazeny bílou barvou a pixely s jednotkovou hodnotou barvou černou.

Další programy (a je jich i dnes poměrně mnoho) však mají s tímto typem obrázků mnohem větší problémy, protože ho nezobrazí vůbec. Těžko říci, zda se jedná o akceptovatelné či zcela nevhodné chování, protože zrovna tento typ obrázků firma Truevision opravdu nikdy ve svých grabberech nepoužila, jedná se tedy o jakési ideové rozšíření původních několika (tří) typů obrázků Targa, které nebylo touto firmou oficiálně schváleno. Z tohoto důvodu bych osobně doporučoval pro jednoduché ukládání dvoubarevných obrázků používat jiný formát, buď GIF či PNG (s podporou knihoven) nebo PBM (soubory tohoto typu jsou tak primitivní, že je lze uložit na třech programových řádcích).

Hlavička obrázku s 1 bpp vypadá následovně:

hodnoty bytů hlavičky(hexa) význam
00 obrázek je uložen bez identifikačního pole
00 barvová paleta není přítomna
03 obrázek je uložen ve stupních šedi (grayscale)
00 00 počátek barvové palety=0
00 00 délka barvové palety je nulová (paleta nepoužita)
00 počet bitů na jednu položku palety je nulový
00 00 00 00 umístění obrázku do počátku souřadné soustavy
XX XX šířka obrázku v pixelech (little endian)
YY YY výška obrázku v pixelech (little endian)
01 počet bitů na pixel (bpp) je roven 1
20 obrázek je uložen shora dolů
rastrová data po řádcích 1 bit na pixel

Teoreticky je sice možné i pro dvoubarevný obrázek použít barvovou paletu se dvěma záznamy (a změnit typ obrázku z 03 na 01), ve skutečnosti se však obávám, že by s takto vytvořeným souborem typu TGA mělo mnoho aplikací velké problémy, neboť tento typ jsem nikde explicitně popsaný neviděl (a, podobně jako ostatní vývojáři je nemám na čem otestovat).

2. TGA typu 8 bpp ve stupních šedi (grayscale)

Obrázky uložené ve stupních šedi mají také jednoduchý formát. Barvová paleta není uložena a vlastní rastr pixelů má v případě nepoužití komprimace formát „co byte, to jeden pixel“. S těmito typy obrázků se již můžeme v praxi často setkat, protože například mnoho ručních skenerů (levnější a starší varianty skenerů stolních), resp. jejich ovladačů, ukládalo naskenované obrázky právě jako grayscale TGA. Můžeme se setkat se dvěmi variantami, podle toho, zda je obrázek uložen shora dolů (úprava pro běžné grafické karty) či naopak (původní formát firmy Truevision).

hodnoty bytů hlavičky(hexa) význam
00 obrázek je uložen bez identifikačního pole
00 barvová paleta není přítomna
03 obrázek je uložen ve stupních šedi (grayscale)
00 00 počátek barvové palety=0
00 00 délka barvové palety je nulová (barvová paleta nepoužita)
00 počet bitů na jednu položku palety je 0
00 00 00 00 umístění obrázku do počátku souřadné soustavy
XX XX šířka obrázku v pixelech (little endian)
YY YY výška obrázku v pixelech (little endian)
08 počet bitů na pixel (bpp) je roven 8
20 obrázek je uložen shora dolů
rastrová data jsou uložena po řádcích 1 byte na pixel

3. TGA typu 8 bpp s barvovou paletou

Obrázky TGA s barvovou paletou nejsou tak rozšířené, jak by se na první pohled mohlo zdát. V tomto případě se však nejedná o nějaké nepřekonatelné technické limity TGA, spíše se opět musíme podívat po praktických důvodech. TGA se rozšířilo zejména jako formát vhodný pro práci s plnobarevnými obrázky, tj. 24bpp a později i 32bpp. Při práci s obrázky využívajícími barvovou paletu se však již před nástupem TGA používaly formáty jiné, zejména PCX a GIF (počítače PC), popř. formáty vycházející z grafických schopností počítačů Amiga (formát IFF apod.). TGA v této oblasti nijak neexceluje (pouze jednoduchá a v některých případech neúčinná komprimace apod.), proto se ve starších archivech setkáme spíše s paletovými obrázky uloženými ve formátech odlišných.

V každém případě je paletový režim charakterizovaný tím, že pixely uložené v rastru obsahují index do barvové palety, který leží v rozsahu od 0 do 255. Barvová paleta má maximální délku 256 položek, ale může být i menší, například v případě, že je použito pouze 128 barev. Každá položka v barvové paletě má délku tří či čtyř bytů. Pokud je dlouhá tři byty, obsahuje barvové složky RGB, v případě, že má délku čtyř bytů, může být ke každé barvě přiřazena i průhlednost (jedná se o plnohodnotný osmibitový alfa kanál).

hodnoty bytů hlavičky(hexa) význam
00 obrázek je uložen bez identifikačního pole
01 barvová paleta je přítomna
01 obrázek je uložen v paletovém režimu
00 00 počátek barvové palety=0
00 01 délka barvové palety je rovna 256 položkám
18 počet bitů na jednu položku palety je 24
00 00 00 00 umístění obrázku do počátku souřadné soustavy
XX XX šířka obrázku v pixelech (little endian)
YY YY výška obrázku v pixelech (little endian)
08 počet bitů na pixel je 8
20 obrázek je uložen shora dolů
rastrová data po řádcích 1 byte na pixel

Pro vertikálně otočené obrázky je poslední byte hlavičky nastaven na hodnotu 0×00.

4. TGA typu 16 bpp s jednobitovou průhledností (hi-color)

Dnes se nejčastěji můžeme setkat s obrázky typu TGA, které mají pro každý pixel vyhrazeno 16 bitů nebo 24 bitů – ostatně kvůli těmto režimům je TGA oblíben. V prvním případě se jedná o takzvané hi-color obrázky, ve druhém případě o obrázky true color (pravé barvy). Jedná se o bezpaletové obrázky, tj. délka barvové palety je u obou typů nulová. Formát 16bpp je často použit pro ukládání textur, protože menší bitová šířka jednotlivých barvových kanálů (v tomto případě se jedná o pět bitů) pro mnohé textury vyhovuje a navíc je možné využít jednobitový alfa kanál pro vytvoření „děr“ v textuře – příkladem mohou být různá okna nebo mříže.

U obrázků uložených ve formátu 16bpp je každý pixel zapsán ve dvou bytech, které mají bitovou strukturu AR4R3R2R1R0GG3 G2G1G0B4B3B2B1B0, kde A odpovídá bitu průhlednosti, Rx jsou jednotlivé bity červené barvové složky, Gx zelené barvové složky a Bx barvové složky modré. Dvojice bytů je uspořádána v pořadí little-endian, což je pro procesory řady x86 přirozené. Hlavička obrázku se šestnácti bity na pixel má tvar:

hodnoty bytů hlavičky(hexa) význam
00 obrázek je uložen bez identifikačního pole
00 barvová paleta není přítomna
02 obrázek je uložen v true color režimu
00 00 počátek barvové palety=0
00 00 délka barvové palety je nulová
00 počet bitů na jednu položku palety je 0
00 00 00 00 umístění obrázku do počátku souřadné soustavy
XX XX šířka obrázku v pixelech (little endian)
YY YY výška obrázku v pixelech (little endian)
10 počet bitů na pixel je 16
21 obrázek je uložen shora dolů a počet alfa bitů je 1
rastrová data uložená po řádcích 2 byte na pixel

Pokud nevyžadujeme jednobitový alfa kanál, je možné vynulovat nejnižší bit v posledním (osmnáctém) bytu hlavičky. Výsledkem bude formát, ve kterém lze uložit bitmapu s maximálně 32768 (32×32×32) barvami bez průhlednosti.

5. TGA typu 24 bpp (true color bez alfa kanálu)

Nekomprimované obrázky uložené v barevné hloubce 24bpp jsou strukturovány tak, že každý pixel je představován trojicí bytů tvořících barvu v prostoru RGB (Red, Green, Blue). Vše je uloženo opět dle konvence procesorů Intel, tj. BGR (Blue, Green. Red). V tomto případě má hlavička souboru tvar:

hodnoty bytů hlavičky(hexa) význam
00 obrázek je uložen bez identifikačního pole
00 barvová paleta není přítomna
02 obrázek je uložen v true color režimu
00 00 počátek barvové palety=0
00 00 délka barvové palety je nulová
00 počet bitů na jednu položku palety je 0
00 00 00 00 umístění obrázku do počátku souřadné soustavy
XX XX šířka obrázku v pixelech (little endian)
YY YY výška obrázku v pixelech (little endian)
18 počet bitů na pixel je 24
20 obrázek je uložen shora dolů
rastrová data po řádcích 3 byte na pixel

Někdy se také setkáme s plnobarevným obrázkem otočeným „hlavou dolů“; tuto skutečnost je možné zjistit z posledního bytu hlavičky (v souboru je uložen na osmnácté pozici), protože pátý bit ukazuje, zda je obrázek uložen v otočené podobě či v podobě vhodnější pro další zpracování a zobrazení. Pro test, zda se jedná o zrcadlený obrázek, postačuje provést bitový logický součin hodnoty posledního bytu hlavičky  konstantou 0×20.

hodnoty bytů hlavičky(hexa) význam
00 obrázek je uložen bez identifikačního pole
00 barvová paleta není přítomna
02 obrázek je uložen v true color režimu
00 00 počátek barvové palety=0
00 00 délka barvové palety je nulová
00 počet bitů na jednu položku palety je 0
00 00 00 00 umístění obrázku do počátku souřadné soustavy
XX XX šířka obrázku v pixelech (little endian)
YY YY výška obrázku v pixelech (little endian)
20 počet bitů na pixel je 24
28 obrázek je uložen shora dolů a alfa kanál má šířku 8 bitů
rastrová data po řádcích 3 byte na pixel

6. TGA typu 32 bpp (true color s alfa kanálem)

Obdobně jako obrázky RGB (24 bpp) je uložen i obrázek ve formátu RGBA, tj. s 32 bity na pixel. Formát pixelů je v tomto případě BGRA, tj. nejméně významný byt je uložen jako první. V hlavičce nastává změna v předposledním a posledním bytu (sedmnáctá a osmnáctá pozice od počátku souboru). V sedmnáctém bytu hlavičky se počet bitů na pixel nastaví na hodnotu 0×20 (32bpp) a v osmnáctém bytu se specifikuje bitová hloubka alfa kanálu na 8.

7. Komprimace rastrových dat v souborech typu TGA

V grafických souborech typu TGA lze ukládat i rastrové obrázky komprimované jednoduchým kódem RLE (Run Length Encoding). Kódování RLE je použito pouze u obrázků, které mají v informační hlavičce nastavenou hodnotu ImageType na 9, 10 nebo 11, u obrázků typu 32 a 33 je použita kombinace RLE s Huffmanovým kódem. Při použití RLE kódování jsou posloupnosti po sobě následujících pixelů s barvami se stejnou hodnotou zakódovány dvojicí hodnot: počtem opakování a hodnotou opakování. Podobný způsob komprimace nabízí i grafické formáty BMP a PCX, konkrétní implementace se však poněkud liší. Způsob uložení dat u souborů TGA vypadá následovně:

V režimu kódování RLE je nejvyšší bit (tj. hodnota 0×80 hexadecimálně) každého bytu na začátku datového paketu rezervován jako logický příznak, zda se bude jednat o opakování (RLE paket) či nikoliv (Raw paket):

  1. Pokud je tento příznak nastaven (tj. v byte je uložena hodnota větší než 0×7f), udávají hodnoty nižších sedmi bitů počet opakování (počet opakování=hodnota & 0×7f + 1) hodnoty/barvy uložené v následujících bytech (1 byte pro osmibitové obrázky s paletou i grayscale, 2 byte pro šestnáctibitové obrázky atd.). Opakovaná hodnota není omezena pouze na jeden řádek, může přeskakovat přes více řádků, což je výhodné zejména při ukládání pozadí obrázku (obloha apod.), které je na levém i pravém okraji obrázku vykresleno stejným barevným odstínem. Tato datová posloupnost se nazývá RLE paket.
  2. V případě, že je příznak vynulován (tj. v prvním byte posloupnosti je uložena hodnota menší než 0×80), udávají hodnoty nižších sedmi bitů délku dat, které nejsou pomocí RLE kódované. Pokud se tedy v obraze vyskytne složitý motiv, je možné uložit až 128 pixelů různých barev v jednom nekomprimovaném shluku. Tato datová posloupnost se nazývá Raw paket.

U běžných obrázků dává RLE metoda použitá u TGA lepší výsledky, než podobné metody použité u grafických formátů BMP a zejména u PCX. Je to z toho důvodu, že složité motivy (po sobě jdoucí pixely s různou barvou) není možné např. v PCX zakódovat jinak než pomocí RLE paketů s jednotkovou délkou. V případě TGA se však až 128 různobarevných pixelů zakóduje do posloupnosti o délce 129 bytů, takže nárůst délky souboru je nepatrný.

root_podpora

8. Obsah dalšího pokračování tohoto seriálu

Následující část tohoto seriálu již bude částí předposlední, ve které si budeme popisovat bezeztrátové grafické formáty. Budeme se věnovat popisu dnes již notně zastaralého, ale stále ještě používaného formátu – PCX a následně pak velmi jednoduchým formátům PBM, PGM, PPM a jejich následovníku PAM. Po této odbočce do historie se již vrhneme na velký hit posledního desetiletí – ztrátové formáty (resp. formáty používající ztrátovou komprimaci).

Byl pro vás článek přínosný?

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.