Grafický formát TGA - jednoduchý, oblíbený, používaný

2. 11. 2006
Doba čtení: 11 minut

Sdílet

V dnešním článku si popíšeme další oblíbený grafický formát. Jedná se o formát nazývaný Targa (TGA), který je mezi programátory oblíben zejména díky velmi jednoduché a snadno dekódovatelné struktuře. Historicky se také jednalo o jeden z prvních grafických formátů, který i na obyčejná PC přinesl true color grafiku.

1. Úvodní informace o grafickém formátu TGA

Grafický formát Targa (zkráceně TGA) byl navržen firmou Truevision, která několik variant tohoto formátu v minulosti využívala pro ukládání snímků získávaných pomocí svých videograbberů nazvaných Targa. Videograbber je, zjednodušeně řečeno, zařízení pro zachytávání a digitalizaci videa, podobnou funkci nabízí dnešní televizní karty (TV-card). Grabberů typu Targa existovalo několik typů a pro každý typ byla vytvořena varianta vlastní grafického formátu TGA (lišily se především v počtu bitů na pixel).

Později, zejména se stále rostoucí oblibou formátu TGA mezi programátory i uživateli, došlo k dalšímu rozšíření variant způsobů ukládání pixelů a současně i k unifikaci, přičemž výsledkem je dnešní stav, kdy je možné formát TGA použít jak pro rastrové obrázky s barvovou paletou (palette-based images), tak i pro obrázky uložené ve stupních šedi (grayscale) či obrázky typu true color (224 barev). Podporován je i plnohodnotný osmibitový alfa kanál, pro některé aplikace si však vystačíme s jednobitovým alfa kanálem, resp. maskou průhlednosti.

Díky své jednoduchosti a širokým možnostem se grafický formát TGA značně rozšířil a byl použit v mnoha aplikacích, zejména těch, které musely pracovat s plnobarevnými obrázky. V minulosti, zejména v době operačního systému DOS na počítačích typu PC, se jednalo například o raytracery, ale i některé skenovací programy. Zajímavé je, že v různých aplikačních oblastech se prosadily i rozdílné grafické formáty – fotorealistická grafika byla většinou založena na TGA, desktop publishing se stále drží supersložitého formátu (resp. spíše pouhého kontejneru) TIFF.

2. Vlastnosti formátu TGA

V grafickém formátu typu TGA je možné ukládat bitmapy různých typů. Pravděpodobně nejpoužívanější je nekomprimovaná bitmapa uložená v pravých barvách (true color), je však možné uložit i bitmapu ve stupních šedi či bitmapu obsahující místo přímých barev indexy do barvové palety. Za zmínku stojí podpora bitmap uložených ve stupních šedi – tyto bitmapy jsou často používány například při ukládání snímků získaných z CT, MR apod. (převod na snímky s paletou je pro další zpracování obrazu zcela nevhodný).

Bitmapy je možné komprimovat několika způsoby, typicky se používá jednoduché kódování RLE (Run Length Encoding), které může být kombinované s Huffmanovým kódem. V porovnání s komprimací pomocí algoritmů LZ77 a LZW (použité například v GIFu a PNG) je však RLE i Huffmanovo kódování pro většinu snímků méně účinné, i když mnohem jednodušší na implementaci. Kromě vlastních barev jednotlivých pixelů je možné ukládat i alfa kanál; v něm může být průhlednost popsána buď jedním bitem (podobně jako v případě grafického formátu GIF), nebo bity osmi (256 stupňů průhlednosti).

Jak jsme si již řekli v předchozím odstavci, může být rastrový obraz v grafických souborech typu TGA uložen buď v komprimované, nebo ve volné (nekomprimované) formě. V dalším textu (který bude pokračovat i do následující části seriálu) si oba způsoby ukládání rastrových dat popíšeme. Za zmínku však stojí fakt, že komprimované obrazové soubory typu TGA se dnes již téměř nepoužívají a mnoho převodních či prohlížecích programů s nimi ani nedokáže korektně pracovat, resp. podporují pouze variantu RLE a nikoli již Huffmanovo kódování.

Opět se zde setkáváme s rozdílnými nároky na grafické formáty: při požadavcích na komprimaci fotorealistické grafiky si většina aplikací vystačí se ztrátovou komprimací typu JFIF (a.k.a. JPEG, založeno na diskrétní kosinusové transformaci a kvantizaci koeficientů ve frekvenční oblasti), a pro jednoduchou práci s grafikou (a popř. i alfa kanálem) naopak plně vyhovuje nekomprimovaný TGA, jejíž zpracování je mnohem jednodušší, než tomu bylo v případě minule popisovaného formátu BMP (nemluvě o BMP hlavičkách verze 4 a 5).

3. Použití formátu TGA

Již v předchozích kapitolách jsem se zmínil o některých oblastech, ve kterých je grafický formát TGA často používán. Především je to tvorba fotorealistické grafiky, většinou se jedná o různé raytracery (POV-Ray, Vivid) nebo programy pracující s lokálním osvětlovacím modelem (3D Studio). Mezi komunitou se tento formát stal tak populární, že ho dodnes většina 3D modelovacích programů podporuje, a to jak pro výstup finálních obrazů (ze kterých se posléze tvoří video), tak i jako formát vhodný pro uložení textur – viz následující odstavec.

Formát TGA je také vhodný pro ukládání a načítání textur, protože umožňuje spolu s barevnou informací ukládat i alfa složku (průhlednost), a to dokonce i v obrázcích s barvovou paletou (tuto možnost nově nabízí i PNG). Pokud postačuje ukládat pouze příznak průhlednosti, je možné využít 16ti bitového formátu pixelů, kdy je pro průhlednost rezervován pouze jeden bit – počet barev v tomto případě dosahuje hodnoty 32 tisíc, což je například pro běžně používané textury dostatečné množství.

Specialitou formátu TGA (a nově i PNG) je schopnost ukládat obrázky v osmibitové barevné hloubce (8bpp), ovšem bez barvové palety. Toho se využívá při práci s obrázky uloženými ve stupních šedi (grayscale). V počítačové grafice se jedná například o naskenované obrázky nebo textury s luminancí bez přidané barevné informace. Typickým příkladem použití jsou statické světelné mapy (light maps).

4. Interní struktura souborů typu TGA

Všechny informace jsou v souborech typu TGA rozděleny do čtyř sekcí, přičemž pouze první sekce je povinná, ostatní sekce mohou či nemusí být použity. Sekce jsou do značné míry podobné blokům v grafickém formátu GIF či chunkům ve formátu PNG, ovšem s tím rozdílem, že nemusí obsahovat identifikační hlavičku – pozice sekcí v souboru je možné zjistit již po načtení informační hlavičky souboru. Význam jednotlivých sekcí je následující:

  1. V první sekci umístěné na začátku souboru je uložena informační hlavička, jejíž velikost je vždy rovna 18 bytům. V hlavičce, která je popsána v páté kapitole jsou umístěny základní informace o obraze, zejména jeho rozlišení, způsob kódování barev pixelů a orientace obrázku.
  2. Za informační hlavičkou může následovat identifikační pole obrázku, což je textový řetězec o maximální délce 255 znaků. Tato sekce je však nepovinná a málokdy se s ní v obrazových souborech setkáváme. Identifikační pole obrázku je popsané v šesté kapitole.
  3. Ve třetí sekci může být uložena barvová paleta. Tato sekce je, podobně jako sekce předchozí, opět nepovinná. Používá se pouze u některých obrázků s formátem 8 bitů na pixel (8bpp). Tato sekce je popsaná v kapitole sedmé.
  4. V sekci čtvrté jsou uložena vlastní rastrová data, tj. barvy jednotlivých pixelů. Posloupnost rastrových dat (zejména orientaci vertikální osy) lze ve formátu TGA specifikovat přímo v hlavičce, je například možné obrázky ukládat od prvního řádku do řádku posledního či naopak (tak pracovaly původní video grabbery Targa). Rastrová data mohou být komprimována jednoduchým RLE algoritmem. Bližší informace o rastrových datech si povíme v osmé kapitole.

5. Informační hlavička souborů typu TGA

Na začátku všech souborů typu TGA je uložena informační hlavička, která má vždy velikost 18 bytů. V této hlavičce jsou specifikovány všechny důležité informace o rastrovém obraze a způsobu jeho uložení v souboru. Tuto hlavičku je možné srovnat například s „dvojitou“ hlavičkou souboru BMP, jejíž velikost je 14+40=54 bytů a přitom neobsahuje žádné další důležité informace, mnohé informace naopak chybí (při bližším prozkoumání hlavičky TGA však zjistíme, že i ona obsahuje nadbytečné údaje a je možné ji zkrátit minimálně o dva byty).

Hlavička má u TGA následující formát:

Offset Velikost (byte) Název Význam položky
0 1 byte IDLength velikost obrazového identifikátoru
1 1 byte ColorMapType typ barevné mapy
2 1 byte ImageType typ obrázku
3 2 byte CMapStart počátek barevné palety
5 2 byte CMapLength délka barevné palety
7 1 byte CMapDepth bitová hloubka položek barevné palety
8 2 byte XOffset X-ová souřadnice počátku obrázku
10 2 byte YOffset Y-ová souřadnice počátku obrázku
12 2 byte Width šířka obrázku uvedená v pixelech
14 2 byte Height výška obrázku uvedená v pixelech
16 1 byte PixelDepth počet bitů na jeden pixel (bitová hloubka)
17 1 byte ImageDescriptor popisovač obrázku

Význam jednotlivých položek v hlavičce je následující:

Položka IDLength obsahuje počet bytů v identifikačním poli obrázku. Pokud je hodnota této položky nulová, identifikační pole není použito.

Položka ColorMapType může nabývat pouze dvou hodnot. Pokud se nepoužívá barevná paleta, je zde uložena nula (0×00), pokud se barevná paleta používá, je zde uložena jednička (0×01).

Položka ImageType obsahuje informace o formátu uložení a kódování rastrových dat:

Hodnota Význam
0 žádná rastrová data nejsou uložena
1 nekomprimovaná data s barvovou paletou
2 nekomprimovaná data ve formátu RGB
3 nekomprimovaná data v odstínech šedi (grayscale)
9 data kódovaná RLE s barvovou paletou (je nastaven bit 0×08)
10 data kódovaná RLE ve formátu RGB (je nastaven bit 0×08)
11 data kódovaná RLE v odstínech šedi (je nastaven bit 0×08)
32 data kódovaná Huffmanovým kódem a RLE s barevnou paletou
33 data kódovaná Huffmanovým kódem a RLE s barevnou paletou (uložení v quadtree)

Položka CMapStart obsahuje index první barvy v barvové paletě. Více informací bude uvedeno v části věnované barvové paletě.

Položka CMapLength obsahuje počet položek uložených v barvové paletě.

Položka CMapDepth obsahuje počet bitů pro každou položku v paletě. Mohou zde být uloženy hodnoty 0 (bez palety), 16 (15 bitů pro barvu, jeden bit pro alfa kanál), 24 (plné RGB) nebo 32 (RGBA).

V položce XOffset je uložena X-ová souřadnice levého spodního rohu obrázku. Tato hodnota může být použita pro ukládání výřezů i s jejich relativním umístěním v originálním obrázku, i když tuto možnost mnoho programů nepoužívá.

V položce YOffset je uložena Y-ová souřadnice levého spodního rohu obrázku. Význam této hodnoty je stejný jako u předchozí položky.

Položka Width obsahuje šířku obrázku v pixelech. Maximální šířka je tak teoreticky 65535 pixelů, v praxi však některé programy používají 16ti bitová čísla se znaménkem (short int), a tak je vhodné omezit šířku „pouze“ na 32767 pixelů.

Položka Height obsahuje výšku obrázku v pixelech. Maximální výška je opět prakticky omezena na 32767 pixelů.

Položka PixelDepth obsahuje počet bitů na jeden pixel. Podle typu obrázku (tj. maximálního počtu barev) zde mohou být hodnoty 1bpp, 8bpp, 16bpp, 24bpp a 32bpp (bpp – bits per pixel).

V položce ImageDescriptor jsou uloženy příznaky (flags) specifikující posloupnost uložených pixelů:

bit(y) význam
0–3 počet atributových (alfa) bitů na pixel (nastaveno na 0, 1 nebo 8)
4 rezervován, nastaven na nulu
5 je-li nastaven na jedničku, je počátek umístěn v levém horním rohu
6–7 prokládání řádků: 00-žádné, 01-liché/sudé, 10-čtyři řádky, 11-rezervováno

6. Identifikační pole obrázku

Identifikační pole obrázku je představováno řetězcem, jehož formát je volný, tj. není žádnou normou či specifikací pevně stanoven. Proto může každá aplikace do tohoto pole ukládat libovolné údaje. Maximální délka řetězce je 255 znaků, protože velikost položky IDLength je pouze 1 byte a nulová hodnota (0×00) je rezervována pro případ, že by aplikace identifikační pole obrázku nevyplnila. Většina aplikací identifikační pole nepoužívá, proto do IDLength nastavuje nulovou hodnotu, nicméně při načítání obrázků typu TGA je vhodné hodnotu uloženou v této položce načítat a pole přeskakovat (například pomocí céčkovské funkce fseek()).

Při pohledu na způsob uložení identifikačního pole v souborech typu TGA vidíme, že není vyřešeno k plné spokojenosti, protože se toto pole může kdykoli přepsat a aplikace se tedy nemohou spolehnout na jeho obsah. Z tohoto pohledu se ukazuje, že způsob použitý u formátu GIF a PNG je mnohem lepší, zejména v případě PNG, kde je možné specifikovat, zda se má daný chunk při konverzích či editaci zachovat nebo naopak vymazat.

7. Barvová paleta

Barvová paleta obsahuje hodnoty barvových složek RGB (Red, Green, Blue) pro každou položku uloženou v paletě. Celkový počet položek v paletě je zadán v hlavičce souboru TGA atributem CMapLength, index první položky potom atributem CMapStart. Podle počtu bitů rezervovaných na jednu položku (atribut CMapDepth) jsou povoleny tři formáty položek v barvové paletě:

  1. 32 bitů (Targa 32): barevné složky RGB spolu s alfa-složkou (průhledností) jsou za sebou uloženy v pořadí modrá, zelená, červená a alfa. Každá složka má velikost jeden byte. Opačné pořadí barevných složek (tj. BGRA) většinou není na závadu, neboť odpovídá pořadí bytů při čtení na procesorech Intel (formát TGA vznikl pro potřeby aplikací pracujících na těchto procesorech), nicméně aplikace, která aspiruje na přenositelnost, by měla barvové složky načítat po bytech nebo používat makra, která automaticky provedou „přeskládání“ bytů v rámci načteného 32bitového slova, podobně jako u grafického formátu BMP.
  2. 24 bitů (Targa 24): barevné složky RGB jsou za sebou uloženy v pořadí modrá, zelená a červená, tj. ve skutečnosti jde o formát BGR. Každá složka má velikost opět jeden byte.
  3. 16 bitů (Targa 16): barevné složky RGB jsou spolu s příznakem průhlednosti (pouze 1 bit, tj. buď 0% nebo 100% průhlednosti!) uloženy v bitové struktuře: AR4R3R2R1R0GG3 G2G1G0B4B3B2B1B0. Bity R4R3R2R1R0 představují červenou barvovou složku, bity G4G3G2G1G0 zelenou barvovou složku a bity B4B3B2B1B0 barvovou složku modrou. Pořadí bytů odpovídá opět konvencím zavedeným u procesorů Intel.

8. Rastrová data (bitmapa)

Formát uložení rastrových dat je vždy typu little endian, tj. v konvencích používaných u procesorů Intel.

Pro nekomprimované obrázky uložené ve formátu 1bpp je každý pixel reprezentován jedním bitem, které se slučují po osmicích do jednoho bytu. Tento formát není příliš podporován, i když odpovídá dokumentaci firmy Truevision.

Pro nekomprimované obrázky uložené ve formátu 8bpp (tj. buď paletové obrázky nebo obrázky ve stupních šedi) je každý pixel v rastru reprezentován jedním bytem.

Pro nekomprimované obrázky uložené ve formátu 16bpp (vždy bez barvové palety) je každý pixel uložen 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é.

Nekomprimované obrázky v barevné hloubce 24bpp nebo 32bpp (samozřejmě v tomto případě bez barvové palety) jsou uloženy tak, že každý pixel je představován trojicí bytů RGB, popř. čtveřicí bytů ARGB. Vše je uloženo opět dle konvence procesorů Intel, tj. BGR a BGRA.

TGA podporuje i práci s komprimovanými obrázky, bližší informace o nich si však uvedeme až v následující části tohoto seriálu, spolu s ukázkami zkomprimovaných souborů.

bitcoin_skoleni

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

Grafický formát TGA je opravdu jednoduchý, proto již v další části dokončíme jeho popis. Budou uvedeny ukázky souborů typu TGA a jednoduché programy, které s těmito obrázky dokáží pracovat.

Autor článku

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