· 5 min read

Hur animerade GIF fungerar faktiskt - från Canvas Frames till LZW Compression

GIF-formatet är 39 år och fortfarande överallt. Här är vad som händer mellan att klicka på "Export" och få en fil - ramfångst, färgkvantisering, LZW-komprimering och varför din GIF är 4MB.

Varför GIF fortfarande existerar

Graphics Interchange Format skapades av CompuServe 1987 [CompuServe, 1987]. Det stöder animation, öppenhet och förlustfri komprimering. Den är begränsad till 256 färger per ram. Den har inget ljud. Den producerar stora filer. Vid varje teknisk åtgärd bör den ha ersatts för årtionden sedan.

Och ändå: Discord, Slack, iMessage, Twitter, Reddit och e-post alla stöd GIFs infödda. GIPHY tjänar över 10 miljarder GIF per dag [GIPHY, 2020]. Formatet kvarstår eftersom det fungerar överallt, kräver ingen codec och spelar automatiskt. Inget annat format har denna kombination av universellt stöd och nollfriktionsuppspelning.

Förstå hur GIF fungerar är användbart utöver trivia - det förklarar varför din exporterade GIF är 4MB, varför gradienter ser bandade och vad du kan göra åt det.

Steg 1: Frame Capture

En animerad GIF är en sekvens av bilder (ramar) som visas i ordning med en fördröjning mellan varje. För att skapa en från en duk animation, måste du fånga duken tillstånd med jämna mellanrum.

I en webbläsare betyder det att du läser pixeldata från ett HTML <canvas>-element vid varje bildtid - vanligtvis via canvas.toDataURL() eller ctx.getImageData(). Animeringen är avancerad till måltiden, duken görs, och pixlarna fångas. Nyckelbegränsning: du måste vänta på webbläsarens färgcykel (requestAnimationFrame) innan du läser pixlar, annars fångar du en buffert.

En typisk GIF vid 15 FPS i 3 sekunder kräver 45 ramfångster. Vid 1080 × 1080 upplösning är varje ram cirka 4,7 miljoner pixlar.

Steg 2: Färgkvantisering

GIF stöder högst 256 färger per ram, lagrad i ett färgbord (palett). En typisk dukram har tusentals olika färger. Att minska till 256 utan synlig nedbrytning är den svåraste delen av GIF-kodningen.

Standardmetoden är median cut algoritm [Heckbert, 1982]: sortera alla pixlar genom sin rödaste kanal, dela listan på medianen, upprepa för grön och blå, återkommande dela färgutrymmet i 256 regioner. Varje regions genomsnitt blir en palettpost. Detta är vad gif.js - biblioteket PinePaper använder - implementerar i Web Workers för parallellism [Rubaxa, gif.js].

Färgkvantisering är varför GIF hanterar plattfärgsgrafik bra men kämpar med fotografier och gradienter. En gradient över 1080 pixlar kan använda 500+ olika färger. Komprimera till 256 producerar synlig bandning - diskreta steg där gradienten ska vara smidig.

Vad du kan göra åt det:* Använd färre färger i din design. Platta former, fasta fyllningar och text kvantisera väl. Smidig gradienter och fotografiska texturer gör det inte. Om din GIF har banding, förenkla paletten, inte upplösningen.

Steg 3: LZW Compression

Varje rams pixelindex (referenser i 256-färgpaletten) komprimeras med Lempel-Ziv-Welch (LZW) komprimering [Welch, 1984]. LZW bygger en ordbok av upprepade bytessekvenser eftersom det skannar data. När det stöter på en sekvens som det har sett tidigare, utgår det ordboksindex istället för de råa byte.

Detta innebär att GIF komprimering är mest effektiv när det finns stora områden av upprepad färg - solida bakgrunder, platta former, text på en enhetlig yta. Komplexa texturer med pixel-nivåvariation ger dåliga kompressionsförhållanden eftersom LZW-ordboken finner få upprepade sekvenser.

Praktisk implikation:*** En 1080 × 1080 GIF av vit text på en svart bakgrund kan komprimera till 200KB. Samma resolution GIF av ett komplext fotografi kan vara 8 MB. Filstorleken beror mer på visuell komplexitet än på upplösning eller ramräkning.

Steg 4: Ram bortskaffande och optimering

GIF-ramar kan ange en bortskaffande metod: om du ska rensa duken innan du ritar nästa ram, lämna den tidigare ramen synlig, eller återställa till bakgrund. Smarta GIF-kodare använder ramskillnad - kodar bara pixlarna som ändras mellan ramar, inte hela ramen.

Om din animation har en statisk bakgrund med ett litet rörligt element, kodar en optimerad GIF bakgrunden en gång och uppdaterar bara regionen där elementet flyttas. Detta minskar dramatiskt filstorleken. PinePaper kodare använder gif.js som tillämpar denna optimering automatiskt.

Nummer

För en typisk PinePaper-animation (1080×1080, 15 FPS, 3 sekunder, mörk bakgrund med animerad text):

Komponent Storlek
Råa ramar (45 × 4,7 M pixlar × 3 byte) ~634 MB
Efter kvantisering (256 färger, 1 byte/pixel) ~211 MB
Efter LZW komprimering ~2-4 MB
Med ramskillnad ~1-2 MB

Komprimeringsgraden från rå till slut är cirka 300:1 till 600:1. Det mesta kommer från färgkvantisering (3:1) och LZW (50:1 till 100:1).

När du ska använda GIF vs andra format

Format Bäst för Begränsning
GIF Universellt stöd, auto-play, meddelandeprogram 256 färger, stora filer, inget ljud
WebM (VP9) Bästa kvalitet, minsta filer, webb Begränsat stöd i Safari, iMessage
MP4 (H.264) Sociala medier, videospelare Kräver codec, ingen transparens
APNG Full färg animation med öppenhet Begränsat stöd i äldre webbläsare

GIF är rätt val när du behöver universell kompatibilitet och auto-play. För kvalitet eller filstorlek är WebM eller MP4 bättre.

Prova det

Öppna [PinePaper Studio] (/editor), skapa en design och exportera som GIF. Observera hur filstorleken ändras som du:

  • Öka ramräkningen (mer ramar = större fil, proportionellt)
  • Lägg till gradienter (dålig kvantisering = större fil)
  • Använd solida färger (bra kvantisering = mindre fil)
  • Öka canvas storlek (mer pixlar per ram = större fil)

Varje förändring är en mätning av kompressionsledningen. Du gör inte bara en GIF - du observerar hur informationsteori gäller för din design.

Referenser

  • CompuServe (1987). Grafik Interchange Format Specification, Version 87a.
  • Giphy (2020). Årsredovisning: 10 miljarder dagliga portioner.
  • Heckbert, P. (1982). Color Image Quantization for Frame Buffer Display. Computer Graphics (SIGGRAPH), 16 (3), 297-307.
  • Rubaxa. gif.js - JavaScript GIF-kodare med hjälp av Web Workers. github.com/jnordberg/gif.js.
  • Welch, T.A. (1984). En teknik för högpresterande datakomprimering. * IEEE Computer*, 17(6), 8-19.

PinePapers GIF-export är gratis - inget vattenstämpel, ingen registrering. Öppna [pinepaper.studio/redaktör] (/editor) och exportera din första animation.

Ready to create?

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

Open PinePaper Editor