Nagłówek pliku GIF
Każdy plik GIF zaczyna się od sześciu bajtów: trzech liter sygnatury i trzech znaków wersji. To najprostszy blok formatu i jedyny bez bajtu rozpoznawczego.
Budowa
| Bajty | Długość | Zawartość |
|---|---|---|
| 0-2 | 3 | sygnatura: 47 49 46 = "GIF" |
| 3-5 | 3 | wersja: 38 37 61 = "87a" albo 38 39 61 = "89a" |
W przykładowym pliku (zob. wstęp):
47 49 46 38 39 61 → "GIF89a"
87a czy 89a
GIF89a dodał bloki rozszerzeń (bajt 21) i dwa nowe znaczenia w istniejących polach. Plik bez rozszerzeń jest w praktyce identyczny w obu wersjach.
| Funkcja | 87a | 89a |
|---|---|---|
| obrazy, palety, LZW, przeplot | tak | tak |
| przezroczystość, opóźnienie, sposób usuwania klatki | nie | tak ($F9) |
| komentarze | nie | tak ($FE) |
| tekst graficzny | nie | tak ($01) |
| dane aplikacji, pętla animacji | nie | tak ($FF) |
| flaga sortowania palety, proporcje pikseli | pola zarezerwowane | tak |
Zalecenie specyfikacji: zapisywać "87a", jeśli plik nie używa niczego z 89a, a "89a" w przeciwnym razie. W praktyce prawie wszystkie programy zapisują zawsze "89a", a wszystkie współczesne dekodery czytają obie wersje tak samo.
Rozpoznawanie formatu
Pierwsze bajty pliku (tzw. magiczne liczby) pozwalają rozpoznać format bez patrzenia na rozszerzenie nazwy:
| Format | Pierwsze bajty |
|---|---|
| GIF | 47 49 46 38 ("GIF8") |
| PNG | 89 50 4E 47 0D 0A 1A 0A |
| JPEG | FF D8 FF |
| WebP | 52 49 46 46 ("RIFF"), potem "WEBP" od bajtu 8 |
const isGif = (b) => b[0] === 0x47 && b[1] === 0x49 && b[2] === 0x46 && b[3] === 0x38;
Zaraz po nagłówku zaczyna się opis ekranu logicznego.