· 5 min read

Wie animierte GIFs tatsächlich funktionieren - von Canvas Frames bis LZW Compression

Das GIF-Format ist 39 Jahre alt und immer noch überall. Hier ist, was zwischen dem Klicken auf "Export" und dem Erhalten einer Datei passiert - Frame Capture, Farbquantisierung, LZW-Komprimierung und warum Ihr GIF 4MB ist.

Warum GIFs noch existieren

Das Graphics Interchange Format wurde 1987 von CompuServe erstellt [CompuServe, 1987]. Es unterstützt Animation, Transparenz und verlustfreie Kompression. Es ist auf 256 Farben pro Rahmen begrenzt. Es hat kein Audio. Es produziert große Dateien. Bei jeder technischen Maßnahme hätte sie schon vor Jahrzehnten ersetzt werden sollen.

Und doch: Discord, Slack, iMessage, Twitter, Reddit und E-Mail unterstützen alle GIFs nativ. GIPHY bedient über 10 Milliarden GIFs pro Tag [GIPHY, 2020]. Das Format bleibt bestehen, weil es überall funktioniert, keinen Codec benötigt und automatisch abgespielt wird. Kein anderes Format hat diese Kombination aus universeller Unterstützung und Null-Reibungswiedergabe.

Zu verstehen, wie GIFs funktionieren, ist über Trivia hinaus nützlich - es erklärt, warum Ihr exportiertes GIF 4MB ist, warum Gradienten bandig aussehen und was Sie dagegen tun können.

Schritt 1: Frame Capture

Ein animiertes GIF ist eine Sequenz von Bildern (Frames), die in der Reihenfolge mit einer Verzögerung zwischen jedem angezeigt werden. Um eine aus einer Canvas-Animation zu erstellen, müssen Sie den Canvas-Status in regelmäßigen Abständen erfassen.

In einem Browser bedeutet dies, dass Pixeldaten von einem HTML <canvas>-Element zu jeder Bildzeit gelesen werden - typischerweise über canvas.toDataURL() oder ctx.getImageData(). Die Animation wird auf die Zielzeit vorgeschoben, die Canvas wird gerendert und die Pixel werden aufgenommen. Die wichtigste Einschränkung: Sie müssen auf den Farbzyklus des Browsers (requestAnimationFrame) warten, bevor Sie Pixel lesen, sonst erfassen Sie einen veralteten Puffer.

Ein typisches GIF bei 15 FPS für 3 Sekunden erfordert 45 Frame-Captures. Bei einer Auflösung von 1080 × 1080 beträgt jeder Frame etwa 4,7 Millionen Pixel.

Schritt 2: Farbquantifizierung

GIF unterstützt maximal 256 Farben pro Frame, gespeichert in einer Farbtabelle (Palette). Ein typischer Leinwandrahmen hat Tausende von verschiedenen Farben. Die Reduzierung auf 256 ohne sichtbare Degradation ist der schwierigste Teil der GIF-Codierung.

Der Standardansatz ist der Median-Cut-Algorithmus [Heckbert, 1982]: Sortieren Sie alle Pixel nach ihrem rötlichsten Kanal, teilen Sie die Liste im Median auf, wiederholen Sie für Grün und Blau, und teilen Sie den Farbraum rekursiv in 256 Regionen. Der Durchschnitt jeder Region wird zu einem Paletteneintrag. Dies ist es, was gif.js - die Bibliothek, die PinePaper verwendet - in Web Workers for Parallelism implementiert [Rubaxa, gif.js].

Farbquantisierung ist der Grund, warum GIFs mit flachen Grafiken gut umgehen, aber mit Fotos und Steigungen kämpfen. Ein Gradient über 1080 Pixel kann 500+ verschiedene Farben verwenden. Das Komprimieren auf 256 erzeugt sichtbares Banding - diskrete Schritte, bei denen der Gradient glatt sein sollte.

Was Sie dagegen tun können: Verwenden Sie weniger Farben in Ihrem Design. Flache Formen, feste Füllungen und Text quantisieren gut. Glatte Steigungen und fotografische Texturen nicht. Wenn Ihr GIF Banding hat, vereinfachen Sie die Palette, nicht die Auflösung.

Schritt 3: LZW-Kompression

Die Pixelindizes jedes Frames (Referenzen in die 256-Farbpalette) werden mit Lempel-Ziv-Welch (LZW) komprimiert [Welch, 1984]. LZW erstellt ein Wörterbuch von wiederholten Byte-Sequenzen, während es die Daten scannt. Wenn es auf eine Sequenz trifft, die es zuvor gesehen hat, gibt es den Wörterbuchindex anstelle der Rohbytes aus.

Dies bedeutet, dass die GIF-Komprimierung am effektivsten ist, wenn es große Bereiche mit wiederholter Farbe gibt - solide Hintergründe, flache Formen, Text auf einer einheitlichen Oberfläche. Komplexe Texturen mit Variation auf Pixelebene erzeugen schlechte Kompressionsverhältnisse, da das LZW-Wörterbuch nur wenige wiederholte Sequenzen findet.

Praktische Implikationen: Ein 1080 × 1080 GIF weißer Text auf schwarzem Hintergrund kann auf 200 KB komprimiert werden. Die gleiche Auflösung GIF eines komplexen Fotos könnte 8 MB betragen. Die Dateigröße hängt mehr von der visuellen Komplexität als von der Auflösung oder der Bildanzahl ab.

Schritt 4: Frame Disposal und Optimierung

GIF-Frames können eine Entsorgungsmethode angeben: ob Sie die Leinwand vor dem Zeichnen des nächsten Frames löschen, den vorherigen Frame sichtbar lassen oder auf dem Hintergrund. Smarte GIF-Encoder verwenden frame-Differencing - Kodierung nur der Pixel, die zwischen Frames geändert wurden, nicht der gesamte Frame.

Wenn Ihre Animation einen statischen Hintergrund mit einem kleinen beweglichen Element hat, kodiert ein optimiertes GIF den Hintergrund einmal und aktualisiert nur die Region, in der sich das Element bewegt hat. Dies reduziert die Dateigröße drastisch. Der Encoder von PinePaper verwendet gif.js, der diese Optimierung automatisch anwendet.

Die Zahlen

Für eine typische PinePaper Animation (1080×1080, 15 FPS, 3 Sekunden, dunkler Hintergrund mit animiertem Text):

Komponente Größe
Rohe Frames (45 × 4,7 M Pixel × 3 Byte) ~634 MB
Nach Quantisierung (256 Farben, 1 Byte/Pixel) ~211 MB
Nach LZW-Verdichtung ~2-4 MB
Mit Rahmenunterscheidung ~1-2 MB

Das Verdichtungsverhältnis von Roh zu Endverdichtung beträgt ca. 300:1 bis 600:1. Das meiste davon stammt aus der Farbquantisierung (3:1) und LZW (50:1 bis 100:1).

Wann GIF vs andere Formate verwenden

Format Am besten für Begrenzung
GIF Universelle Unterstützung, Auto-Play, Messaging-Apps 256 farben, große dateien, kein audio
WebM (VP9) Beste Qualität, kleinste Dateien, Web Begrenzte Unterstützung in Safari, iMessage
MP4 (H.264) Social Media, Videoplayer Erfordert Codec, keine Transparenz
APNG Vollfarbige Animation mit Transparenz Begrenzte Unterstützung in älteren Browsern

GIF ist die richtige Wahl, wenn Sie universelle Kompatibilität und Auto-Play benötigen. Für Qualität oder Dateigröße sind WebM oder MP4 besser.

Versuchen Sie es

Öffnen Sie PinePaper Studio, erstellen Sie ein Design und exportieren Sie es als GIF. Beobachten Sie, wie sich die Dateigröße ändert, während Sie:

  • Erhöhung der Frame-Anzahl (mehr Frames = größere Datei, proportional)
  • Gradienten hinzufügen (schlechte Quantisierung = größere Datei)
  • Verwenden Sie feste Farben (gute Quantisierung = kleinere Datei)
  • Größere Canvas (mehr Pixel pro Frame = größere Datei)

Jede Änderung ist eine Messung der Kompressionspipeline. Sie machen nicht nur ein GIF - Sie beobachten, wie die Informationstheorie auf Ihr Design angewendet wird.

Referenzen

  • CompuServe (1987). Graphics Interchange Format Specification, Version 87a.
  • GIPHY (2020). GIPHY Jahresbericht: 10 Milliarden täglich serviert.
  • Heckbert, P. (1982). Farbbild Quantisierung für Frame Buffer Display. * Computer Graphics (SIGGRAPH)*, 16(3), 297-307.
  • Rubaxa. gif.js — JavaScript GIF Encoder mit Web Workers. github.com/jnordberg/gif.js.
  • Welch, T.A. (1984). A Technique for High-Performance Data Compression. IEEE Computer, 17(6), 8-19.

Der GIF-Export von PinePaper ist kostenlos - kein Wasserzeichen, keine Anmeldung. Öffnen Sie pinepaper.studio/editor und exportieren Sie Ihre erste Animation.

Ready to create?

Start making animated GIFs, videos, and graphics — free, no signup.

Open PinePaper Editor