SVEUČILIŠTE U ZAGREBU FAKULTET ELEKTROTEHNIKE I RAČUNARSTVA SEMINARSKI RAD U OKVIRU PREDMETA "Računalna forenzika" 2016/2017 GIF FORMAT (.gif) Renato-Zaneto Lukež Zagreb, siječanj 2017.
Sadržaj 1. Uvod... 1 2. GIF datoteka... 2 2.1 Opis formata... 2 2.2 Zaglavlje... 3 2.3 Logički opis ekrana... 4 2.4 Globalna tablica boje... 4 2.5 Dodatak grafičkog upravljača... 5 2.6 Opis slike... 6 2.7 Podaci slike... 6 2.8 Dodaci običnog teksta, aplikacije i komentara... 7 2.9 Podnožje... 8 Zaključak... 9 Literatura... 10
1. Uvod "Graphics Interchange Format" ili bolje poznatiji kao GIF je format slike bitne mape proizveden u tvrtki internetskog poslužitelja "CompuServe" 1987 godine. Od onda se njegova primjena uvelike proširila na World Wide Web, te se zbog njegove podrške i pokretnosti danas smatra jednim od dva najpopularnija grafička formata za razmjenu slika. Format podržava 8 bita po pikselu za svaku sliku i time omogućuje da se jedna slika referencira na vlastitu paletu od 256 različitih boja odabranih iz RGB prostora boja definiranih s 24 bita. Isto tako podržava animacije i omogućuje odvojene palete od 256 boja za svaki idući okvir. Takva ograničenja palete GIF format čine manje prikladnim za prikaz boje u fotografijama i drugim slikama s kontinuiranom bojom, ali je prikladan za prikaz jednostavne slike poput jednobojne grafike ili logotipa. GIF slika se kompresira korištenjem "Lempel-Ziv-Welch" (LZW) kompresije bez gubitka podataka koja umanjuje veličinu datoteke bez da degradira njezinu vizualnu kvalitetu. Ovakva kompresija patentirana je 1985 godine. Originalna verzija GIF formata zvala se 87a, a njena unaprijeđena verzija 89a koja je omogućila podršku za kašnjenje animacije, prozirnu pozadinsku boju i spremanje specifičnih metapodataka za aplikacije. Već od 1987 godine korisnici "Atari ST" ili "Commodore 64" kućnog računala mogli su gledati slike stvorene u GIF formatu. U rujnu 1995 web preglednik "Netscape Navigator 2.0" dodao je podršku za animirani GIF. U današnje vrijeme svojstvo spremanja više slika u jednu datoteku opsežno se koristi za prikaz jednostavnih animacija na internetu. Zbog istog razloga od svibnja 2015 društvena stranica "Facebook" dodala je podršku za GIF format, iako ga nije podržavala od samog početka. U nastavku ovog seminarskog rada opisuje se struktura GIF datoteke gdje se detaljno pojašnjavaju specifikacije pojedinog bloka koji čine GIF datoteku. 1
2. GIF datoteka 2.1 Opis formata U ovom poglavlju opisat će se struktura GIF datoteke. Kao što je ranije navedeno postoje 2 formata GIF datoteke: GIF87a i GIF89a. S obzirom na to da je GIF89a unaprijeđena verzija, primjer koji ćemo koristiti u nastavku teksta temeljit će se na tom formatu. GIF datoteka sastoji se od nekoliko različitih blokova podataka. Dijagram sa Slike 1. prikazuje različite blokove i prikazuje gdje se oni nalaze u datoteci. Na Slici 1. također možemo vidjeti usporedbu između GIF87a i GIF89a formata. Za razliku od GIF87a, GIF89a ima nekoliko polja više i iz tog razloga opis dijelova blokova vršit će se na GIF89a formatu. Slika 1. - Struktura GIF formata Recimo da je primjer slika dimenzija 10x10 i recimo da će se radi preglednosti ta slika povećati na sliku dimenzija 100x100. Uz tu sliku prikazat će se bitovi spremljeni u takvom tipu datoteke. Ovakav primjer prikazan je na Slici 2. i služit će za približavanje korisnika pojedinim blokovima unutar GIF datoteke s njihovim bitovnim blokom. 2
Slika 2. - Primjer koji koristimo za opis strukturu GIF datoteke 2.2 Zaglavlje Prvi blok je zaglavlje (eng. header) u kojem se nalazi prvih 6 bajtova. Cijela datoteka spremljena je uporabom ASCII znakova. I tako prva tri bajta opisuju format u kojem je datoteka spremljena, a druga tri označavaju koja se verzija GIF formata koristi. Ako pogledamo prvi dio bloka vidimo "GIF" (47="G", 49="I", 46="F"), a ako pogledamo drugi dio bloka vidimo "89a" (ie 38="8", 39="9", 61="a"), odnosno "87a" (ie 38="8", 37="7", 61="a"), ovisno koji se format koristi. Oblik i dio bitovnog bloka koji to označuje može se vidjeti na Slici 3. Slika 3. - Zaglavlje 3
2.3 Logički opis ekrana Blok ispod ovog je logički opis ekrana (eng. logical screen descriptor). Logički opis ekrana nalazi se odmah iza zaglavlja. Ovaj dio datoteke govori dekoderu koliko će prostora zauzeti slika. Točno je dugačak 7 bajtova. Prva dva bajta opisuju širinu platna. Zatim iduća dva bajta opisuju visinu platna. Sljedeći podatak je pakirani bajt, što znači da taj bajt unutar sebe definira dodatne parametre definirane bitovima. Prvi bit unutar tog bajta predstavlja zastavicu globalne tablice boje, iduća tri bita unutar pakiranog bajta predstavljaju razlučivost boje, sljedeći bit predstavlja zastavicu sortiranja, a zadnja tri bita predstavljaju veličinu globalne tablice boje. Kada je završilo očitavanje pakiranog bajta, idući bajt koji se čita je indeks pozadinske boje, a odmah iza njega je zadnji bajt logičkog opisa ekrana koji definira omjer slike u pikselima. Cijela struktura logičkog opisa ekrana prikazuje Slika 4. Slika 4. - Logički opis ekrana 2.4 Globalna tablica boje Idući bloka je globalna tablica boje (eng. global color table). Strukturu bloka globalne tablice boje prikazuje Slika 5. Kao što vidimo, taj blok u sebi sadrži popis svih boja koje slika može prikazati i ne prikazuje boje koje ta lista ne sadrži. Kao što je ranije rečeno svaki GIF može imati svoju paletu boja, a ona se navodi u logičkom opisu ekrana i spremljena je u veličinu globalne tablice boje koja se nalazi u zadnja tri bita pakiranog bajta. Veličinu koja ta tri bita mogu poprimiti je u rasponu od 0-7, a broj boja koji se može prikazati jednak je reda potencije broja dva, gdje je potencija uvećana za jedan. Tako na primjer ako je u veličini globalne tablice boje spremljena vrijednost 0, tada globalna tablica boje može prikazati samo dvije boje - crnu i bijelu. A ako je u veličini globalne tablice boje spremljena vrijednost 7, tada globalna tablica boje u sebi sadrži 256 različitih boja. 4
Slika 5. - Globalna tablica boje 2.5 Dodatak grafičkog upravljača Sljedeći blok opisuje dodatak grafičkog upravljača (eng. graphic control extension). Ovaj blok često se koristi za opisivanje postavki prozirnosti, te upravlja animacijama. On je opcionalan, a sastoji se od 8 bajtova. Prvi bajt je predstavnik dodatka i uvijek ima vrijednost 21. Iduća je oznaka grafičkog upravljača koja je uvijek F9. Treći bajt govori kolika je veličina bloka u bitovima. Idući bajt pakiran je u polje gdje su prva 3 bita rezervirana za buduću uporabu, iduća 3 bita pokazuju metodu odstranjivanja, sljedeći bit je zastavica ulaznog korisnika, a zadnji bit označava zastavicu prozirnosti boje. Nakon toga dolazi vrijeme odgađanja kojeg opisuju 2 bajta. Iza njega polje od jednog bajta definira indeks prozirnosti boje. I konačno zadnji bajt okončava blok, a definiran je ASCII zapisom 00. Raspored bajtova detaljno prikazuje Slika 6. Slika 6. - Dodatak grafičkog upravljača 5
2.6 Opis slike Idući blok je blok opisa slike (eng. image descriptor). Ovaj blok detaljno prikazuje Slika 7., a sastoji se od točno 10 bajtova. Prvi bajt označava razdjelnik slike koji je uvijek definiran ASCII zapisom 2C. Idućih 8 bajtova predstavlja lokaciju i veličinu nadolazeće slike i to parametrima lijeve pozicije slike, gornje pozicije slike, širine slike i visine slike i to tako da je svaki parametar reda veličine 2 bajta. Zadnji bajt je opet pakirano polje gdje prvi bit označava zastavicu lokalne tablice boja, drugi bit označava zastavicu preklapanja, treći bit zastavicu sortiranja, iduća dva bita rezervirana su za buduću uporabu i zadnja tri bita koji označavaju veličinu lokalne tablice boja. Nakon opisa slike lokalna tablica boje (eng. local color table) nalazi se odmah iza ako je uključena zastavica za lokalnu tablicu boja. Slika 7. - Opis slike 2.7 Podaci slike Nakon opisa slike konačno stižemo u blok u kojem se nalaze podaci slike (eng. image data). Podaci slike sastoje se od skupa izlaznih kodova koje govore dekoderu koju boju treba prikazati na platnu. Ti kodovi sastavljeni su u bajtove koji definiraju taj blok. Prvi bajt ovog bloka označava minimalnu LZW kodnu veličinu. Ova vrijednost koristi se za dekodiranje i kompresiranje izlaznog koda. Ostatak bajtova označava podatke pod blokova. Pod blokovi su grupe od 1-256 bajtova. Prvi bajt u pod bloku govori koliko bajtova slijedi od ukupnog broja podataka. To mogu biti podaci od 0 (00), pa sve do 255 (FF). Idući bajt označava koliko još bajtova slijedi nakon prethodnog. I tako se nastavlja niz sve dok se ne dosegne pod blok koji kaže da nakon sadašnjeg bajt slijedi pod blok veličine 0 bajtova. Grafički prikaz ove metode prikazuje Slika 8. gdje vidimo da se postupak ponavlja. 6
Slika 8. - Podaci slike 2.8 Dodaci običnog teksta, aplikacije i komentara Idući blokovi koji mogu slijediti nakon podataka slike, a nisu prikazana u primjeru jesu dodatak običnog teksta (eng. plain text extension), dodatak aplikacije (eng. application extension) i dodatak komentara (eng. comment extension). Kao i svi blokovi dodatka svaki od ta tri bloka za prvi bajt poprimaju ASCII vrijednost 21. Kod dodatka običnog teksta idući bajt koji slijedi jest oznaka običnog teksta. ASCII vrijednost 01 koristi se kako bi izdvojio običan tekst od svih ostalih dodataka. Njegov idući bajt označava veličinu bloka i radi na sličan način na koji rade podaci slike. Ako radimo s dodatkom aplikacije idući bajt poprimit će ASCII vrijednosti FF kojim se aplikacija izdvaja od svih ostalih dodataka. Nakon toga idući bajt označava veličinu bloka čija je ASCII vrijednost 0B i ona sadrži dvije informacije. Prvih 8 bitova označava koji se aplikacijski identifikator koristi, a preostala 3 bita označavaju ovjeru koda aplikacije. Nakon toga slijede podaci aplikacije koji su definirani na isti način na koji su definirani podaci slike. Ono što je bitno za naglasiti jest da ovaj dodatak omogućuje da se ostvare animacije i ponavljaju iznova umjesto da se samo jednom izvrše. Zadnji dodatak definira dodatak komentara. Njegov idući bajt poprima ASCII vrijednost FE što definira oznaku za komentare i izdvaja ovaj dodatak od drugih. Nakon toga odmah se skače u pod blok gdje su spremljeni podaci komentara. U sva tri dodatka blok završava kada se dosegne pod blok veličine 0. 7
2.9 Podnožje Kada se prođu svi blokovi dodataka dolazi se na zadnji blok, blok podnožja (eng. trailer). Slika 9. prikazuje oblik tog bloka i s njim se označava da je čitanje datoteke došlo do kraja i definira se pomoću ASCII vrijednosti 3B. Slika 9. - Podnožje 8
Zaključak "Graphics Interchange Format" smatra se jednim od dva najpopularnija grafička formata za razmjenu slika. GIF format je manje prikladnim za prikaz boje u fotografijama i drugim slikama s kontinuiranom bojom, ali je prikladan za prikaz jednostavne slike poput jednobojne grafike ili logotipa. Postoje dva tipa formata GIFa: GIF87a i GIF 89a, no u današnje vrijeme pretežito se koristi format GIF89a. Glavna razlika između ta dva formata jest to što GIF89a podržava kašnjenje animacija i transparentnost boje. GIF datoteka formata GIF89a sastoji se od 11 blokova: zaglavlje, logički opis ekrana, globalna tablica boje, dodatka grafičkog upravljača, opisa slike, podataka slike, dodatka običnog teksta, dodatka aplikacije, dodatka komentara i podnožja. Blok podataka slike kompresira se korištenjem "Lempel-Ziv-Welch" (LZW) kompresije, a u dodatku aplikacije definiramo ponašanje naše animacije gdje možemo odrediti da se naša animacija može vrtjeti u petlji, a također možemo definirati transparentnost slike. GIF format također podržava tekstualni zapis, a podržava i komentare. 9
Literatura [1] CompuServe Incorporated, 15.07.1987., G I F (tm), https://www.w3.org/graphics/gif/spec-gif87.txt [2] CompuServe Incorporated, 31.07.1990., GRAPHICS INTERCHANGE FORMAT(sm), https://www.w3.org/graphics/gif/spec-gif89a.txt [3] CompuServe Incorporated, GIF File Format Summary, http://www.fileformat.info/format/gif/egff.htm [4] Matthew Flickinger, What's In A GIF - Bit by Byte, http://www.matthewflickinger.com/lab/whatsinagif/bits_and_bytes.asp [5] Matthew Flickinger, What's In A GIF - LZW Image Data, http://www.matthewflickinger.com/lab/whatsinagif/lzw_image_data.asp [6] Matthew Flickinger, What's In A GIF - Animation and Transparency, http://www.matthewflickinger.com/lab/whatsinagif/animation_and_transp arency.asp 10