BMP i GIF format slike
Pogledajmo BMP i GIF format slike, kao primjer kako se definiraju formati datoteka u kojima su pohranjeni podaci o slici.
BMP
BMP predstavlja jedan od najjednostavnijih formata slike. Windows BMP je nativni format slike u Microsoft Windows operativnim sistemia. On podržava slike sa 1, 4, 8, 16, 24 i 32 bita boje po pikselu, ali su BMP datoteke koje koriste 16 i 32 bita rijetko u upotrebi. Pored ovoga, BMP podržava i jednostavnu run-length kompresiju za slike sa 4 ili 8 bita po pikselu.
Struktura BMP datoteke je vrlo jednostavna i sastoji se od četiri dijela:
- File Header – zaglavlje datoteke,
- Image Header – zaglavlje slike,
- Color Table – tabela boja,
- Pixel Data – podaci o pikselima slike.
File Header
Svaka BMP datoteka započinje sa BITMAPFILEHEADER strukturom.
Osnovna funkcija ove strukture je da označi format datoteke. Da bi se utvrdilo da se radi o BMP datoteci, mogu se izvršiti tri provjere:
- Prva dva bajta moraju sadržavati ASCII znakove “B” i “M”.
- Ako koristimo datotečni sistem na kojem je moguće odrediti tačnu veličinu datoteke, ovu vrijednost uporediti sa vrijednosti polja bfSize.
- Polja bfReserved1 i brReserved2 moraju imati vrijednost 0.
Zaglavlje datoteke određuje i lokaciju podataka o pikselima u datoteci. Pri dekodiranju BMP datoteke koristimo polje bfOffbits da bismo odredili pomak od početka datoteke do mjesta gdje počinju podaci o pikselima.
Image Header
Zaglavlje slike slijedi odmah nakon BITMAPFILEHEADER strukture i dolazi u dva različita formata, kao BITMAPINFOHEADER i BITMAPCOREHEADER strukture. BITMAPCOREHEADER predstavlja BMP format korišten u OS/2, a BITMAPINFOHEADER se koristi na Windows operativnim sistemima.
Na žalost, ne postoji polje koje označava verziju BMP datoteke, tako da je jedini način da se utvrdi o kojoj verziji se radi tako što se ispita polje koje označava veličinu strukture. Ovo polje je prvo polje u obje strukture i dužine je 4 bajta. Ukupna veličina BITMAPCOREHEADER strukture je 12 bajta, a veličina BITMAPINFOHEADER je 40 bajta. Zbog dužine strukture BMP datoteka sa BITMAPCOREHEADER ne koristi kompresiju.
Color Table (Palette)
Tabeja boja slijedi iza zaglavlja sllike i može biti u jednom od tri formata. Dva od njih se koriste da mapiraju podatke o pikselima u RGB vrijednosti boja kada je dubina boje 1, 4 ili 8 bita.
Pixel Data
Podaci o pikselima slijede iza palete boja ili bit maske ako su one prisutne. U suprotnom, prate BITMAPINFOHEADER ili BITMAPCOREHADER strukturu. Redovi piksela su u datoteci poredani od dna prema vrhu. Broj redova je dat sa biHeight ili bcHeight poljem u zaglavlju slike. Veličina reda se određuje na osnovu vrijednosti biBitCount (bcBitCount) i biWidth (bcWidth) polja, pri čemu se vrši zaokruživanje na umnožak od četiri.
Format podataka o pikselima zavisi od broja bita po pikselu:
- 1 bit po pikselu – svaki bajt je podijeljen na 8 poljla čije vrijednosti predstavljaju indeks u paleti boja. Najvažnije bit polje je krajnji lijevi piksel.
- 4 bita po pikselu – svaki bajt je podijeljen na dva polja od po četiri bita.
- 8 bita po pikselu – svaki bajt predstavlja indeks boje u paleti boja.
- 16 bita po pikselu – svaki piksel je predstavljen sa dvobajtnom cjelobrojnom vrijednosti- Ako je vrijednost biCompression polja u BITMAPINFOHEADER strukturi postavljena na BI_RGB (0), intenzitet svake boje je predstavljen sa 5 bita, a najvažniji bit se ne koristi. U slučaju da je ovo polje postavljeno, onda bit maske određuju koji biti se koriste za svaku od komponenti boje.
- 24 bita po pikselu – svaki piksel je predstavljen sa tri bajta, koja određuj plavu, zelenu i crvenu komponentu boje respektivno.
- 32 bita po pikselu – svaki piksel je predstavljen 32-bitnom cjelobrojnom vrijednosti. Ako je biCompression polje postavljeno na BI_RGB, tri niža bajta predstavljaju 8-bitne vrijednosti RGB komponenti, dok se najvažniji bit ne koristi. U protivnom tri 32-bitne bit maske koje prate BITMAPINFOHEADER strukturu specificiraju koje bite koristi svaka komponenta boje.
Kompresija (RLE8)
BMP format podržava run-length kodiranje, i to samo za slike sa dubinom boje od 4 (RLE4) ili 8 (RLE8) bita. Slike sa drugim dubinama se ne mogu komprimirati. BMP format se može komprimirati u dva načina rada, odnosno:
- u apsolutnom načinu rada,
- u RLE načinu rada.
Oba načina se mogupojaviti bilo gdje u bitmapi. RLE mod je jednostavan mehanizam RLE kompresije, gdje svaki prvi bajt sadrži broj ponavljanja, a drugi bajt boju piksela koji se ponavlja. Na primjer, sekvenca r80 se može proširiti na 00000000.
Ako je brojponavljanja nula, onda je drugi bajt poseban i njegova uloga može biti:
- 0 kraj linije
- 1 kraj datoteke
- 2 delta – dva iduća bajta su horizontalni i vertikalni offset od trenutne pozicije do sljedećih piksela
- 3-255 – prebacivanje u apsolutni način rada.
U apsolutnom načinu rada, drugi bajt sadrži broj bajtova za kopiranje. Svaki aplsolutni niz mora biti poravnat na riječ, što znači da se moraju dodavati bajtovi koji nisu uračunati u broj. Poslije apsolutnog načina rada, algoritam se vraća u RLE način rada.
GIF
Prvu verziju GIF (Graphic Interchange Format) formata je izdao CompuServe 1987. godine, pod nazivom GIF87a. Ova verzija je distribuirana besplatno, a format je ubrzo usvojen od strane aplikacija za obradu slike. CompuServe je nedugo nakon ove verzije objavio i drugu verziju GIF formata, kompatibilnu sa prethodnom. Ova verzija je poznata kao GIF89a.
Glavne osobine ovog formata su:
- do 256 boja pomoću 1-8 bita po pikselu,
- više slika u jednoj datoteci
- koristi LZW kompresiju.
GIF je definiran u obliku blokova i podblokova, koji sadrže relevantne parametre i podatke koji se koriste za grafički prikaz. Struktura GIF datoteke je data na slici 7.
| Extension Introducer |
| Extension Code |
| Extension Header |
| Data Block 1 |
| Data Block 2 |
| Data Block 3 |
| ... |
| Data Block n |
GIF format koristi LZW kompresiju podataka o slici. Podaci su zapisani u blokovima koji su maksimalne dužine od 255 znakova. Prije postupka kompresije se rječnik inicijalizira brojevima od 0 do 255. Unosi u rječnik sa indeksima 256 i 257 su specijalne vrijednosti koje označavaju clear code i end code respektivno. clear code se koristi kako bi se izdala naredba da se rječnik isprazni, a end code se koristi da bi se označio kraj komprimiranih podataka. Za kodiranje podataka se može koristiti maksimalno 12 bita, što ograničava broj unosa u rječnik na 4096.