PicScrub logoPicScrub
Wróć do formatów

Format GIF

Graphics Interchange Format

Struktura blokowa

GIF to jeden z tych formatów, które przeżyły swoją epokę o całe dekady. Powstał w CompuServe w 1987 roku i wciąż jest wszędzie, głównie dzięki obsłudze animacji.

Format opiera się na strukturze blokowej, która na tle dzisiejszych formatów jest wręcz orzeźwiająco prosta. Nagłówek, kilka deskryptorów, tablica kolorów, dane obrazu i jednobajtowy znacznik końca, który mówi „to już koniec”.

Struktura pliku GIF

Header
LSD
GCT
Extensions
Image Data
Trailer
Header
6 B
GIF87a albo GIF89a
LSD
7 B
Logical Screen Descriptor
GCT
768 B
Globalna tablica kolorów (opcjonalna)
Extensions
100 B
Bloki rozszerzeń (metadane)
Image Data
Zmienna długość
Deskryptor obrazu + dane LZW
Trailer
1 B
Znacznik końca 0x3B

Nagłówek GIF

Sygnatura GIF
Wersja (89a)
Szerokość (640)
Wysokość (480)
Pola upakowane
Indeks tła
Proporcje piksela
OffsetHexASCII
0000
4749463839618002E001F70000
GIF89a.......

Różnice między wersjami

GIF87a

Pierwotna specyfikacja. Bez bloków rozszerzeń.

GIF89a

Dodaje rozszerzenia, animację i przezroczystość.

Bloki rozszerzeń

GIF89a (wersja z 1989 roku) wprowadził bloki rozszerzeń i to dzięki nim GIF dostał animację. Wszystkie bloki rozszerzeń zaczynają się od 0x21, po którym idzie bajt typu, więc łatwo je wypatrzyć, przeglądając plik. Niektóre chcemy zachować (czasy animacji), inne usunąć (komentarze).

Graphic Control Extension (0xF9)

Steruje czasem trwania klatek, przezroczystością i sposobem usuwania klatki. Poprzedza każdy deskryptor obrazu w animowanych GIF-ach. Zawsze zachowywany.

21 F9 04 [disposal] [delay] [transparent] 00

Comment Extension (0xFE)

Zwykłe komentarze tekstowe. Mogą zawierać dowolne informacje: od autora i daty utworzenia po nazwę programu czy prywatne notatki. Usuwane przez PicScrub.

21 FE [size] [comment data...] 00

Application Extension (0xFF)

Dane specyficzne dla aplikacji. Najważniejsze: NETSCAPE2.0, odpowiadające za zapętlanie animacji. Mogą też zawierać metadane XMP.

21 FF 0B [app identifier] [auth code] [data...] 00

Plain Text Extension (0x01)

Używane rzadko. Rysuje tekst przy użyciu tablicy kolorów GIF-a. Dzisiejsze oprogramowanie zwykle je ignoruje.

Rozszerzenia aplikacji

NETSCAPE2.0:pętla animacji

Określa, ile razy animowany GIF ma się powtórzyć. Wartość 0 oznacza pętlę bez końca.

Początek rozszerzenia
Rozmiar bloku (11)
NETSCAPE2.0
Rozmiar podbloku
ID podbloku
Liczba powtórzeń
Znacznik końca
OffsetHexASCII
0000
21FF0B4E45545343415045322E300301000000
!..NETSCAPE2.0.....

PicScrub zachowuje NETSCAPE2.0, żeby animacja zachowywała się tak samo.

XMP Data:Extensible Metadata Platform

Identyfikator aplikacji: XMP DataXMP. Zawiera pełne metadane XMP/RDF w formacie XML.

PicScrub usuwa rozszerzenia aplikacji z danymi XMP.

Zachowanie animacji

Najtrudniejsze w GIF-ie jest odróżnienie danych animacji (które musimy zachować) od metadanych (które chcemy usunąć). Jedne i drugie siedzą w blokach rozszerzeń, więc nie możemy po prostu wyciąć wszystkich rozszerzeń.

Zachowywane dla animacji

  • • Liczba powtórzeń NETSCAPE2.0
  • • Bloki Graphic Control Extension
  • • Czasy trwania klatek
  • • Metody usuwania klatki
  • • Indeksy przezroczystości
  • • Lokalne tablice kolorów

Usuwane

  • • Rozszerzenia z komentarzami
  • • Bloki aplikacji z danymi XMP
  • • Nieznane bloki aplikacji
  • • Rozszerzenia Plain Text

Jak PicScrub przetwarza pliki GIF

1

Sprawdzenie nagłówka

Weryfikacja sygnatury GIF87a albo GIF89a

2

Skopiowanie danych nagłówka

Zachowanie LSD i globalnej tablicy kolorów bez zmian

3

Odfiltrowanie rozszerzeń

Zachowanie NETSCAPE2.0 i Graphic Control, usunięcie komentarzy i XMP

4

Zachowanie danych obrazu

Skopiowanie wszystkich deskryptorów obrazu, lokalnych tablic kolorów i danych LZW bez zmian

5

Zapis znacznika końca

Zakończenie pliku bajtem 0x3B

Kompresja LZW

Krótka uwaga o danych obrazu w GIF-ie: używają kompresji LZW, która aż do 2004 roku była opatentowana (co w latach 90. wywołało sporo zamieszania). PicScrub w ogóle nie rusza skompresowanych danych. Kopiujemy je bajt w bajt, więc nie ma żadnej straty jakości.

Dlaczego to ważne

Zachowując oryginalne dane LZW, PicScrub gwarantuje, że:

  • • nie ma straty jakości (obraz zachowany co do bitu)
  • • przetwarzanie jest szybkie (bez cyklu dekodowania i kodowania)
  • • dane obrazu mają dokładnie ten sam rozmiar

Metadane w GIF-ie: ograniczenia

Dobra wiadomość jest taka, że GIF powstał przed standardem EXIF, więc nie ma tu współrzędnych GPS ani danych aparatu, o które trzeba się martwić. Kwestie metadanych są znacznie bardziej przyziemne.

Co może wyciec

W porównaniu z JPEG problemy GIF-a z prywatnością są niewielkie:

  • • rozszerzenia z komentarzami (czasem z notatkami autora)
  • • metadane XMP (rzadko, ale się zdarzają)
  • • nazwa programu w blokach aplikacji