· 5 min read

Hogyan animált GIF ténylegesen működik - A Canvas keret az LZW tömörítés

A GIF formátum 39 éves, és még mindig mindenhol. Itt van, mi történik a kattintás 'Export' és kap egy fájlt - keret rögzítés, színes számszerűsítés, LZW tömörítés, és miért a GIF 4MB.

Miért GIFs még mindig létezik

A Graphics Interchange Format által létrehozott CompuServe 1987 [CompuServe, 1987]. Támogatja az animációt, az átláthatóságot és a veszteség nélküli tömörítést. Képenként 256 színre korlátozódik. Nincs rajta hang. Nagy fájlokat gyárt. Minden technikai intézkedéssel évtizedekkel ezelőtt kellett volna helyettesíteni.

És mégis: Discord, Slack, iMessage, Twitter, Reddit, és e-mail minden támogatást GIFs natively. A GIPHY több mint 10 milliárd GIF-et szolgál naponta [GIPHY, 2020]. A formátum azért marad fenn, mert mindenhol működik, nem igényel codec-et, és automatikusan játszik. Nincs más formátum az univerzális támogatás és a nulla súrlódási lejátszás kombinációjával.

Megérteni, hogy a GIF-ek hogyan működnek, túl a trivián - ez megmagyarázza, hogy az exportált GIF miért 4MB, miért gradiensek úgy néz ki, banded, és mit tehetünk ellene.

1. lépés: A keret rögzítése

Az animációs GIF képek sorozata (képkockák), amelyek az egyes képek közötti késéssel jelennek meg. Ahhoz, hogy egy vászon animáció, meg kell megragadni a vászon állapotát rendszeres időközönként.

A böngészőben ez a HTML <canvas> elem pixel adatainak olvasását jelenti minden képkockánál - jellemzően canvas.toDataURL() vagy ctx.getImageData() segítségével. Az animáció előre halad a célidőben, a vászon kirajzolva, és a pixelek rögzítve. A kulcs kényszer: meg kell várni a böngésző festékciklus (requestAnimationFrame) olvasása előtt pixel, különben megragad egy állott puffer.

Egy tipikus GIF 15 FPS 3 másodpercen át 45 képkockát igényel. 1080 × 1080 felbontásnál minden képkocka körülbelül 4,7 millió pixel.

Lépés: Színmennyiség

GIF támogatja a maximum 256 szín egy képkocka, tárolt színtábla (paletta). Egy tipikus vászon keret több ezer különböző színek. A GIF kódolás legnehezebb része, hogy látható lebomlás nélkül 256-ra csökken.

A standard megközelítés a * * medial cut algoritmus * * [Heckbert, 1982]: válogatja össze az összes pixelt a legvörösebb csatornával, ossza meg a listát a középértéken, ismételje meg a zöld és kék, rekurzívan osztva színteret 256 régióra. Minden régió átlagából palettás lesz. Ez az, amit gif.js - a könyvtár PinePaper használ - implements in Web Workers for parallelism [Rubaxa, gif.js].

A színes számszerűsítés az, amiért a GIFs-ek jól kezelik a síkszínes grafikát, de a fényképekkel és a gradiensekkel küzdenek. Egy 1080 pixeles gradiens 500 + különböző színt használhat. A 256-ra tömörítés látható kötéseket eredményez - különálló lépéseket, ahol a lejtőnek simának kell lennie.

    • What you can do about it: * * Használjon kevesebb színt a design. Lapos formák, tömör töltetek, és a szöveg jól számszerűsíthető. A sima gradiensek és a fényképészeti textúrák nem. Ha a GIF-ed zörög, a palettát egyszerűsítsd, ne a felbontást.

3. lépés: LZW kompresszió

Minden képkocka pixel indexe (hivatkozások a 256- színes palettához) tömörítve van * * Lemper - Ziv- Welch * * (LZW) tömörítéssel [Welch, 1984]. Az LZW az adatok letapogatása során az ismétlődő byte szekvenciák szótárát építi. Amikor találkozik egy olyan szekvenciával, amit korábban látott, a nyers bájtok helyett a szótár indexet adja ki.

Ez azt jelenti, GIF tömörítés a leghatékonyabb, ha vannak nagy területek ismétlődő szín - szilárd háttér, lapos formák, szöveg egy egységes felületen. Komplex textúrák pixelszintű variációval gyenge tömörítési arányokat eredményeznek, mert az LZW szótár néhány ismétlődő szekvenciát talál.

    • Practical implication: * * Egy 1080 × 1080 GIF fehér szöveg fekete háttérrel összenyomódhat 200KB-ra. Ugyanaz a felbontása egy komplex fénykép GIF lehet 8MB. A fájl mérete jobban függ a vizuális komplexitástól, mint a felbontástól vagy a képkockáktól.

4. lépés: A keret ártalmatlanítása és optimalizálása

GIF képkockák megadhatják a * * ártalmatlanítási módszert * *: a vászon megtisztítása a következő keret rajza előtt, az előző keret látható, vagy a háttér. Smart GIF kódolók * * frame differencing * * - kódolás csak a pixelek, hogy változott a keretek, nem az egész keret.

Ha az animáció egy statikus háttér egy kis mozgó elem, egy optimalizált GIF kódolja a háttér egyszer, és csak frissíti a régióban, ahol az elem mozgott. Ez drámaian csökkenti a fájl méretét. A PinePaper kódolója gif.js-t használ, amely automatikusan alkalmazza ezt az optimalizálást.

A számok

Egy tipikus PinePaper animáció (1080 × 1080, 15 FPS, 3 másodperc, sötét háttér animációs szöveg):

Alkatrész Méret
Nyerskeret (45 × 4.7M pixel × 3 bájt) ~634 MB
A számszerűsítés után (256 szín, 1 bájt / pixel) ~211 MB
LZW tömörítés után ~2-4 MB
A keret eltérítésével ~1-2 MB

A tömörítési arány a nyers és végleges között körülbelül 300: 1-600: 1. A legtöbb ebből származik színes számszerűsítés (3: 1) és LZW (50: 1 to 100: 1).

Mikor használjuk a GIF vs

Formátum A legjobb Korlátozás
GIF Univerzális támogatás, auto-play, üzenetküldő alkalmazások 256 szín, nagy fájlok, nincs hang
WebM (VP9) Legjobb minőségű, legkisebb fájlok, web Korlátozott támogatás Szafariban, iMessage
MP4 (H.264) Közösségi média, videólejátszó Kodek szükséges, nincs átláthatóság
FÜGGELÉK Teljes színanimáció átláthatósággal Korlátozott támogatás régebbi böngészők

GIF a helyes választás, ha kell egyetemes kompatibilitás és auto-play. A minőség vagy a fájl mérete, WebM vagy MP4 jobb.

Próbáld ki

Nyitott [PinePaper Studio] (/editor), hozzon létre egy design, és export mint GIF. Figyelje meg, hogyan változik a fájl mérete:

  • A keret számának növelése (több keret = nagyobb fájl, arányosan)
  • Hozzáadás gradiensek (rossz számszerűsítés = nagyobb fájl)
  • Szilárd színek használata (jó számszerűsítés = kisebb fájl)
  • A vászon méretének növelése (képkockánként több pixel = nagyobb fájl)

Minden változás a kompressziós csővezeték mérése. Nem csak egy GIF-et készítesz, hanem megfigyeled, hogy az információelmélet hogyan alkalmazható a tervezésedre.

Hivatkozások

  • CompuServe (1987). Graphics Interchange Format Specification, Version 87a.
  • GIPHY (2020). GIPHY Éves jelentés: 10 milliárd napi szerva.
  • Heckbert, P. (1982). Color Image Quantitization for Frame Buffer Display. * Computer Graphics (SIGGRAPH) *, 16 (3), 297- 307.
  • Rubaxa. gif.js - JavaScript GIF kódoló webmunkások használatával. github.com / jnordberg / gif.js.
  • Welch, T.A. (1984). A Technique for High- Performance Data Compression. * IEEE Computer *, 17 (6), 8- 19.

PinePaper GIF export ingyenes - nincs vízjel, nincs feljegyzés. Nyissa meg a [pinepaper.studio / szerkesztő] (/editor) és exportálja az első animációt.

Ready to create?

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

Open PinePaper Editor