Autorka: Santana

Artykuł o tym, jak skompresowane są dane obrazka w formacie GIF.

GIF – kompresja bezstratna

GIF – Graphics Interchange Format (format wymiany grafiki) opracowany przez CompuServe. Pierwsza wersja tego formatu została opublikowana w 1987 roku pod nazwą GIF87a – nie dawała ona jednak możliwości tworzenia animacji. Dopiero wypuszczona dwa lata później wersja GIF89a została wyposażona w taką możliwość.

W środku pliku GIF89a znajduje się nagłówek, który określa ogólne parametry pliku (wersję GIF-a na początku). Potem umieszczone są bloki kontrolne, bloki obrazka i bloki dodatkowe. Plik może zawierać kilka obrazków, z których każdy ma własny blok kontrolny, określający czas wyświetlania tego obrazka i co ma się stać po jego wyświetleniu. Blok obrazka składa się z trzech części: pierwsza opisuje obrazek, druga definiuje paletę obrazka (o ile jest ona różna od palety ogólnej) a trzecia zawiera skompresowane dane obrazka. Zawartość bloków dodatkowych to: nie wyświetlane komentarze, tekst i inne informacje.

Kompresji GIF-ów dokonuje się przy zastosowaniu schematu LZW (Lempel-Ziv-Welch). Polega to na eliminowaniu powtarzających się ciągów danych. Wyjaśnię to na przykładzie. W definicji palety zawarte są dane o tym, ile kolorów jest wykorzystywanych przez obrazek. Jeśli jest ich np. 256, to każdy z tych kolorów otrzymuje swój numer od 1 do 256 – to są numery indeksu palety obrazka. Numerowanie tych kolorków (przez program) to indeksowanie palety.

GIF może oczywiście wykorzystywać mniej barw, niż 256 (ale nie więcej). Na poniższych przykładach widać obrazek i wykorzystywaną przez niego paletę kolorów.

Jest ich (o ile dobrze policzyłam) 58. Dla pełnej jasności dodam, że efekt wtopienia kota w tlo strony uzyskałam tym razem przez zastosowanie w tle obrazka tego samego koloru, który jest tłem dla tekstu artykułu – nie ma tu przezroczystości.

Przypuśćmy, że blok obrazka zawiera następujący ciąg numerów indeksu palety:

1 1 1 2 3 2 1 2 3 19 19 1 1 1 19 19 2 3 2 1 19 19 1 1 1

Najpierw zaznaczymy powtarzające się ciągi trzech lub więcej numerów:

1 1 1 2 3 2 1 2 3 19 19 1 1 1 19 19 2 3 2 1 19 19 1 1 1

Następnie zastępujemy powtórzone ciągi wskaźnikami, które odsyłają do wcześniejszego wystąpienia ciągu. Otrzymujemy zapis:

1 1 1 2 3 2 [3, 3] 19 19 [1, 3] 19 19 [4, 4] [10, 5]

Wskaźnik [3, 3] odsyła do ciągu zaczynającego się od trzeciego numeru [1] i mającego łączną długość 3 [1 2 3].

Taki zapis pozwala odtworzyć oryginalny ciąg danych poprzez zastąpienie wskaźnika numerami, do których on odsyła – uzyskujemy w ten sposób dekompresję pliku i żadne dane nie ulegają zagubieniu. Dlatego ta metoda kompresji nazywana jest ilościową, czyli bezstratną.

Pozdrawiam,
Santana