Popis formatu TGA  

     
Úvodní stránka
  
        
     
(c)1999
  
     
Pavel Tišnovský
 
E-mail



Formát souboru pro výškové pole

Grafický formát TGA
Pro popis výškového pole (height field) bude použit grafický formát TGA. Protože v tomto grafickém formátu nelze uložit všechna data výškového pole, bude definován ještě textový formát, kde budou tato data uložena. Tento formát je definován na další stránce.


Požadavky na grafický formát
Grafický formát pro uložení výškové mapy musí splňovat tyto požadavky:
1. možnost libovolně nastavit horizontální a vertikální rozlišení.
2. vertikální a horizontální rozlišení by mělo být alespoň v rozsahu 0..216 (0..65535).
3. počet bitů na pixel by měl být volitelný 8, 16, 24 a 32 pro práci s různým stupněm přesnosti.
4. implementace by měla být co nejjednodušší
5. formát musí být známý, multiplatformní a široce podporovaný


Proč zrovna TGA?
Při volbě vhodného typu souboru pro uložení dat výškového pole jsem měl několik možností:
1. vytvořit úplně nový formát.
2. použít stávající formát a vložit do něj doplňkové informace.
3. použít stávající formát a doplňkové informace uložit v dalším souboru.

Vytvoření nového formátu je asi zbytečná práce. Jde o to, že výškovou mapu lze vytvářet a upravovat v běžných grafických editorech, takže je dobré použít některý široce podporovaný formát.

Doplňkové informace v některém známém grafickém formátu přinášejí komplikace. Některé programy by odmítly takový formát načíst, nebo by při uložení souboru došlo k vymazání těchto informací.

Nejlepší je tedy (podle mého názoru) použít existující formát beze změny a pro uložení doplňkových informací použít externí soubor.


Při výběru vhodného formátu jsem zvažoval několik typů souborů. Byly to: GIF, JPEG, PCX, TGA, TIFF, PNG. Jde tedy o ty nejrozšířenější formáty souborů.

GIF je vhodný pro uložení dat do bitové hloubky 8. Mezi jeho výhody patří dobrá komprese. Jeho největší nevýhodou je, že kompresní algoritmus je patentovaný firmou Unisys a díky hrabivosti této firmy a její patentové politice se velká část počítačové komunity rozhodla formát GIF ignorovat.
JPEG používá ztrátovou kompresi a pro přesná GIS data je tedy nepoužitelný. Také jeho dva barevné kanály jsou v polovičním rozlišení.
PCX by byl vhodný, ale neumožňuje uložit 16-ti bitovou bitmapu a jeho RLE kompresní algoritmus není pro GIS data příliš dobrý.
TIFF je složitý formát, který je mnohdy nepřenositelný mezi aplikacemi.
PNG umožňuje ukládat data ve všech myslitelných bitových hloubkách a používá dobrý kompresní algoritmus. V budoucnu by se na tento formát mohlo přejít. Jestliže padne GIF, stane se tento formát (vedle JPEGu) nejrozšířenější. Pokud někdo bude mít zájem na prozkoumání zdrojových textů knihoven pro PNG, budu velmi rád (lze samozřejmě použít do ročníkového projektu).

Zbývá tedy TGA. Tento formát umožňuje uložit obrázky v bitové hloubce 8, 16, 24 a 32. U bitové hloubky 8 a 32 lze definovat průhlednost (tedy ALFA kanál).


Popis souboru TGA
Bitmapa v souboru TGA může být komprimována nebo volně uložena. Zvolíme volné uložení, protože je jednodušší.

Soubor TGA začíná hlavičkou, která má velikost 18 byte.
Struktura hlavičky:
offsetvelikost (B)název význam
0 1 IDLength velikost obrazového identifikátoru
1 1 ColorMapType typ barevné mapy
2 1 ImageType typ obrázku
3 2 CMapStart počátek barevné mapy
5 2 CMapLength délka barevné mapy
6 1 CMapDepth hloubka položek barevné mapy
7 2 XOffset X-ová souřadnice počátku obrázku
9 2 YOffset Y-ová souřadnice počátku obrázku
11 2 Width šířka obrázku
13 2 Height výška obrázku
15 1 PixelDepth pixelová hloubka
16 1 ImageDescriptorpopisovač obrázku


IDLength je počet významných bytů v poli předlohy za hlavičkou. My budeme používat hodnotu 0, protože žádné identifikační pole nebudeme používat.
ColorMapType nastavíme na 0, protože se v souboru nebude nalézat žádná paleta.
ImageType bude mít následující hodnoty:
2truecolor
3monochrom

CMapStart a CMapLength bude nastaveno na 0, protože se nepoužívá barevná paleta.
CMapDepth obsahuje počet bitů v každém paletovém vstupu a proto opět nastavíme na 0.
XOffset a YOffset nastavíme na 0, obrázek tedy začne v rohu obrazovky.
Width a Height se nastaví na šířku a výšku obrázku. Tyto hodnoty jsou uloženy jako little endian.
PixelDepth může nabývat hodnot 8, 16, 24 a 32. Nastavíme podle předlohy výškové mapy.
ImageDescriptor nastavíme na hodnotu 0x20, což znamená počátek souboru vlevo nahoře.

Příklad typických souborů

1 bit na pixel bez palety
hodnota [hexa]význam
00 základní typ hlavičky
00 paleta není přítomna
03 typ obrazu monochrom
00 00 délka palety 0
00 00 00 počet bitů na položku palety je 0
00 00 00 00 umístění obrázku do počátku
XX XX rozměr X
YY YY rozměr Y
01 počet bitů na pixel je 1
20 umístění obrázku
... obrázek po řádcích 1 bit na pixel


8 bitů na pixel + paleta
hodnota [hexa]význam
00 základní typ hlavičky
01 paleta
01 typ obrazu s paletou
00 01 délka palety 256
18 počet bitů na položku palety je 24
00 00 00 00 umístění obrázku do počátku
XX XX rozměr X
YY YY rozměr Y
08 počet bitů na pixel je 8
20 umístění obrázku
... položky palety v pořadí R-G-B
... obrázek po řádcích 1 byte na pixel


8 bitů na pixel monochromaticky [odstíny šedi]
hodnota [hexa]význam
00 základní typ hlavičky
00 paleta není přítomna
03 typ obrazu monochrom
00 00 délka palety 0
00 00 00 počet bitů na položku palety je 0
00 00 00 00 umístění obrázku do počátku
XX XX rozměr X
YY YY rozměr Y
08 počet bitů na pixel je 8
20 umístění obrázku
... obrázek po řádcích 1 byte na pixel


24 bitů na pixel
hodnota [hexa]význam
00 základní typ hlavičky
00 paleta není přítomna
02 typ obrazu truecolor
00 00 délka palety 0
00 00 00 počet bitů na položku palety je 0
00 00 00 00 umístění obrázku do počátku
XX XX rozměr X
YY YY rozměr Y
18 počet bitů na pixel je 24
20 umístění obrázku
... obrázek po řádcích 1 byte na pixel


Uložení barev v bitové mapě

Formát uložení je little endian, vše se tedy čte přesně naopak, než je popsáno:

8 bit/pixel - každý byte představuje jeden pixel a jde buď o index do palety nebo o stupnici šedé barvy.

16 bit/pixel - pixel je uložený ve dvou bytech. Význam od MSB k LSB:
ARGB - A má velikost 1 bit, R G a B velikost 5 bitů

24 bit/pixel - pixel je uložený ve třech bytech. Postupně R,G a B, kde každá položka má velikost 8 bitů.

32 bit/pixel - pixel je uložený ve čtyřech bytech. Formát ARGB, kde každá položk má velikost 8 bitů.


Poslední modifikace: 15:55:21.23 18.10.1999

      Úvodní stránka Domácí stránka E-mail