semmixkolor i percepcja

Ogólna budowa pliku GIF

Plik GIF to ciąg bloków ułożonych jeden za drugim. Każdy zaczyna się od bajtu, który mówi, czym jest, więc dekoder może czytać plik od początku do końca bez skakania i bez spisu treści.

Schemat

nagłówek "GIF87a" albo "GIF89a" 6 bajtów opis ekranu logicznego wymiary, flagi, kolor tła 7 bajtów [paleta globalna] 3 · 2^(N+1) bajtów, opcjonalna dowolnie wiele razy, w dowolnej kolejności: [rozszerzenie] 21 xx ... GIF89a blok obrazu 2C ... [paleta lokalna] dane LZW koniec pliku 3B 1 bajt

Dokładne zasady kolejności opisuje strona kolejność bloków.

Bajty rozpoznawcze

BajtZnak ASCIIBlok
2C,deskryptor obrazu
21!rozszerzenie, następny bajt to etykieta
3B;koniec pliku

Wartości wybrano tak, żeby były czytelnymi znakami: przecinek, wykrzyknik i średnik. W pierwszych wersjach formatu ułatwiało to przeglądanie plików i przesyłanie ich przez łącza tekstowe.

Podbloki danych

Dane o zmiennej długości (skompresowany obraz, tekst komentarza, dane aplikacji) dzieli się na podbloki. Każdy podblok zaczyna się bajtem długości od 1 do 255, po którym idzie tyle bajtów danych. Ciąg kończy podblok o długości 0, czyli terminator:

05 04 12 30 13 05 00 │ └─ 5 bajtów ─┘ └ terminator └ długość podbloku

Dzięki temu dekoder może pominąć blok, którego nie rozumie: czyta bajty długości i przeskakuje dane, aż trafi na 00. Nie musi znać zawartości, żeby wiedzieć, gdzie blok się kończy.

Liczby little-endian

Liczby 16-bitowe (wymiary, położenie, opóźnienie) są zapisane od najmłodszego bajtu:

04 00 → 0x0004 = 4 2C 01 → 0x012C = 300 FF FF → 0xFFFF = 65 535 (największy możliwy wymiar)

Pola bitowe

Kilka bloków ma bajt z flagami (packed fields), w którym poszczególne bity znaczą różne rzeczy. Bity numeruje się od najstarszego (7) do najmłodszego (0). Przykład z opisu ekranu logicznego:

F1 = 11110001 │└┬┘│└┬┘ │ │ │ └─ rozmiar palety globalnej: 001 → 2^(1+1) = 4 kolory │ │ └─── paleta posortowana: 0 (nie) │ └───── rozdzielczość kolorów: 111 → 8 bitów └─────── jest paleta globalna: 1 (tak)

Szczegóły każdego pola są na stronach o poszczególnych blokach. Pełny przykładowy plik rozpisany bajt po bajcie jest we wstępie.