GIF Animationen
« | 09 Mar 2025 | »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_TYPEden man dann perDGifGetExtension()undDGifExtensionToGCB()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 perDGifGetImageDesc()Infos zum Frame einholt und dann für jede Pixelzeile einDGifGetLine()ausführt um an die Pixels zu kommen. - Der letzte Recordtype wäre dann ein
TERMINATE_RECORD_TYPEmit 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.