Ausarbeitung
Transcrição
Ausarbeitung
Das Graphics Interchange Format Matthias Kloppenborg 7. Mai 2008 Vorwort Dieser Artikel gibt eine allgemeine Einführung in das GIF. Im ersten Abschnitt wird auf die Geschichte des GIF eingegangen. Die Fähigkeiten von GIF werden kurz angeschnitten und in den nachfolgenden Abschnitten wird auf die Implementierungsdetails eingegangen. Im Speziellen bezieht sich dieses Dokument auf die Spezifikation 89a. Der für die Kompression verwendete LZW-Algorithmus wird ebenfalls anhand eines Beispiels erläutert. Inhaltsverzeichnis 1 Der geschichtliche Hintergrund vom GIF 2 2 Der 2.1 2.2 2.3 2.4 Aufbau einer Datei nach GIF-Spezifikation 89a Der Header . . . . . . . . . . . . . . . . . . . . . . . . . . Die Bildschirmbeschreibung . . . . . . . . . . . . . . . . . Die Farbpaletten . . . . . . . . . . . . . . . . . . . . . . . Die Bildbeschreibung . . . . . . . . . . . . . . . . . . . . . 2.4.1 Das Zeilensprungverfahren im GIF (Abbildung 1) . 2.5 Die Rasterdaten . . . . . . . . . . . . . . . . . . . . . . . 2.6 Der Erweiterungsblock . . . . . . . . . . . . . . . . . . . . 2.6.1 Erweiterung für Grafikkontrolle . . . . . . . . . . . 2.6.2 Erweiterung für Kommentare . . . . . . . . . . . . 2.6.3 Erweiterung für ASCII Text . . . . . . . . . . . . . 2.6.4 Erweiterung für Anwendungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 3 4 5 5 5 7 7 8 8 9 3 Der Lempel-Ziv-Welch-Algorithmus zur Kompression 10 4 Quellen 10 1 1 1 DER GESCHICHTLICHE HINTERGRUND VOM GIF 2 Der geschichtliche Hintergrund vom GIF CompuServe präsentierte im Jahre 1987 das GIF als freie und offene Spezifikation. Nicht nur die gute Komprimierung und die Fähigkeit, das Zeilensprungverfahren anwenden zu können, ließen das GIF zu einem beliebten Format im World Wide Web werden. Auch die Übertragung von Farbbildern war zur damaligen Zeit nicht Standard und mit den Neuerungen in der Spezifikation 89a vervielfältigten sich die Möglichkeiten. Als nun CompuServe das GIF und damit auch die Spezifikation 87a präsentierte, fiel es zunächst niemandem auf, dass der dort zur Komprimierung eingesetzte LZW-Algorithmus lizenzrechtlich bedenklich war. Die anfängliche Euphorie wich bald einer Phase der Verwirrung und Konfrontation. Der in GIF verwendete LZWAlgorithmus verwendete Prozeduren, die sowohl Unisys als auch IBM im Vorfeld patentiert worden waren. Im Dezember des Jahres 2004 gaben Unisys und CompuServe bekannt, dass Entwickler, die weiterhin mit den von Unisys patentierten Technologien, welche im Zusammenhang mit dem GIF-Format stehen, arbeiten wollten, von nun an Lizenzgebühren zu zahlen hatten. Diese Gebühren, die zu Beginn nur für kommerzielle Software zu zahlen waren, wurden alsbald auch auf kostenlose Software ausgeweitet. Dies war ein zu erwartender Schritt von Unisys, da die kommerziellen Hersteller nach Einführung der Gebühren Teile ihrer Software, die der Erstellung von GIF-Dateien dienten, als kostenlose Erweiterungen zur Verfügung stellten. Verwirrung entstand, da im World Wide Web das Gerücht verbreitet wurde, dass sowohl für Programme zum Erstellen als auch für Programme zum Anzeigen von GIF-Dateien Gebühren zu entrichten wären. Dies führte letztlich dazu, das CompuServe die Planung von GIF24 als freie, offene und gebührenfreie Spezifikation unterstützte, welche dann später zu Gunsten der Entwicklung von PNG verwendet werden konnte. Tatsache ist jedoch, dass Programme, welche GIF-Dateien nur auslesen, nicht von der Gebührenpflicht betroffen sind. Trotz der Entwicklung von PNG und JPEG, finden GIF-Dateien noch heute Verwendung im World Wide Web und sind beliebt durch ihre Fähigkeit zur Animation und Transparenz. 2 DER AUFBAU EINER DATEI NACH GIF-SPEZIFIKATION 89A 2 3 Der Aufbau einer Datei nach GIF-Spezifikation 89a Der Aufbau einer GIF-Datei nach Spezifikation 89a lässt sich anhand einer einfachen Grammatik darstellen. < < < < < < < GIF-Datei > := Header < logischer Bildschirm > < Daten* > GIF-Endsymbol logischer Bildschirm> := Bildschirmbschreibung [globale Farbpalette] Daten > := < Grafikblock > | < spezieller Block > Grafikblock > := [Erweiterung zur Grafikkontrolle] < Block zur Darstellung > Block zur Darstellung> := < Palettengrafik > | < Erweiterung zur Darstellung von ASCII Text > Palettengrafik > := Bildbeschreibung [lokale Farbpalette] Rasterdaten spezieller Block > := Erweiterung für Anwendungen | Erweiterung für Kommentare Die mit < und > geklammerten Begriffe sind Nichtterminale. Die mit [ und ] geklammerten Begriffe sind optional. Das * bedeutet, dass dieser Block mehrfach vorkommen kann. Sind Begriffe durch | getrennt, so ist dies als exklusiv oder zu verstehen. Ungeklammerte Begriffe sind Terminale und werden im Folgenden erläutert. 2.1 Der Header Anhand des Headers, welcher grade einmal sechs Byte groß ist, kann man die GIF-Datei als solche erkennen. In den ersten drei Bytes ist die sogenannte Signatur gespeichert, anhand der man erkennen kann, dass die folgenden Daten eine GIF-Datei beschreiben. Die Versionsnummer beschreibt die Spezifikation, anhand derer die Datei erstellt wurde. Es gibt zwei verschiedene Spezifikationen: 87a und 89a. Neuerungen in der Spezifikation 89a sind z.B der Farbwert für Transparenz, die Fähigkeit der Animation und die Möglichkeit zur Darstellung von ASCII-Text. Header gif 89a • 00101111 • 00110001 • 00101110 • 00111000 • 00111001 • 01100001 2.2 Die Bildschirmbeschreibung Die Bildschirmbeschreibung enthält die globalen Parameter für alle enthaltenen Rasterbilder, so zum Beispiel die Dimensionen des logische Bildschirms, Informationen über die zu verwendeten Farbpaletten, die Hintergrundfarbe des logischen Bildschirms und die Farbtiefe. Aus den ersten vier Bytes lassen sich Höhe und Breite des logischen Bildschirms auslesen. Das anschließende Byte muss bitweise interpretiert werden: Ist das erste Bit auf Eins gesetzt so existiert eine globale Farbpalette und diese folgt auf die Bildschirmbeschreibung. Bei einem Wert von Null existiert diese Farbpalette nicht. Implementierungsabhängig können lokale Farbpaletten verwendet werden oder es wird eine Farbpalette aus dem Speicher verwendet. Die folgenden drei Bits zeigen an, wie viele Bits pro Primärfarbe im Originalbild zur Verfügung standen. Zu dem gespeicherten Wert addiert man eins hinzu, um den korrekten Wert zu erhalten. Speichern diese Bits beispielsweise den Dezimalwert drei, so standen im Originalbild vier Bits pro Primärfarbe zur Verfügung um das Bild herzustellen. Das fünfte Bit gibt an, ob die globale Farbpalette sortiert ist. Die Sortierung hängt ab von der Häufigkeit der Verwendung des Farbindexes in den Rasterdaten. Je öfter der Farbindex verwendet wird, 2 DER AUFBAU EINER DATEI NACH GIF-SPEZIFIKATION 89A 4 desto eher findet man den Wert in der Farbpalette, wenn man diese von Null an aufsteigend durchsucht. Die letzten drei Bits zeigen an, wieviele Bits pro Pixel zur Adressierung der Farbindizes verwendet werden. Aus diesem Wert x lässt sich mit folgender Formel die Größe der Farbpalette errechnen. 2(x+1) (1) Das nächste Byte wird als Verweis auf einen Eintrag in der Farbpalette interpretiert und gibt die Hintergrundfarbe des logischen Bildschirms an. Die Bildschirmbeschreibung endet mit einem Byte, anhand dessen Wert y man näherungsweise das Verhältnis von Pixelhöhe zu Pixelbreite im Ursprungsbild errechnen kann. Die Formel für die Berechnung der Näherung: V erhältnis = (y + 15) : 64 (2) Bei einem Wert y von 255 lautet das Ergebnis der Gleichung ˜4,21, das Verhältnis von Pixelbreite zu Pixelhöhe ist also 4:1. Ist der Wert von y mit 1 angegeben, so lautet das Ergebnis 0.25. Das Verhältnis ist damit 1:4. Liest man an der Stelle ein Nullbyte ein, so gibt es keine Informationen zum Verhältnis. Aufbau der Bildschirmbeschreibung • Breite des Bildschirms in Pixeln 2 Bytes • Höhe des Bildschirms in Pixeln 2 Bytes • 1 Byte – Bit für Globale Farbpalette 1 Bit – Bits pro Primärfarbe im Originalbild 3 Bit – Bit für Sortierung der Farbpalette 1 Bit – Bits pro Pixel 3 Bit • Farbindex für Hintergrundfarbe 1 Byte • Verhältnis von Höhe zu Breite eines Pixels 1 Byte 2.3 Die Farbpaletten Die Farben, die in einer GIF-Datei verwendet werden, werden in Farbpaletten organisiert. Es besteht sowohl die Möglichkeit eine globale Farbpaletten zu beschreiben, als auch lokale Farbpaletten für jedes einzelne Rasterbild zu definieren. Eine Farbpalette kann, egal ob lokal oder global, bis zu 256 Farben speichern. Definiert man sowohl globale als auch lokale Farbpaletten, werden die Farbeinträge der lokalen Farbpaletten verwendet. Um eine Farbe aus dem RGB-Farbraum zu beschreiben verwendet man drei Bytes, jeweils eines pro Grundfarbe. Die Indizes der Farbpalette verweisen nun direkt auf einen solchen Dreierblock von Bytes. Um einen hellen Blauton zu erhalten, wie er zum Beispiel bei der Darstellung eines Himmels genutzt werden könnte, speichert man folgende Werte. Der Aufbau der Farbpaletten • Rotwert: 01101000 = 104 • Grünwert: 10101011 = 171 • Blauwert: 11001100 = 204 Diese drei Werte beschreiben eine Farbe in der Farbpalette und lassen sich anschließend über einen Index adressieren. Der Index lässt sich mit nur einem Byte beschreiben, wodurch die Größe der Farbpalette auf 768 Bytes beschränkt ist. 2 DER AUFBAU EINER DATEI NACH GIF-SPEZIFIKATION 89A 2.4 5 Die Bildbeschreibung Die Bildbeschreibung enthält Informationen zum einzelnen Rasterbild. GIF-Dateien können mehrere einzelne Rasterbilder enthalten, die sich zu einem Gesamtbild oder einer Animation verknüpfen lassen. Jedes Rasterbild kann zur Darstellung auf eine eigene lokale Farbpalette zugreifen, oder die globale Farbpalette verwenden. Das erste Byte der Bildschirmbeschreibung enthält ein Komma, das als Trennsymbol für die einzelnen Rasterbilder dient. Die folgenden vier Bytes geben die Koordinaten an, an denen mit der Darstellung des Rasterbildes begonnen wird. Dabei bezeichnen je zwei Bytes den linken, sowie den oberen Abstand zum Rand des in der Bildschirmbeschreibung definierten logischen Bildschirms. Die Breite, sowie die Höhe des Rasterbildes, werden ebenfalls mit je zwei Bytes angegeben. Das letzte Byte der Bildbeschreibung ist wie folgt aufgeteilt. Das erste Bit zeigt an, ob für das Rasterbild eine eigene lokale Farbpalette definiert ist, ob also nach den Bytes der Bildbeschreibung eine Farbpalette zu erwarten ist. Der Aufbau der Farbpaletten wurde im vorherigen Abschnitt bereits beschrieben. Das zweite Bit zeigt an, wie die Rasterdaten zu interpretieren sind. Ist dieses Bit gesetzt, so sind die Rasterdaten im Zeilensprungverfahren gespeichert. Ist dies nicht der Fall, so können die Rasterdaten sequentiell ausgelesen und dargestellt werden. Das dritte Bit gibt an, ob die lokale Farbpalette sortiert ist. Die folgenden zwei Bits sind laut Spezifikation reserviert und müssen mit Null belegt werden. Die letzten drei Bits geben, genau wie zuvor in der Bildschirmbeschreibung erläutert, an, wieviele Bits pro Pixel zur Adressierung der Farbindizes verwendet werden. Außerdem lässt sich mit der Formel 1, wenn vorhanden, die Größe der lokalen Farbpalette errechnen. Der Aufbau der Bildschirmbeschreibung • Komma als Trennzeichen 00101100 • Abstand, in Pixeln, zum linken Rand des logischen Bildschirms 2 Bytes • Abstand, in Pixeln, zum oberen Rand des logischen Bildschirms 2 Bytes • Breite des Bildes 2 Bytes • Höhe des Bildes 2 Bytes • 1 Byte – Bit für lokale Farbpalette 1 Bit – Bit für Zeilensprungverfahren 1 Bit – Bit für Sortierung 1 Bit – Reserviert mit Null 2 Bits – Bits pro Pixel 3 Bit 2.4.1 Das Zeilensprungverfahren im GIF (Abbildung 1) Bei dieser speziellen Anwendung des Verfahrens wird zunächste nur jede achte, dann jede vierte, anschließend jede zweite Zeile und letztendlich die verbliebenen Zeilen in den Rasterdaten gespeichert. Beim Auslesen werden diese dann jeweils in acht-, vier-, zwei- und einfacher Höhe dargestellt. Dies ermöglicht einen schnellen Bildaufbau, der Betrachter erhält somit zu Beginn eine grobe Übersicht des Bildes, deren Auflösung sich stets verdoppelt, bis das Rasterbild vollends aufgebaut ist. 2.5 Die Rasterdaten Nachdem nun die Rahmendaten für das Rasterbild festgelegt sind, startet die Beschreibung der eigentlichen Bilddaten. Zu Beginn der Rasterdaten steht ein Byte, das die Anzahl an Bits pro Codewort ausgibt. Arbeitet man mit nur 17 Farben, so würde dieses Byte mit 00000101 initialisiert, da fünf Bits zur Darstellung benötigt 2 DER AUFBAU EINER DATEI NACH GIF-SPEZIFIKATION 89A 6 Abbildung 1: Das Zeilensprungverfahren im GIF würden, bei 70 Farben wäre der Wert also 00000111. Das nächste Byte beschreibt, wie viele Bytes in dem nun folgenden Datenblock übertragen werden. An diesem Punkt müsste man nun zeilenweise, von oben beginnend, für jedes Pixel einen Verweis auf eine Farbe aus der Farbpalette speichern. Da dies jedoch zu einer recht großen GIF-Datei führen würde, werden die Rasterdaten laut Spezifikation mit dem Lempel-Ziv-WelchAlgorithmus komprimiert. Dieser Algorithmus dient der Mustererkennung, so dass man eben nicht für jedes einzelne Pixel ein Byte übertragen muss. Für die erkannten Muster generiert der Lempel-Ziv-Welch-Kodierer eine Codetabelle. Reicht die Anzahl an Bits, die zur Übertragung genutzt werden dürfen, nicht mehr aus, so wird einfach ein weiteres Bit hinzugenommen. Dies lässt sich, wie später erläutert wird, leicht in den Dekodierungsvorgang einbauen. Die unkomprimierten Rasterdaten werden auf die so erzeugte Codetabelle abgebildet, und die erzeugte Folge von Codewörtern ersetzt die unkomprimierten Rasterdaten im GIF. Das Besondere am Lempel-Ziv-Welch-Algorithmus ist, dass die Codetabelle nicht Teil der GIF-Datei ist, sondern vom Decoder aus den komprimierten Rasterdaten erstellt werden kann. Die Anzahl an Bits, die für einen Verweis in diese Codetabelle zu Beginn benötigt werden, kann, wie bereits erwähnt, aus dem ersten Byte der Rasterdaten ausgelesen werden. Die komprimierten Rasterdaten, welche ja nun bitweise vorliegen, werden zu Byteketten verbunden und können dann als Datenblock gespeichert werden. Nachdem nun klar ist, wie groß ein Codewort ist und wie viele Bytes sich in einem Datenblock befinden, können die LZW-komprimierten Datenbytes übertragen werden. Am Ende der Rasterdaten steht als Endzeichen ein Nullbyte. Der Aufbau der Rasterdaten – Die Anzahl an Bits pro Codewort zu Beginn sind abhängig von der Größe der zugeordneten Farbpalette • Anzahl an Bits pro Codewort 1 Byte • Anzahl an Bytes im folgenden Datenblock 1 Byte • Datenblock siehe eine Zeile höher – Ist ein Datenblock verarbeitet, so gibt es zwei Möglichkeiten: 0. Es folgt erneut ein Datenblock, dem natürlich wieder ein Byte zur Beschreibung der Länge des Datenblocks voransteht. 1. Endzeichen für Rasterdaten 00000000 2 DER AUFBAU EINER DATEI NACH GIF-SPEZIFIKATION 89A 2.6 7 Der Erweiterungsblock Die Unterschiede zwischen der Spezifikation 87a und 89a sind nicht gravierend. Es finden sich jedoch in der Spezifikation 89a konkrete Implementierungen des in der Spezifikation 87a vorgestellten Erweiterungsblockes. Implementierte Erweiterungen sind: • Erweiterung für Grafikkontrolle (vor Bildbeschreibung) • Erweiterung für Kommentare • Erweiterung für ASCII-Text • Erweiterung für Anwendungen 2.6.1 Erweiterung für Grafikkontrolle Der Erweiterungsblock für die Grafikkontrolle ermöglicht zum Beispiel das Erstellen von Animationen. Das erste Byte enthält, wie bei jeder Erweiterung, die Bits zur Darstellung eines Ausrufezeichens. Um die Erweiterung als Grafikkontrolle zu identifizieren, enthält das nächste Byte den Dezimalwert 249. Das dritte Byte beschreibt die Anzahl an Bytes bis zum Endzeichen. Das folgende Byte wird bitweise betrachtet: Laut Spezifikation sind die ersten drei Bits reserviert und standardmäßig mit Null zu belegen. Die folgenden drei Bits zeigen an, wie mit dem folgenden Rasterbild, beziehungsweise mit dem folgenden ASCII-Text Erweiterungsblock, zu verfahren ist, nachdem die Anzeige stattgefunden hat. Die vordefinierten Werte und ihre Bedeutung werden im Folgenden dargestellt. Nachdem der folgende Block ausgelesen und angezeigt wurde, 0. muss der Decoder nicht reagieren. 1. wird die Anzeige belassen wie sie ist. 2. werden die Pixel des logischen Bildschirms, die zur Anzeige benutzt wurden, wieder auf die Hintergrundfarbe gesetzt. 3. werden die Pixel des logischen Bildschirms, die zur Anzeige benutzt wurden, auf den Wert vor der Anzeige des Blocks gesetzt. Die übrigen Belegungen der drei Bits sind nicht definiert. Das folgende Bit zeigt an, ob während der Anzeige des Bildes eine Eingabe durch den Nutzer erwartet wird. Wie diese Eingabe auszusehen hat, ist abhängig von der Implementierung der Anwendungsprogramme, die mit der GIF-Datei arbeiten wollen. Ist dieses Bit gesetzt, so wartet das Programm bis zum Ablauf der Verzögerungszeit auf Eingaben vom Benutzer und fährt danach fort mit der Verarbeitung weiterer Datenblöcke der GIF-Datei. Es wird empfohlen, dass wenn dieses Bit gesetzt ist, auch eine Verzögerungszeit angegeben wird. Das letzte Bit gibt an, ob im Grafikkontrollblock der Index für die Transparenz gesetzt ist. Im fünften und sechsten Byte, ist der Wert für die Verzögerungszeit gespeichert. Der enthaltene Wert beschreibt die Verzögerungszeit in Hundertstel einer Sekunde. Ist das Bit für Eingaben durch den Benutzer nicht gesetzt, so wird für die Dauer der Verzögerunszeit gewartet, bevor mit der Verarbeitung der folgenden Blöcke begonnen wird. Das vorletzte Byte der Erweiterung zur Grafikkontrolle gibt den Index des transparenten Farbwertes an. Der Abschluss des Erweiterungsblockes ist am letzten Byte zu erkennen, welches den Wert Null speichert. Der Aufbau der Erweiterung zur Grafikkontrolle • Allgemeines Startsymbol für Erweiterungen 00100001 • Symbol zur Identifizierung als Erweiterung zur Grafikkontrolle 11111001 2 DER AUFBAU EINER DATEI NACH GIF-SPEZIFIKATION 89A 8 • Anzahl an Bytes bis zum Endzeichen 00000100 • 1 Byte – Reserviert mit Null 3 Bits – Verfahren nach Anzeige 3 Bits – Nutzereingaben 1 Bit – Transparenz-Bit1 Bit • Verzögerungszeit 2 Bytes • Index für die tranparente Farbe 1 Byte • Endsymbol 00000000 2.6.2 Erweiterung für Kommentare In dem Erweiterungsblock für Kommentare lassen sich Metainformationen zur GIF-Datei abspeichern, wie zum Beispiel eine Beschreibung des Inhaltes oder den Namen des Urhebers. Die Erweiterung beginnt mit dem Startsymbol, zur Identifizierung dient wieder das zweite Bit, das den dezimalen Wert 254 speichert. Anschließend können beliebig viele Datenblöcke folgen, denen ein Byte voransteht, das die Anzahl an Bytes im Datenblock angibt. Der Aufbau der Erweiterung für Kommentare • Allgemeines Startsymbol für Erweiterungen 00100001 • Symbol zur Identifizierung als Erweiterung für Kommentare 11111110 • Anzahl an Bytes im folgenden Datenblock 1 Byte • Datenblock siehe eine Zeile höher • Endsymbol 00000000 2.6.3 Erweiterung für ASCII Text Die Darstellung von Text wird durch diese Erweiterung extrem vereinfacht. Da eine solche Erweiterung in der Spezifikation 87a nicht angedacht war, müssen viele Parameter in diesen Block integriert werden. Das Startsymbol ist wie bei jeder Erweiterung der dezimale Wert 33. Das identifizierende Byte speichert den Dezimalwert 1. Das folgende Byte gibt die Anzahl an Bytes an, die zur Parametrisierung der eigentlichen ASCII-Daten dienen. Dieser Wert ist fest angegeben mit 12 Bytes. Die nächsten Bytes beschreiben die Maße des Gitters, in dem der Text dargestellt wird, linker und rechter Abstand zum Rand des logischen Bildschirms (je zwei Bytes), sowie Breite und Höhe des Gitters in Pixeln (je zwei Bytes). Um nun herausfinden zu können, wieviel Text gespeichert werden kann, benötigt man noch Breite und Höhe der Buchstaben (je 1 Byte). Zur Verwendung des Erweiterungsblocks für Text benötigt man eine globale Farbpalette, denn die folgenden zwei Bytes beschreiben Text- und Hintergrundfarbe und enthalten Verweise auf Einträge in die globale Farbpalette. Nachdem nun alle Parameter angegeben sind, folgen die Datenblöcke mit den eigentlichen ASCII-Kodierungen, denen jeweils ein Byte vorangeht, welches die Länge des Datenblocks angibt. Beendet wird auch diese Erweiterung mit einem Nullbyte. 2 DER AUFBAU EINER DATEI NACH GIF-SPEZIFIKATION 89A 9 Der Aufbau der Erweiterung für ASCII-Text • Allgemeines Startsymbol für Erweiterungen 00100001 • Symbol zur Identifizierung als Erweiterung zur Darstellung von ASCII-Text 00000001 • Anzahl an Bytes der zur Darstellung benötigten Parameter 00001100 • Linker Startpunkt des Gitters, in dem der Text dargestellt wird 2 Bytes • Oberer Startpunkt des Gitters, in dem der Text dargestellt wird 2 Bytes • Breite des Gitters, in dem der Text dargestellt wird 2 Bytes • Höhe des Giters, in dem der Text dargestellt wird 2 Bytes • Breite eines Buchstabens 1 Byte • Höhe eines Buchstabens 1 Byte • Textfarbe 1 Byte • Hintergrundfarbe 1 Byte • Anzahl an Bytes im folgenden Datenblock 1 Byte • Datenblock siehe eine Zeile höher • Endsymbol 00000000 2.6.4 Erweiterung für Anwendungen Die Erweiterungen für Anwendungen dienen zum Beispiel der Darstellung von Endlosschleifen, wie sie oft im Internet zu finden sind. Das erste Byte beschreibt das allgemeine Startymbol für Erweiterungen. Durch den Wert des folgenden Bytes, Dezimalwert 255, ist die Erweiterung für Anwendungen zu erkennen. Die nächsten acht Bytes speichern ASCII-codierte Buchstaben, die sich zur Ausgabe in den Programmen verwenden lassen. Anhand eines Algorithmus können die Anwendungen einen 24-stelligen Binärschlüssel generieren, anhand dessen sich das Programm authentifizieren lässt. Dieser wird in die folgenden drei Bits geschrieben. Es folgen die Blöcke mit den eigentlichen Anwendungsdaten, denen jeweils ein Byte vorangeht, das die Länge des Datenblocks beschreibt. Letztendlich folgt das Nullbyte. Aufbau der Erweiterung für Anwendungen • Allgemeines Startsymbol für Erweiterungen 00100001 • Symbol zur Identifizierung als Erweiterungsblock für Anwendungen 11111111 • Anzahl an Bytes der für die Anwendung benötigten Parameter 00001011 • Bytes zur Identifizierung der Anwendung 8 Bytes • Bytes zur Authentifikation der Anwendung 3 Bytes • Anzahl an Bytes im folgenden Datenblock 1 Byte • Datenblock siehe eine Zeile höher • Endsymbol 00000000 3 DER LEMPEL-ZIV-WELCH-ALGORITHMUS ZUR KOMPRESSION 3 10 Der Lempel-Ziv-Welch-Algorithmus zur Kompression Der LZW-Algorithmus wurde 1984 von Terry A. Welch in der Arbeit A technique for high-performance ” data compression“vorgestellt. Ein Nachteil des Algorithmus ist, das die Symbole immer so groß sind wie der Tabellenindex, das bedeutet, dass uncodierte Symbole mehr Bits benötigen als ursprünglich. Der Algorithmus war einfach und gut dokumentiert und wurde zu einer berühmten Technik um Daten zu komprimieren. So wird LZW nicht nur im GIF, sondern auch in der TIFF-Spezifikation erwähnt, sowie in verschiedenen Komprimierungsprogrammen. Die Funktionsweise des Algorithmus, wie er bei der Erstellung von GIF-Dateien benutzt wird, wird im Folgenden dargestellt. Es wird angenommen, es existiert eine Farbpalette, deren enthaltene Farben mit den Indizes Null und Eins angesprochen werden können. Die Codetabelle wird zu Beginn mit den Werten für die Indizes gefüllt. Zusätzlich erstellt man zwei neue Einträge. Zum Einen einen Code, mit dem die Codetabelle gelöscht werden kann, zum Anderen einen Code, der das Ende der LZW-Daten bedeutet. Diese Codetabelle füllt man nun weiter mit Mustern, die man beim Einlesen der Farbwerte für ein Rasterbild erhält. Dazu liest man die Rasterdaten ein und versucht die gelesenen Werte durch Zeichen in der Codetabelle zu ersetzen. Findet man ein Muster aus dem Eingabestrom in der Symboltabelle, so schreibt man den zugehörigen Code in die komprimierten Daten, und erstellt einen neuen Eintrag in der Codetabelle für dieses Muster, inklusive dem nachfolgenden Zeichen. Ein Beispiel: Erkannt Eingabe 10000101 1 0000101 0 000101 00 0101 0 101 10 1 1 Geschrieben 1 0 <5> 0 <4> 1 Neues Codewort 10 <4> 00 <5> 000<6> 01<7> 101<8> – Wie zu erkennen ist, lassen sich somit mehrere Zeichen mit einer Anzahl an Bits beschreiben, die man für gewöhnlich für nur ein Zeichen verwendet hätte. Den komprimierten Datenstrom zu dekomprimieren erweist sich als schwierig. Schaut man sich Beispiele zur Dekompression im World Wide Web an, so werden diese entweder anhand von unkomprimierten oder anhand von ausgesuchten Daten dargestellt. Nimmt man jedoch ein eigenes einfaches Beispiel, so führt dies zu Problemen, wie in der folgenden Tabelle zu erkennen ist. Eingabe 10< 5 >0< 4 >1 0< 5 >0< 4 >1 < 5 >0< 4 >1 Erster Buchstabe 1 0 ? Geschrieben 1 0 ? Neues Codewort 10 < 4 > ? Der Dekomprimierungsvorgang bricht an dieser Stelle ohne Erfolg ab, da kein geeignetes Zeichen in der Codetabelle gefunden werden kann. 4 Quellen Alle Informationen stammen von folgende Websites und wurden frei vom Englischen ins Deutsche übersetzt. • http://www.cs.duke.edu/courses/spring03/cps296.5/papers/welch 1984 technique for.pdf • http://www.gnu.org/philosophy/gif.html • http://progfree.org/Patents/Gif/origCompuServe.html 4 QUELLEN • http://www.w3.org/Graphics/GIF/spec-gif89a.txt • http://www.w3.org/Graphics/GIF/spec-gif87.txt 11