· 7 min read

Kung Paano Talagang Gumagana ang mga Animadong GIF — Mula sa mga Frame ng Canvas Tungo sa LZW Compression

Ang GIF formation ay 39 na taong gulang at hanggang sa lahat ng dako. Narito ang nangyayari sa pagitan ng pagpindot sa 'Export' at pagkuha ng file — paghuli ng balangkas, color quanization, LZW compression, at kung bakit ang iyong GIF ay 4MB.

Kung Bakit Umiiral Pa Rin ang mga GIF

Ang Graphics Interchange Format ay nilikha ng Compu Assert noong 1987 [Compu Provity, 1987]. Sinusuportahan nito ang animation, transparency, at ang di - nauubos na compression. Ito ay limitado sa 256 na kulay sa bawat balangkas. Wala itong audio. Gumagawa ito ng malalaking talaksan. Sa bawat teknikal na hakbang, dapat sana'y ilang dekada na itong pinalitan.

Gayunman: Ang Discord, Slack, iMessage, Twitter, Reddit, at email ay pawang sumusuporta sa GIF nang katutubo. Ang GIPHY ay nagsisilbi ng mahigit 10 bilyong GIF bawat araw [GIPHY, 2020]. Ang format ay nagpapatuloy dahil gumagana ito kahit saan, hindi nangangailangan ng codec, at awtomatikong naglalaro. Walang ibang format ang may ganitong kombinasyon ng unibersal na suporta at sero-friction playback.

Ang pag - unawa kung paano gumagana ang GIFs ay kapaki - pakinabang higit pa sa trivia — ipinaliliwanag nito kung bakit ang iyong iniluluwas na GIF ay 4MB, kung bakit ang mga groove ay napaliligiran, at kung ano ang magagawa mo tungkol dito.

Hakbang 1: Frame Capture

Ang isang masiglang GIF ay isang pagkakasunud-sunod ng mga imahe (frames) na itinatanghal ayon sa isang pagkaantala sa pagitan ng bawat isa. Upang makabuo ng isa nito mula sa isang cavas animation, kailangan mong sakupin ang estadong canvas nang regular.

Sa isang browser, ito ay nangangahulugan ng pagbabasa ng pixel data mula sa isang elemento ng HTML <canvas> sa bawat oras ng frame — karaniwang sa pamamagitan ng canvas.toDataURL() o ctx.getImageData(). Ang animasyon ay pinasulong sa pinupuntiryang panahon, ang kanbas ay isinasalin, at ang mga pixel ay hinuhuli. Ang susing pagbabawal: dapat mong hintayin ang siklo ng pintura ng browser (requestAnimationFrame) bago magbasa ng mga pixel, kung hindi ay kumukuha ka ng isang lumang panlaban.

Ang isang tipikal na GIF sa 15 FPS sa loob ng 3 segundo ay nangangailangan ng 45 kuwadrong paghuli. Sa 1080×1080 resolusyon, ang bawat balangkas ay humigit-kumulang 4.7 milyong pixel.

Hakbang 2: Pagiging Makulay

Ang GIF ay sumusuporta sa sukdulang 256 na kulay sa bawat balangkas, na nakaimbak sa isang mesang may kulay (palette). Ang isang karaniwang balangkas na canvas ay may libu - libong iba't ibang kulay. Ang pagpapaliit sa 256 nang hindi nakikita ang pagkasira ang pinakamahirap na bahagi ng GIF anunciation.

Ang pamantayang pamamaraan ay ang median cut algorithm [Heckbert, 1982]: uriin ang lahat ng mga pixel sa pamamagitan ng kanilang pinapulang lagusan, hatiin ang talaan sa median, ulitin para sa berde at asul, muling hatiin ang espasyo ng kulay sa 256 rehiyon. Ang katamtamang pagpasok ng bawat rehiyon ay nagiging isang maliit na bahagi. Ito ang ginagamit ng mga gif.j — ang aklatan na PinePaper — mga kasangkapan sa Web Workers for para sa parallelism [Rubaxa, gif.js].

Ang color quanization ang dahilan kung bakit ang GIFs ay mahusay humawak ng flat-color graphics ngunit nakikipagpunyagi sa mga litrato at quarters. Maaaring gumamit ng 500+ iba't ibang kulay ang isang spiral sa 1080 pixel. Ang pagmamanupaktura sa 256 ay gumagawa ng nakikitang paglalagay ng singsing — mga hakbang ng discrete kung saan ang dalisdis ay dapat na makinis.

Kung ano ang magagawa mo tungkol dito:* Gumamit ng mas kaunting kulay sa iyong disenyo. Ang mga hugis ng flat, solidong mga bolyum, at teksto ay mahusay na nasusukat. Ang mga smooth streets at grapic striks ay hindi. Kung ang iyong GIF ay nagkatali, gawing simple ang paleta, hindi ang resolusyon.

Hakbang 3: Kokontrolin ang LZW

Ang mga pixel indice ng bawat balangkas (references to the 256-color paleta) ay siniksik gamit ang Lempel-Ziv-Welch (LZW) compression [Welch, 1984]. Ang LZW ay gumagawa ng isang diksiyonaryo ng paulit-ulit na byte sequences habang sinusuri nito ang data. Kapag nakasagupa nito ang isang pagkakasunud-sunod na nakita nito bago nito, ito ay naglalabas ng indiseng diksiyonaryo sa halip na mga hilaw na byte.

Ito'y nangangahulugan na ang GIF compression ay pinakamabisa kapag may malalaking bahagi ng paulit - ulit na kulay — solidong mga pinagmulan, patag na mga hugis, teksto sa pare - parehong ibabaw. Ang mga komplikadong straktura na may pixel-level variation ay lumilikha ng hindi magandang mga ratio ng compression dahil ang diksiyonaryong LZW ay nakatagpo ng ilang mga paulit ulit na pagkakasunud-sunod.

Praktikong implikasyon: Ang 1080×1080 GIF ng puting teksto sa isang itim na background ay maaaring umipit sa 200KB. Ang gayunding resolusyon ng GIF ng isang masalimuot na larawan ay maaaring 8MB. Ang sukat ng talaksan ay higit na nakasalalay sa kompleksidad ng paningin kaysa sa resolusyon o pagtatantiya ng bilang.

Hakbang 4: Frame Pagtatapon at Optimisasyon

Ang mga balangkas ng GIF ay maaaring magtakda ng isang disposal na paraan: kung maglilinis ng kanbas bago idrowing ang susunod na balangkas, iwang nakikita ang naunang balangkas, o ibalik sa dating balangkas sa likuran. Ang Smart GIF regulators ay gumagamit ng frame differencing — Ini-record lamang ang mga pixels na nagbago sa pagitan ng mga frame, hindi ang buong balangkas.

Kung ang iyong animation ay may static background na may maliit na gumagalaw na elemento, ang isang optimisadong GIF ay minsang nagrere - update lamang sa rehiyon kung saan kumikilos ang elemento. Lubhang binabawasan nito ang laki ng talaksan. Ang gniver ng PinePaper ay gumagamit ng gif.js na awtomatikong nagkakapit ng optimisasyong ito.

Mga Numero

Para sa karaniwang PinePaper animation (1080×1080, 15 FPS, 3 segundo, madilim na background na may masiglang teksto):

Nakikipagtulungan Laki
Raw frames (45 × 4.7M pixels × 3 byte) ~634 MB
Pagkatapos ng quanisasyon (256 na kulay, 1 byte/pixel) ~211 MB
Pagkatapos ng compression ng LZW ~2-4 MB
Sa pagkakaiba ng balangkas ~1-2 MB

Ang proporsiyon ng compression mula sa hilaw hanggang sa pangwakas ay humigit - kumulang 300:1 hanggang 600:1. Karamihan dito ay nagmula sa color quanization (3:1) at LZW (50:1 hanggang 100:1).

Kailan Gagamitin ang GIF vs Iba Pang mga Formato

Kamag - anak Pinakamabuti para sa Hangganan
GIF Pansansinukob na suporta, auto-play, mga app 256 na kulay, malalaking file, walang audio
WebM (VP9) Pinakamahusay na kalidad, pinakamaliit na talaksan, web Limitadong suporta sa Safari, iMesage
MP4 (H.264) Social media, mga naglalaro ng video Hinihiling ang codec, walang transparency
APNG Kumpletong kulay na may transparensiya Limitadong suporta sa mas matatandang browser

Ang GIF ay ang tamang pagpili kapag kailangan mo ang universal commpatity at auto-play. Para sa kalidad o laki ng talaksan, mas mainam ang WebM o MP4.

Subukin Ito

Ang open PPinePaper Studio, ay lumilikha ng disenyo, at iniluluwas bilang GIF. Pansinin kung paano nagbabago ang laki ng talaksan habang ikaw ay:

  • Dumaraming bilang ng frame (mas marami pang balangkas = mas malaking salansan, ayon sa proporsiyon)
  • Idagdag ang mga quanization (hindi maganda ang quanization = mas malaking talaksan)
  • Gumamit ng solidong mga kulay (mabuting quanisasyon = mas maliit na talaksan)
  • Mas malaki ang canvas (mas marami pang pixels bawat balangkas = mas malaking talaksan)

Ang bawat pagbabago ay isang sukat ng tubong compression. Hindi ka lamang gumagawa ng GIF — pinagmamasdan mo kung paano kumakapit ang teoriya ng impormasyon sa iyong disenyo.

Mga reperensiya

  • Compu Provity (1987). Graphics Interchange Format speciation, Version 87a.
  • GIPHY (20). GIPHY Annual Report: 10 Bilyon Araw-araw ang Naglilingkod.
  • Heckbert, P. (1982). Color Image Quantization for Frame Buffer display. Computer Graphics (SIGRAPH), 16(3), 297-307.
  • Rubaxa. gif.js — JavaScript GIF regulator na gumagamit ng Web Workers. github.com/jnordberg/gif.js.
  • Welch, T.A. (1984). Isang Pamamaraan para sa Mataas-Perpormance Data Compression. IEE Computer, 17(6), 8-19.

Ang PinePaper na pagluluwas ng GIF ay libre — walang watermark, walang signup. Buksan ang pinepaper.studio/editor at iluwas ang iyong unang animation.

Ready to create?

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

Open PinePaper Editor