|
|||||||||||||||||||||||||||||||||
GIFGIF je skratka od Graphics Interchange Format a je výtvorom firmy Compuserve Inc. Compuserve dovoľuje neobmedzené použitie tohto formátu s podmienkou, že ich uvediete ako autora formátu. Na druhej strane, kompresia použitá v tomto formáte (LZW), už bola predmetom niekoľkých súdnych sporov. Čítanie a uchovávanie grafických súborov komprimovaných LZW algoritmom je povolené, ale na druhej strane tvorba softvéru, ktorý vie zapisovať pomocou LZW kompresie, je nelegálna. Organizácia súboruFormát GIF sa veľmi líši od bežných bitmapových formátov. Skladá sa zo série dátových blokov a subblokov. Tento formát je schopný uchovávať dáta s bitovou hĺbkou od 1 do 8 bitov. Tiež je schopný ukladať viacej obrázkov naraz. Existujú dve verzie tohto formátu. Pôvodná verzia má označenie 87a, neskoršia verzia 89a. V novšej verzii bola pridaná schopnosť hlavne ukladať text a grafiku v jenom súbore. GIF87aTáto verzia, ako hovorí jej názov, bola vytvorená v roku 1987. Každý súbor začína vždy hlavičkou a popisom logickej obrazovky. Za ním môže nasledovať globálna tabuľka farieb. HlavičkaHlavička je dlhá vždy šesť bajtov a slúži iba na identifikovaniu súbora. Popis logicikej obrazovky sa dá označiť za druhú hlavičku.
typedef struct _GifHeader {
// Header
BYTE[3] Signature; /* označenie, vždy ("GIF") */
BYTE[3] Version; /* verzia, ("87a", alebo "89a") */
// screen descriptor (popis logickej obrazovky)
WORD ScreenWidth; /* šírka obrázka v bodoch */
WORD ScreenHeight; /* výška obrázka v bodoch */
BYTE Packed; /* informácia o obrazovej a farebnej mape */
BYTE BackGroundColor; /* index farby pozadia */
BYTE AspectRatio; /* pomer strán obrázka */
} GIFHEAD;
Popis logickej obrazovky
Globálna tabuľka fariebJe to séria trojbajtových čísiel, kde každá trojica obsahuje hodnotu červenej, zelenej a modrej zložky pre danú farbu.
typedef struct _GifColorTable {
BYTE Red; /* červená zložka farby */
BYTE Green; /* selená zložka farby */
BYTE Blue; /* modrá zložka farby */
} GIFCOLORTABLE;
Počet položiek v globálnej palete je vždy mocninou čísla 2. Maximálne číslo je 256 a jeho veľkosť
v bajtoch sa dá zistiť následujúcim výpočtom: velkost_tabulky = 3 * (1L <<
(velkost_globalnej_tabulky_farieb + 1))
Ak sa v súubore táto tabuľka nenachádza, potom má každý obrazok svoju lokálnu tabuľku farieb, ktorú používa namiesto globálnej. Lokálny popis obrázku
typedef struct _GifImageDescriptor {
BYTE Separator; /* Indetifikátor */
WORD Left; /* súradnica X obrázku na obrazovke */
WORD Top; /* súradnica Y obrázku na obrazovke */
WORD Height; /* šírka obrázku v bodoch */
WORD Width; /* výška obrázku v bodoch */
BYTE Packed; /* inromácia o obrazovej a farebnej mape */
} GIFIMGDESC;
Lokálna tabuľka farieb
Platí pre ňu to isté ako pre globálnu tabuľku farieb. Následuje hneď za popisom lokálneho obrázku.
Na výpočet jej veľkosti sa používa Obrazové dátaSúbory GIF sa nedajú veľmi komprimovať pomocou archivačných programov ako ZIP, RAR. Dôvodom je v metóde uloženia obrazových dát, ktoré sú komprimované pomocou kompresie LZW.
GIF ukladá svoje dáta ako sériu subblokov. Každý dátový subblok začína počítadlom, ktorého hodnota je v
rozmedzí od Samotný formát dekódovaných dát je pomerne jednoduchý. Každý bod v dekódovanom skanovacom riadku je index do globálnej alebo lokálnej palety.
Skanovacie riadky sú obvykle ukladané za sebou, začínajúc prvým riadkom a končiac posledným. Formát GIF
podporuje však aj prekladanú (interlaced) metódu. Použitá prekladaná metóda je štvorprechodová. Prvý
prechod začína na riadku Trailer
Trailer je jediný bajt dát, ktorý je uložený ako posledný znak v súbore. Jeho hodnota je GIF89aTáto verzia bola zverejnen8 roku 1989. Formát je veľmi podobný formátu GIF87a. Obsahuje naviac niekoľko nových rozširujúcich blokov. Blok rozšírenia grafikyInformácie, ktorá tento blok obsahuje, slúžia na modifikáciu dát vykresľovacieho bloku, ktorý za ním bezprostredne nasleduje. Môže modifikovať bitmapu aj textové pole.
typedef struct _GifGraphicsControlExtension {
BYTE Identifier; /* identifikátor, vždy 21h */
BYTE Label; /* názov tohto rozšírenia, vždy F9h */
BYTE BlockSize; /* veľkosť ostatných polí, vždy 04h */
BYTE Packed; /* metóda, pomocou ktorej sa bude pracovať s grafikou */
WORD DelayTime; /* pauza v desatinách sekundy */
BYTE ColorIndex; /* index prehľadnosti farby */
BYTE Terminator; /* terminátor bloku, vždy 0 */
} GIFGRAPHICSCONTROL
Blok rozšírenia štandardného textVerzia GIF89a môže vďaka tomuto bloku uchovávať okrem bitmapových dát aj textovú informáciu. Táto je potom ako grafika zobrazená na obrazovke. Takýchto blokov môže byť v súbore neobmedzene veľa. Každý takýto blok má definovaný raster s jeho príslušnými údajmi (výška , šírka a umiestnenie). Tiež je popísaná veľkosť jednej bunky tohto rastra. V každej bunke môže byť iba jeden znak.
typedef struct _GifPlainTextExtension {
BYTE Identifier; /* identifikátor, vždy 21h */
BYTE Label; /* názov tohto rozšírenia, vždy 01h */
BYTE BlockSize; /* veľkosť bloku rozšírenia */
WORD TextGridLeft; /* X-ová pozícia textového rámčeka v bodoch */
WORD TextGridTop; /* Y-ová pozícia textového rámčeka v bodoch */
WORD TextGridWidth; /* šírka textového rámčeka bodoch */
WORD TextGridHeight; /* výška textového rámčeka v bodoch */
BYTE CelWidth; /* šírka pola v bodoch */
BYTE CelHeight; /* výška pola v bodoch */
BYTE TextFgColor; /* farba textu (index) */
BYTE TextBgColor; /* farba pozadia (index) */
BYTE *PlainTextData; /* vlastný ASCII text */
BYTE Terminator; /* terminátor bloku, vždy 0 */
} GIFPLAINTEXT
Blok rozšírenia pre aplikáciu
typedef struct _GifApplicationExtension {
BYTE Identifier; /* identifikátor, vždy 21h */
BYTE Label; /* názov tohto rozšírenia, vždy FFh */
BYTE BlockSize; /* veľkosť bloku rozšírenia, vždy 0Bh */
CHAR IdApplication[8]; /* identifikátor aplikácie */
BYTE AuthentCode[3]; /* oprávňovací kód aplikácie */
BYTE *ApplicationData; /* pointer na subbloky príslušných dát */
BYTE Terminator; /* terminátor bloku, vždy 0 */
} GIFAPPLICATION;
Toto rozšírenie nebudem vôbec vysvetľovať, pretože nie je nevyhnutné pre zobrazovanie dát.
Pre možnosť dekódovanie tohto bloku len spomenie, že pole ApplicationData
má rovnakú štruktúru ako pole PlainTextData v textovom rozšírení.
Blok rozšírenia komentáraDo tohto bloku sa dajú ukladať ľudsky čitateľné texty maximálnej dĺžky 255 znakov. Takýchto blokov sa môže v súbore vyskytovať neobmedzene veľa. Tieto dáta nie sú určené pre zobrazovanie, ale iba pre človeka, ktorý skúma daný súbor.
typedef struct _GifCommentExtension {
BYTE Indetifier; /* identifikátor, vždy 21h */
BYTE Label; /* názov tohto rozšírenia, vždy FEh */
BYTE *CommentData; /* pointer na subbloky komentových dát */
BYTE Terminator; /* terminátor, vždy 0 */
}
|
|||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||