DETAILNÍ POPIS FORMÁTU BMP, TIFF, PCX

BMP

Bitmapové soubory Windows jsou uložené ve formátě, který je nezávislý na zařízení (DIP) a tím umožňuje Windows zobrazit tyto soubory na jakémkoliv zobrazovacím zařízení. Implicidní přípona Windows pro tento formát je *.BMP.

Každý BMP soubor obsahuje hlavičku BMP souboru a informační hlavičku, tabulku barev a pole bitů, které určují údaje bitmapy. Soubor má následující formu:

BITMAPFILEHEADER bmfh; ... BMP souborová hlavička
BITMAPINFOHEADER bmih; ... BMP info hlavička
RGBQUAD aColors[ ]; ... RGB pole
BYTE aBitmapBits [ ]; ... byte


BMP souborová hlavička obsahuje informace o typu, velikosti a úpravě tohoto od zařízení nezávislého souboru. Hlavička je definovaná jako BMP_FILE_HEADER (struktura):


typedef struct {
	char password1;	// Nastavené na "B"
	char password2;	// Nastavené na "M"
	long file_size;	// Velikost souboru s image
	int reserved1;	// Reservované1, nastavené na 0
	int reserved2;	// Reservované2, nastavené na 0
	       } BMP_FILE_HEADER ;
 


BMP info hlavička, definovaná jako BITMAPINFOHEADER struktura specifikuje rozměry, typ komprimace a barevný formát bitmapy.


typedef struct {
	char biHeader;	// Určuje strukturu BMP_INFO_HEADERu = 36h
	char biColor;	// Určuje položku RGB_QUAD = 04h 
	int neznama;        
	      }  BMP_INFO;
typedef struct {
	long biSize;	// Určuje velikost BMP_INFO_HEADERu
	long sirka;	// Šířka 
	long vyska;	// Výška 
	int planes;		// Počet zobrazovacích rovin
	int BitCount;	// Bity na pixel : 8 =>256 barev
	long compresion; 	// 0 - nekomprimovaná BMP, jinak komrimovaná
	long sizeImage;	// Velikost obrázku v bytech

	long X_Resolution;	// Velikost obrazovky v pixelech X-osy
	long Y_Resolution;	// Velikost obrazovky v pixelech Y_osy
	long ColorUsed;	// Pole použitých barev, když 0 => všechny
	long ColImportant;	// Pole základních barev pro daný image
	      } BMP_INFO_HEADER;
 


Tabulka barev, definovaná jako pole RGB_QUAD struktur, obsahuje tolik položek, kolik je barev v bitmapě. Tabulka barev se nachází v 24 bitmapovém formátě, protože je tu každý pixel reprezentovaný 24 bitmi RGB hodnot v aktuální udajové oblasti. Barvy v tabulce by se měli objevit v pořadí jejich důležitosti. toto pomáhá ovladači displeje preddefinovat bitmapu na zařízení, které nemůže zobrazit tolik barev kolik je jich v bitmapě. Jestliže DIP je ve Windows verzi 3.0 a vyšší, ovladač může použít biClrImportant člen (tj. člen barevné priority) z BITMAPINFOHEADER struktury na určení, které barvy jsou prioritní. BITMAPINFO struktura může být použitá na reprezentaci konbinovanou z BMP info hlavičky a tabulky barev. Byty bitmapy nasledující bezprostředně za tabulkou barev, vytvářených z pole bytových hodnot reprezentujících po sobě jdoucí řadý, nebo "scan řádky" bitmapy. Každý "scan řádek " je tvořen z po sobě jdoucích bytech, reprezentujících pixely v "scan řádku", v pořadí zleva doprava. Počet bytů reprezentujících "scan řádek" závisí na barevném formátu a šířce bitmapy v pixelech. ("scan řádek" musí být zarovnaný nulami na konec 32 bitového okraje.) Ale segmentové okraje se mohou objevit kdekoliv v bitmapě. "Scan řádky " se vbitmapě ukládají zdola nahoru. To znamená, že první byte v oli reprezentuje pixely v levém dolním rohubitmapy a poslední byte reprezentuje pixely v pravém horním rohu.

Člen biBitCount BITMAPINFOHEADER struktury určuje počet bitů, které definují každý pixel a maximální počet barev v bitmapě. tyto členy mohou mít následující hodnoty:

Hodnota Význam
1 Bitmapa je monochromatická a tabulka barev obsahuje dva vs tupy. Každý bit pole bitmapy reprezentuje pixel. Když bit není nastavený (0), pixel bude zobrazený barvou prvního vstupu tabulky barev. Když je bit nastavený (1), pixel má barvu 2. vstupu tabulky barev.
4 Bitmapa má maximálně 16 barev. Každý pixel bitmapy je reprezentovaný 4 bitovým indexem v tabulce barev. Například, když je 1. byte v bitmapě 0x1F, byte reprezentuje dva pixely. První pixel obsahuje barvu z druhého vstupu tabulky a druhý pixel obsahuje barvu z 16. vstupu tabulky.
8 Bitmapa má maximálně 256 barev. Každý pixel bitmapy je reprezentovaný 1-bytovým indexem v tabulce barev. Například, když 1. byte v bitmapě je 0x1F, 1. pixel má barvu 32. vstupu tabulky.
24 Bitmapa má maximálně 2 24 barev. Člen bmiColors (bmciColors) je 0, každá 3-bytová sekvence v bitmapovém poli reprezentuje relativní intenzity červené, zelené, nebo modré pro pixel.

"biClrUsed" člen BITMAPINFOHEADER struktury specifikuje počet indexů barev v aktuální tabulce barev. Když "biClrUsed" člen je nastavený na nulu, bitmapa používá maximální počet barev odpovídající hodnotě "biBitCount" členu. Alternativní forma bitmapového souboru používá BITMAPCOREINFO, BITMAPCOREHEADER, a RGBTRIPLE struktury.

 


TIF

Grafický formát TIFF ( Tag Image File Format ) vznikl ve spolupráci firem Aldus a Microsoft. Oblast jeho hlavního použití je typografie - DTP (desk-top publishing).Stejně jako formát GIF se i tento formát implementuje kromě počítačů PC IBM i na počítačích Mackintosh, pracovních stanicích s operačním systémem UNIX a na velkých počítačích, např. typu VAX. Pro grafický formát TIFF je charakteristická velká pružnost reprezentace údajů, co má ale v některých případech nežádoucí důsletky v tom, že v případě zpracování souboru na jiném počítači vznikají problémy (počítač hlásí chybové zprávy, např. "Neznámý formát údajů" a podobně).

Soubory v grafickém formátě TIFF jsou generovány různými kreslícími programami, scannerami, kamerami pro počítačové videní a dalšími podobnými zařízeními. Údajový soubor má v podstatě tři části:

  • 1. malý údajový blok - hlavička (header),
  • 2. blok informací určujících interpretaci obrazových údajů,
  • 3. vlastní obrazové údaje.

Soubor v grafickém formátě TIFF popisuje určitý logický obrázek, který se obyčejně můlže skládat z několika stránek nebo může být reprezentovaný v různých rozlišeních. Každá ze stránek nebo každé rozlišení vytváří určitou jednotku vevnitř souboru.Soubor může obsahovat libovolné množství těchto jednotek, ale obyčejně je v souboru jen jedna obrazová stránka v jednom rozlišení.

Hlavička souboru má osm bytů. První dva byty udávají pořadí, ve kterém budou slabiky vytvářející soubor spracované. Když tyto dva byty obsahují dvojici znaků 'II', je to verze určená pro procesory Intel 80x86, co znamená, že méně významný je první byte slova. Když v první dvojici znaků je uložená dvojice znaků 'MM', jsou údaje určené pro počítače s procesorem Motorola 680x0 (významnější je první byte slova). Programová konverze údajů z jednoho tvaru na druhý není problematická.

Další slovo (dva byty) by měli obsahovat číslo verze, obvykle obsahuje číslo 42 (2Ah). Již na tento údaj se vstahuje informace o pořadí bytů z předcházejícího slova - slovo má buď tvar 2A00h nebo 002Ah. Poslední čtyři byty hlavičky obsahují odkaz na první blok řídících proměných (directory), nesoucích informace o způsobě interpretace údajů. Odkaz je ve formě posunutí (offset) vzhledem na začátek celého souboru.

Blokřídících proměných má tři části. První dvojice bytů obsahuje informaci o celkovém počtu hodnot v bloku. Následují vlastní položky - každá 12 bytů dlouhá. Na konci bloku řídících proměnývh je odkaz dlouhý čtyři byty na blok řídících proměnných. Když je odkaz nulový, další blok v souboru už neexistuje.

Každá položka s délkou 12 bytů obsahuje několik částí (polí). První pole dlouhé dva byty určují typ položky - např. hodnota 256 se vstahuje k údaji o šířce obrázku. Položky jsou v blocích řídících proměných uspořádané vzestupně právě podle údaje v prvních dvou bytech. Další pole má stejnou délku dva byty a určuje jakého typu jsou následující údaje. Formát TIFF rozeznává pět různých údajových typů:

1 BYTE osmbitové celé číslo bez znaménka
2 ASCII posloupnost osmbitových ASCIIznaků
3 SHORT šestnáctbitové celé číslo bez znaménka
4 LONG celé číslo bez znaménka s délkou 32 bitů
5 RATIONAL zlomek dvou čísel typu LONG (první je čitatel, druhé jmenovatel).


Třetí pole obsahuje informace o počtě údajů daného typu, které tvoří vlastní informace, kterých význam je daný prvním polem položky. Když je např. údajový typ typu LONG (dva byty) a počet údajů je 20, potom dané položce patří 40 bytů vlastních údajů. Poslední pole v položce obsahuje vlastní údaje. Toto pole má vždy délku čtyři byty. Když je objem údajů menší jak čtyři byty, jsou údaje umístěné sem. V opačném případě je v těchto čtyřech bytech odkaz do rozšiřujícího bloku, kde jsou uložené vlaství údaje.

Obrazové údaje jsou uložené ve formě bloků, které se nazývají pásy - strips. Údaj o jejich velikosti a umístění v souboru (offset) je uložený v bloku řídících proměných. Velikost pásů je volitelná a pohbuje se od jednoho řádku až po celý obrázek. Obvyklý objem údajů uložený v páse se pohybuje okolo 8kB. 

Stejně jako v případě jiných grafických formátů je možné komprimovat obrazové údaje. Je možné volit několik různých metod pro zakódování údajů: Huffmanovo kódování,a další metody. V některých implementacích ale nejsou k dispozici všechny předepsané metody, a tak se často nedoporučuje obrazové údaje komprimovat.

Vzhledem k poměrně veliké volnosti při používání formátu TIFF rozhodli se jeho tvůrci vytvořit čtyři základní třídy (TIFF-Classes), které by údávaly určité hravice při používání formátu TIFF. Když patří zakódovaný obrázek do určité třídy, musí mít určité položky předepsané hodnoty. Tyto třídy jsou čtyři a určují "barevnost" obrázku: černobílý, odstíny šedé, barevný pomocí palety, barevný pomocí složek RGB.

Obrazové údaje jsou uložené bez komrimace v černobílém provedení. Informace o této skutečnosti jsou uložené v úplném bloku řídících proměných. První řídící proměná (NewSubfile Type) určuje charakteristiku souboru v tomto smyslu: je-li to jedno nebo vícestránkový obrázek, údaje o tom, jestli je to obrázek s omezenou rozlišitelností atd.

Offset bytů Popis

0 - 1

Počet záznamů

2 - 13

První záznam v adresáři s délkou 12 bytů:
0 - 1 Číselný oprerační kód identifikující záznam (štítek)
2 - 3 kód označující typ údajů (1 - 5)
4 - 7 délka údajů
8 - 11 vlastní údaje, resp. odkaz na údaje

14 - 17

0000 ukončení adresáře obrazového souboru
Tab. 1.6 Struktura adresáře obrazového souboru formátu TIFF


Operační kód je vyjádřený v hexadecimálním tvaru:

  • 100 Šířka obrazu. Určuje počet sloupců obrazu.
  • 101 Délka obrazu. Určuje počet řádků obrazu.
  • 102 Počet bitů na pixel. Hodnoty jsou 1, 2, 4 nebo 8. Typ slovo s délkou 1.
  • 103 Komprimace.
    	1 - žádná komprimace,
    	2 - komprimace typu Huffman,
    	3 - komprimace typu LZW,
    	32773 - komprimace typu Pack Bits
    Typem je slovo s délkou 1	
  • 106 Fotometrická interpretace. Když obsahuje nulu, 0 = bílá, když obsahuje 1, nula = černá. Typ slovo.
  • 10F Autor. Řetězce v kódě ASCII, typem je 5. Např. "Mark M".
  • 116 Počet řádků na pás. Dvojslovo (typ = 4).
  • 117 Počet bytů v páse. Hodnotami jsou dvojslova.
  • 111 Offsety pásů. Typ údajů jsou jsou dvojslova.

Další operační kódy jsou informační:

  • FF a FE Typ podsouboru a nového podsouboru. Kód 1 pro podsoubor, kód 0 pro nový podsoubor.
  • 11A a 11B Rozlišení ve směru osy X a rozlišení ve směru osy Y. Rozlišení obrazu může být např. 1/72", 1/50", 1/300", 1/400. Tento operační kód upozorňuje čtecí program na rozlišení obrazu. Proměnné jsou uložené jako dvojslova typu 5 (zlomek), který má nejdřív jmenovatelea potom čitatele.
  • 128h Jednotka rozlišení. Výběr metrických, resp. anglických jednotek. Typem jednotky je slovo. Hodnoty jsou:
    		1 = žádná jednotka,
    		2 = palce,
    		3 = centimetry.	
    
  • 115h Vzorek na pixel. Pro monochromatické obrazi se hodnota rovná vždy 1.Typem údajů je slovo.
  • 13B Umělec. Jméno umělce, autorská práva.
  • 131 Software. Pro jméno a verzi software,který vytvořil obraz.
  • 132 Čas, datum. Uložené jako "YYYY:MM:DD HH:MM:SS". Hodiny se vyjadřují číslicemi od 0 do 23.
  • 13C Hostitelský počítač. Anebo typ softwaru, který byl použitý při záznamě obrazu.
  • 10E Popis obrazu. Formát TIFF popisuje soubor.
  • 10F a 110 Značka a model scanneru, krerý vytvořil obraz.

 


PCX

Grafický formát PCX vyvinula firma ZSoft. Má 128b velkou hlavičku, za kterou následují zkomprimovaná obrazová data a případně ještě paleta.

Offset Jméno Velikost (byte) Popis
00h Password 01h identifikátor PCX=0Ah
01h Version 01h číslo verze
02h Encoding 01h způsob použitého kódování (0=žádné, 1=PCX RLE)
03h BitsPerPixel 01h počet bitů na pixel
npř.1= 2 barvy
4= 16 barev
8= 256 barev
atd.
04h WindowDimension 08h souřadnice obrazu X1, Y1, X2, Y2
0Ch HorizontalRes 02h vodorovné rozlišení obrazu
0Eh VerticalRes 02h svislé rozlišení obrazu
10h ColorMap 30h paleta pro 16 bar. obraz (R, G, B)
40h Reserved 01h rezervováno
41h ColorPlanes 01h počet obrazových rovin
42h BytesPerLine 02h počet bajtů na řádek
44h PaletteInfo 02h způsob interpretace paletyBR>1 - color/mono
2 - odstíny šedé
46h Nonused 3Ah 58 volných bajtů
7Fh DataArea no def. ...

Za touto úvodní hlavičkou následuje vlastní grafické informace snad vždy v komprimovaném tvaru. Vzhledem k tomu, že formát pochází z doby, kdy neexistovaly grafické adaptéry, které by zobrazili více jak 16 barev je v úvodním bloku vyhrazeno 16*3 bajtů pro definování právě 16 barev. V této tabulce (ColorMap) je každá ze 16 barev definována třemi složkami R, G, B (proto tedy 16*3 bajtů).

	Verze
	=====
	0	PC Paintbrush 2.5 dovoluje uchovávat obrazy odpovídající 
		schopnostem CGA bez mapy barev.
	2	PC Paintbrush 2.8 uchovává obrazy s až 16ti barvami.
	3	totéž jako verze 2, ale bez uchovávání mapy barev.
	4	PC Paintbrush pro Windows shodná s verzí 5.
	5	PC Paintbrush 3.0+.
		přidána paleta pro 256 barev a schopnost uchovávat obrazy 
		v TrueColor.

 

16 barevný PCX

16 barevné obrázky PCX mohou být uloženy buď jako 4 bitové roviny (kde každá obsahuje jeden bit na pixel), nebo jako jeden obraz složený s použitím 4 bitů na pixel. V prvním případě je ColorPlanes=4, BitsPerPixel=1 a roviny jsou ukládány prokládáně (1. řádek 1. bitové roviny, 1. řádek 2. bitové roviny, ...). V druhém případě je ColorPlanes=1, BitsPerPixel=4 a jeden byte tedy nese informaci o dvou pixlech.

 

256 barevný PCX

V hlavičce souboru musí být nastaveny tyto hodnoty : BitsPerPixel=8, ColorPlanes=1. Protože se původně nepočítalo s větším počtem barev než s 16-ti je paleta 256 barev přidána na konec souboru. Jedná se tedy o 256*3=768 bajtů (vždy R, G, B složka pro každou barvu) před touto paletou by se měl ještě nacházet bajt s hodnotou 0Ch a paleta pak tedy zabírá 769 bajtů na konci souboru. Paleta (ColorMap) v hlavičce obsahuje neplatné barvy.

 

True color PCX

True color PCX obrázky jsou uloženy ve třech 8 bitových obrazových rovinách pro jednotlivé barevné složky R, G, B. Protože True color PCXy obsahují v komprimovaném poly obrazových údajů přimo hodnoty R, G, B složek neobsahují paletu a paleta (ColorMap) v hlavičce obsahuje neplatné barvy.

 

Run Lenght Encoding

Jednotlivé pixely se při dekomprimaci (komprimaci) zapisují (čtou) na obrazovku z levého horního rohu po řádcích až do pravého spodního. Metoda RLE spočívá v zhuštěném zápisu opakujících se bajtů se stejnou hodnotou. Pokud je nalezeno až 63 po sobě jdoucích stejný bajtů jsou při komprimaci zapsány jako dva, kde první určuje počet opakování a má nejvyšší dva bity nastaveny na jedničku proto tedy max. 63 po sobě jdoucích stejný bajtů a druhý bajt udává právě hodnotu opakujících se bajtů. Pokud se vyskytuje jen jeden bajt dané hodnoty je opsán na výstup beze změny, ovšem jen pokud nemá nastaveny nejvyšší dva bity. To by se nám potom při dekomprimaci pletlo. Proto je na výstup zapsán jako hodnota C1h a potom vlastní hodnota bajtu, aby bylo možno jednoznačně rozlišit jednotlivé bajty a komprimované sekvence.

 

Algoritmus pro dekomprimaci vypadá tedy takto :

Var F : File of Byte;
      Z, J, CKL : Byte;
BEGIN
  .
  .
  .
     reset(F);
     seek(F,128);
     while NOT (Filepos(F)=(Filesize(F)-769)) do
     begin
          read(F,Z);
          if (Z and $C0) = $C0 then begin
             J:=Z and $3F;
             read(F,Z);
             for CKL:=1 to J do write(FO,char(Z));
          end
          else write(FO,char(Z));
     end;
  .
  .
  .
END.