GIF Animationen

Wir alle mögen bewegte Bilder. Doch fette Medien-Inhalte kann ich im GATE Projekte jetzt nicht einarbeiten … dafür war das Projekt nicht gedacht.

Aber im kleinen Stil kann man schon ein bisschen was bewegen, daher lautet die Frage heute:

Wie lädt man eigentlich animierte GIF Dateien mit giflib ?


Die giflib ist - woher kenne ich das bloß - eine Low+High-level Bibliothek. Sie bietet primitive Funktionen zum Laden und Speichern einzelner Blöcke an, und hat dann noch ein paar einfache Alleskönner-Funktionen, die einem die Kleinarbeit wieder abnehmen.

Animierte GIFs sind einfach mehrere GIF-Bilder in einer Datei, die noch mit einer Wartelänge verknüpft sind. Und die giflib lädt das alles problemlos in den Speicher.

Auf den freien Speicher kommt es an

Jetzt wäre die Sache recht einfach, wenn mein einfach nur DGifSlurp() aufruft und dann auf alle Bilder über das SavedImages Array in der GifFileType Instanz zugreifen würde.

DOS kann aber nur 64 KB in einem Segment allokieren und nach 9 Segmenten (Bildern) ist dann Schluss.

Es macht also Sinn, den GIF-Datenstrom selbst zu verwalten und die fertigen Bilder gleich auszugeben und nicht zu speichern.

GIFs Stück für Stück lesen

DGifOpen() liest bereits den Header aus dem GIF Stream und gibt uns Infos über die Auflösung des Gesamtbildes. Nun wird per DGifGetRecordType() festgestellt, welcher Block folgt.

  • Das ist entweder ein EXTENSION_RECORD_TYPE den man dann per DGifGetExtension() und DGifExtensionToGCB() ausliest um an Infos wie die transparente Farbe oder die Frame-Delay-Time zu kommen.
  • Oder man bekommt einen IMAGE_DESC_RECORD_TYPE, wo man per DGifGetImageDesc() Infos zum Frame einholt und dann für jede Pixelzeile ein DGifGetLine() ausführt um an die Pixels zu kommen.
  • Der letzte Recordtype wäre dann ein TERMINATE_RECORD_TYPE mit dem die Datei endet.

Das heißt also, man führt das Record-Lesen in einer Schleife aus, kombiniert immer einen EXTENSION_RECORD mit einem IMAGE_DESC_RECORD zu einem Frame und “zeichnet” ihn auf das Ausgabegerät. Dann wartet man die gewünschte Delay-Time ab und setzt so lange fort, bis kein Frame mehr kommt.

Fazit

Die gesamte Prozedur lernt man, wenn man sich die Codes von der Highlevel Funktion DGifSlurp() ansieht, die das gleiche macht und alle Daten in allokierte Speicherblöcke schreibt.

Mit der Eigenentwicklung schafft man nun die Möglichkeiten kleine Animationen auch unter DOS direkt von der Datei ins Video-RAM zu laden. (Die entsprechende Farbraumkonvertierung kommt natürlich auch noch hinzu.)

Ich habe das Beispiel mal als Demo-Tool mit Namen aniplay gespeichert.

Für die Zukunft sehe ich aber ein viel interessanteres Projekt:
Das Erstellen von animierten GIFs z.B. von kürzeren Bildschirmaufnahmen, denn Textfenster ändern sich recht wenig (wenn kein echtes Video läuft), und das kann ein GIF vernünftig einfangen.