· 6 min read

Bagaimana Animasi Animasi Animasi GIF Pekerjaan Sebenarnya — Dari Bingkai Kanvas hingga Pemampatan LZW

Format GIF adalah 39 tahun dan masih di mana-mana. Inilah yang terjadi antara mengklik 'Ekspor' dan mendapatkan berkas - penangkapan bingkai, kuantisasi warna, kompresi LZW, dan mengapa GIF Anda adalah 4MB.

Mengapa GIF Masih Ada

Format Interchange Grafika dibuat oleh CompuServe pada tahun 1987 [CompuServe, 1987]. Ini mendukung animasi, transparansi, dan kompresi tanpa kehilangan. Ini terbatas pada 256 warna per bingkai. Ini tidak memiliki audio. Ini menghasilkan file besar. Dengan setiap ukuran teknis, seharusnya sudah diganti beberapa dekade yang lalu.

Dan lagi: Discord, Slack, iMessage, Twitter, Reddit, dan email semua mendukung GIF asli. GIPHY melayani lebih dari 10 miliar GIF per hari [GIPHY, 2020]. Formatnya berlanjut karena bekerja di mana-mana, tidak memerlukan kodeks, dan bermain secara otomatis. Tak ada format lain yang memiliki kombinasi dukungan universal dan pemutaran friksi nol ini.

Memahami bagaimana kerja GIF berguna di luar trivia — ini menjelaskan mengapa GIF yang diekspor Anda adalah 4MB, mengapa gradien terlihat band, dan apa yang dapat Anda lakukan tentang hal itu.

Langkah 1: Tangkap Bingkai

UPG0X animasi adalah urutan gambar (frames) yang ditampilkan dalam rangka dengan jeda antara masing-masing. Untuk membuat satu dari animasi kanvas, Anda perlu menangkap keadaan kanvas pada interval biasa.

Dalam sebuah peramban, ini berarti membaca data piksel dari elemen HTML <canvas> pada setiap frame time — biasanya melalui canvas.toDataURL() atau ctx.getImageData(). Animasi ini dimajukan ke waktu target, kanvas dirender, dan piksel ditangkap. Kekangan kunci: anda harus menunggu siklus cat peramban (requestAnimationFrame) sebelum membaca piksel, jika tidak anda menangkap penyangga basi.

A GIF khas pada 15 FPS selama 3 detik membutuhkan 45 penangkapan frame. APBN Pada resolusi 1080×1080, setiap frame sekitar 4,7 juta piksel.

Tahapan 2: Kuantisasi Warna

Wahana GIF mendukung maksimum 256 warna per bingkai, disimpan dalam tabel warna (palette). Sebuah bingkai kanvas yang khas memiliki ribuan warna yang berbeda. Ukraina Reducing ke 256 tanpa degradasi terlihat merupakan bagian tersulit dari pengkodean GIF.

Pendekatan standard adalah algoritma potong median* [Heckbert, 1982]: mengurutkan semua piksel oleh saluran reddest mereka, membagi daftar di median, ulangi untuk hijau dan biru, membagi ruang warna secara rekursif menjadi 256 region. Rata-rata masing-masing wilayah menjadi entri palet. Inilah yang Gif.js — perpustakaan yang digunakan PinePaper — eksekusi-implementasikan dalam Pekerja Web untuk paralelisme [Rubaxa, gif.js].

Kuantisasi warna Color adalah mengapa GIF menangani grafik warna datar dengan baik tetapi berjuang dengan foto dan gradien. Sebuah gradien sepanjang 1080 piksel mungkin menggunakan 500+ warna yang berbeda. Mampatkan ke 256 menghasilkan banding yang tampak — langkah diskret di mana gradien harus halus.

**** Apa yang bisa kau lakukan:** Andorna menggunakan lebih sedikit warna dalam desain Anda. Bentuk pipih, isian padat, dan teks mengkuantisasi dengan baik. Gradien halus dan tekstur fotografi tidak. Jika GIF Anda memiliki banding, permudah palet, bukan resolusi.

Langkah ketiga: Pemampatan LZW

Indeks piksel setiap bingkai (rujukan ke dalam palet 256-warna) dimampatkan menggunakan Lempel-Ziv-Welch (LZW) kompresi [Welch, 1984]. LZW membuat kamus urutan byte berulang saat memindai data. Saat bertemu urutan yang telah dilihat sebelumnya, ia mengeluarkan indeks kamus daripada bait mentah.

Ini berarti kompresi GIF paling efektif ketika ada area besar warna berulang — latar belakang solid, bentuk rata, teks di permukaan seragam. Tekstur kompleks dengan variasi tingkat piksel menghasilkan rasio kompresi yang buruk karena kamus LZW menemukan sedikit urutan berulang.

*Aplikasi praktis: A GIF GIF 1080×1080 dari teks putih pada latar belakang hitam mungkin memampatkan ke 200KB. Resolusi yang sama GIF dari sebuah foto kompleks mungkin 8MB. Ukuran berkas ini lebih bergantung pada kerumitan visual daripada resolusi atau hitungan bingkai.

Langkah 4: Pembuangan dan Optimasi Bingkai

Frame GIF yang tidak diketahui dapat menentukan metode disposal*: apakah untuk membersihkan kanvas sebelum menggambar bingkai berikutnya, meninggalkan frame sebelumnya terlihat, atau dikembalikan ke latar belakang. Pengekod GIF yang pintar menggunakan frame differencing — pengkodean ode hanya piksel yang berubah antara bingkai, bukan keseluruhan bingkai.

Jika animasi Anda memiliki latar belakang statis dengan elemen bergerak kecil, sebuah optimasi GIF mengkodekan latar belakang sekali dan hanya memperbarui wilayah tempat elemen tersebut berpindah. Hal ini secara drastis mengurangi ukuran berkas. Pengekod PinePaper-nya menggunakan gif.js yang menerapkan optimasi ini secara otomatis.

Bilangan

XOY untuk animasi PinePaper yang khas (1080×1080, 15 FPS, 3 detik, latar belakang gelap dengan teks animasi):

Komponen Ukuran
Bingkai Raw (45 × 4,7M piksel × 3 byte) ~634 MB
Setelah kuantisasi (256 warna, 1 byte/piksel) ~211 MB
Setelah kompresi LZW ~2-4 MB
Perbedaan kerangka ~1-2 MB

Rasio kompresi dari mentah ke akhir adalah kira-kira 300:1 sampai 600:1. Sebagian besar ini berasal dari kuantisasi warna (3:1) dan LZW (50:1 sampai 100:1).

Klik melalui empat tahap. Bar ini ditarik terhadap ukuran mentah pada satu skala linear, jadi dua tahap terakhir adalah garis rambut — itu bukan kesalahan penerapan penyakit, seperti itulah 300:1.

Interactive demo — open in editor pp:PinePaper

When to Use GIF vs Other Formats

Format Terbaik untuk Batasan
GIF Dukungan Universal, auto-play, aplikasi pesan 256 warna, berkas besar, tanpa audio
WebM (VP9) Kualitas terbaik, file terkecil, web Dukungan terbatas di Safari, iMessage
MP4 (H.264) Media sosial, pemain video Memerlukan kodeks, tanpa transparansi
APING Animasi warna penuh dengan transparansi Dukungan terbatas di peramban yang lebih tua

Keserasian universal dan permainan otomatis adalah pilihan yang tepat. Untuk kualitas atau ukuran berkas, WebM atau MP4 lebih baik.

Cobalah

Open PinePaper Studio, membuat desain, dan ekspor sebagai GIF. Perhatikan bagaimana ukuran berkas berubah saat Anda:

  • Tingkatkan jumlah bingkai (lebih banyak bingkai = berkas lebih besar, secara proporsional)
  • Tambah gradien (kuantisasi miskin = berkas lebih besar)
  • Una warna solid (kuantisasi baik = berkas lebih kecil)
  • Tingkatkan ukuran kanvas (lebih banyak piksel per bingkai = berkas lebih besar)

Setiap perubahan adalah pengukuran pipa kompresi. Kau tidak hanya membuat GIF kau mengamati bagaimana teori informasi diterapkan pada desainmu.

Rujukan

  • CompuServe (1987). Spesifikasi Format Interchange Grafika, Versi 87a.
  • AZO GIPHY (2020). Laporan Tahunan: 10 Miliar Pelayanan Harian.
  • Š Heckbert, P. Afend (1982). Kuantisasi Gambar Warna untuk Tampilan Penimbal Bingkai. Ikhlas Grafika Komputer (SIGGRAPH)*, 16(3), 297-307.
  • "Cogozaxa". gif.js — Pengekod JavaScript GIF menggunakan Web Workers. github.com/jnordberg/gif.js.
  • Welch, T.A. ^ a b c d e f g h i j k l m n o p. Teknik Teknik untuk Pemampatan Data Performan Tinggi. IEEEE Computer, 17(6), 8-19.

Ekspor GIF milik PinePaper ini gratis — tak ada watermark, tak ada tanda tangan. ¡/editor) dan ekspor animasi pertama Anda.

Ready to create?

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

Open PinePaper Editor