Pengantar
WebP adalah format gambar yang menggunakan (i) encoding frame tombol VP8 untuk mengompresi data gambar dengan cara lossy atau (ii) encoding lossless WebP. Skema encoding ini akan membuatnya lebih efisien daripada format lama, seperti JPEG, GIF, dan PNG. Dioptimalkan untuk transfer gambar yang cepat melalui jaringan (misalnya, untuk situs). Format WebP memiliki paritas fitur (profil warna, metadata, animasi, dll.) dengan format lainnya. Dokumen ini menjelaskan struktur file WebP.
Penampung WebP (yaitu, penampung RIFF untuk WebP) memungkinkan dukungan fitur di atas dan di atas kasus penggunaan dasar WebP (yaitu, file yang berisi satu gambar yang dienkode sebagai frame kunci VP8). Penampung WebP memberikan dukungan tambahan untuk hal berikut:
Kompresi Lossless: Gambar dapat dikompresi secara lossless, menggunakan Format Lossless WebP.
Metadata: Gambar mungkin memiliki metadata yang disimpan dalam format Exchangeable Image File Format (Exif) atau Extensible Metadata Platform (XMP).
Transparansi: Gambar dapat memiliki transparansi, yaitu channel alfa.
Profil Warna: Gambar mungkin memiliki profil ICC tersemat seperti yang dijelaskan oleh International Color Consortium.
Animasi: Gambar mungkin memiliki beberapa frame dengan jeda di antaranya, sehingga menjadikannya animasi.
Penamaan
DIREKOMENDASIKAN untuk menggunakan jenis berikut saat merujuk ke penampung WebP:
Nama Format Container | WebP |
Ekstensi Nama File | .webp |
Jenis MIME | gambar/webp |
ID Jenis Seragam | org.webmproject.webp |
Terminologi & Dasar-Dasar
Kata kunci "HARUS", "TIDAK BOLEH", "DIPERLUKAN", "HARUS", "TIDAK BOLEH", "SEBAIKNYA", "TIDAK BOLEH", "DIREKOMENDASIKAN", "TIDAK DIREKOMENDASIKAN", "MAY", dan "OPSIONAL" dalam dokumen ini harus ditafsirkan seperti yang dijelaskan dalam BCP 14 RFC 2119 RFC 8174 jika, dan hanya jika, kata kunci tersebut ditampilkan dalam huruf kapital.
File WebP berisi gambar diam (yaitu, matriks piksel yang dienkode) atau animasi. Secara opsional, elemen ini juga dapat berisi informasi transparansi, profil warna, dan metadata. Kita menyebut matriks piksel sebagai kanvas gambar.
Penomoran bit dalam diagram potongan dimulai dari 0
untuk bit yang paling signifikan
('MSB 0'), seperti yang dijelaskan dalam RFC 1166.
Berikut adalah istilah tambahan yang digunakan di seluruh dokumen ini:
- Pembaca/Penulis
- Kode yang membaca file WebP disebut sebagai pembaca, sedangkan kode yang menulisnya disebut sebagai penulis.
- uint16
- Bilangan bulat 16-bit, small-endian, tanpa tanda tangan.
- uint24
- Bilangan bulat 24-bit, little-endian, tanpa tanda tangan.
- uint32
- Bilangan bulat 32-bit, small-endian, tanpa tanda tangan.
- FourCC
- Kode empat karakter (FourCC) adalah uint32 yang dibuat dengan menggabungkan empat karakter ASCII dalam urutan little-endian. Ini berarti 'aaaa' (0x61616161) dan 'AAAA' (0x41414141) diperlakukan sebagai FourCCs yang berbeda.
- Berbasis 1
- Misalnya, kolom bilangan bulat tanpa tanda yang menyimpan nilai di-offset dengan
-1
, sehingga kolom tersebut akan menyimpan nilai 25 sebagai 24. - ChunkHeader('ABCD')
- Digunakan untuk mendeskripsikan header FourCC dan Chunk Size dari setiap bagian, dengan 'ABCD' adalah FourCC untuk setiap bagian. Ukuran elemen ini adalah 8 byte.
Format File RIFF
Format file WebP didasarkan pada format dokumen RIFF (Resource Interchange File Format).
Elemen dasar file RIFF adalah potongan. Terdiri dari:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Chunk FourCC |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Chunk Size |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: Chunk Payload :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- Potongan Empat CC: 32 bit
- Kode empat karakter ASCII yang digunakan untuk identifikasi potongan.
- Ukuran Potongan: 32 bit (uint32)
- Ukuran potongan dalam byte, tidak termasuk kolom ini, ID potongan, atau padding.
- Payload Potongan: Ukuran Potongan byte
- Payload data. Jika Chunk Size ganjil, byte padding tunggal -- yang HARUS
berupa
0
agar sesuai dengan RIFF -- akan ditambahkan.
Catatan: RIFF memiliki konvensi bahwa FourCC potongan semua huruf besar adalah potongan standar yang berlaku untuk semua format file RIFF, sementara FourCC khusus untuk format file adalah huruf kecil. WebP tidak mengikuti konvensi ini.
Header File WebP
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 'R' | 'I' | 'F' | 'F' |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| File Size |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 'W' | 'E' | 'B' | 'P' |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 'RIFF': 32 bit
- Karakter ASCII 'R', 'I', 'F', 'F'.
- Ukuran File: 32 bit (uint32)
- Ukuran file dalam byte, mulai dari offset 8. Nilai maksimum kolom ini adalah 2^32 dikurangi 10 byte, sehingga ukuran seluruh file maksimal 4 GiB dikurangi 2 byte.
- 'WEBP': 32 bit
- Karakter ASCII 'W', 'E', 'B', 'P'.
File WebP HARUS diawali dengan header RIFF dengan 'WEBP' FourCC. Ukuran file di header adalah ukuran total potongan file berikutnya, plus 4
byte untuk FourCC 'WEBP'. File TIDAK BOLEH berisi data apa pun setelah data
yang ditentukan oleh File Size. Pembaca MUNGKIN mengurai file tersebut, mengabaikan data
di akhir. Karena ukuran setiap potongan genap, ukuran yang diberikan oleh header RIFF
juga berukuran genap. Isi setiap bagian dijelaskan di bagian
berikut.
Format File Sederhana (Hilang)
Tata letak ini HARUS digunakan jika gambar memerlukan encoding lossy dan tidak memerlukan transparansi atau fitur lanjutan lainnya yang disediakan oleh format yang diperluas. File dengan tata letak ini lebih kecil dan didukung oleh software lama.
Format file WebP (lossy) sederhana:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| WebP file header (12 bytes) |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: 'VP8 ' Chunk :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Potongan 'VP8 ':
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ChunkHeader('VP8 ') |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: VP8 data :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- Data VP8: Ukuran Potongan byte
- Data bitstream VP8.
Perhatikan bahwa karakter keempat dalam 'VP8 ' FourCC adalah spasi ASCII (0x20).
Spesifikasi format bitstream VP8 dijelaskan dalam Panduan Decoding dan Format Data VP8. Perhatikan bahwa header frame VP8 berisi lebar dan tinggi frame VP8. Diasumsikan sebagai lebar dan tinggi kanvas.
Spesifikasi VP8 menjelaskan cara mendekode gambar ke dalam format Y'CbCr. Untuk mengonversi ke RGB, Rekomendasi BT.601 HARUS digunakan. Aplikasi MUNGKIN menggunakan metode konversi lain, tetapi hasil visual mungkin berbeda di antara decoder.
Format File Sederhana (lossless)
Catatan: Pembaca lama mungkin tidak mendukung file yang menggunakan format lossless.
Tata letak ini HARUS digunakan jika gambar memerlukan encoding lossless (dengan saluran transparansi opsional) dan tidak memerlukan fitur lanjutan yang disediakan oleh format yang diperluas.
Format file WebP (lossless) sederhana:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| WebP file header (12 bytes) |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: 'VP8L' Chunk :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Potongan 'VP8L':
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ChunkHeader('VP8L') |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: VP8L data :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- Data VP8L: Ukuran Potongan byte
- Data bitstream VP8L.
Spesifikasi bitstream VP8L saat ini dapat ditemukan di WebP Lossless Bitstream Format. Perhatikan bahwa header VP8L berisi lebar dan tinggi gambar VP8L. Diasumsikan sebagai lebar dan tinggi kanvas.
Format File yang Diperluas
Catatan: Pembaca lama mungkin tidak mendukung file yang menggunakan format diperluas.
File format yang diperluas terdiri dari:
Potongan 'VP8X' dengan informasi tentang fitur yang digunakan dalam file.
Potongan 'ICCP' opsional dengan profil warna.
Potongan 'ANIM' opsional dengan data kontrol animasi.
Data gambar.
Potongan 'EXIF' opsional dengan metadata Exif.
Potongan 'XMP ' opsional dengan metadata XMP.
Daftar opsional bagian yang tidak diketahui.
Untuk gambar diam, data gambar terdiri dari satu frame yang terdiri dari:
Sub bagian alfa opsional.
Untuk gambar animasi, data gambar terdiri dari beberapa frame. Detail selengkapnya tentang frame dapat ditemukan di bagian Animasi.
Semua bagian yang diperlukan untuk rekonstruksi dan koreksi warna, yaitu 'VP8X', 'ICCP', 'ANIM', 'ANMF', 'ALPH', 'VP8 ' dan 'VP8L', HARUS muncul dalam urutan yang dijelaskan sebelumnya. Pembaca HARUS gagal jika potongan yang diperlukan untuk rekonstruksi dan koreksi warna tidak berurutan.
Potongan metadata dan yang tidak diketahui MUNGKIN muncul tidak berurutan.
Rasional: Potongan yang diperlukan untuk rekonstruksi harus muncul terlebih dahulu dalam file agar pembaca dapat mulai mendekode gambar sebelum menerima semua data. Aplikasi dapat memperoleh manfaat dari berbagai urutan metadata dan potongan kustom agar sesuai dengan implementasinya.
Header file WebP yang diperluas:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| WebP file header (12 bytes) |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ChunkHeader('VP8X') |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Rsv|I|L|E|X|A|R| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Canvas Width Minus One | ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
... Canvas Height Minus One |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- Dicadangkan (Rsv): 2 bit
- HARUS
0
. Pembaca HARUS mengabaikan kolom ini. - Profil ICC (I): 1 bit
- Tetapkan apakah file berisi Potongan 'ICCP'.
- Alfa (L): 1 bit
- Tetapkan apakah salah satu frame gambar berisi informasi transparansi ("alpha").
- Metadata Exif (E): 1 bit
- Tetapkan apakah file berisi metadata Exif.
- Metadata XMP (X): 1 bit
- Tetapkan apakah file berisi metadata XMP.
- Animasi (A): 1 bit
- Tetapkan apakah ini gambar animasi. Data dalam Potongan 'ANIM' dan 'ANMF' harus digunakan untuk mengontrol animasi.
- Dicadangkan (R): 1 bit
- HARUS
0
. Pembaca HARUS mengabaikan kolom ini. - Dicadangkan: 24 bit
- HARUS
0
. Pembaca HARUS mengabaikan kolom ini. - Lebar Kanvas Minus Satu: 24 bit
- berbasis 1 pada lebar kanvas dalam piksel.
Lebar kanvas yang sebenarnya adalah
1 + Canvas Width Minus One
. - Tinggi Kanvas Minus Satu: 24 bit Tinggi kanvas
- berbasis 1 dalam piksel.
Tinggi kanvas sebenarnya adalah
1 + Canvas Height Minus One
.
Produk Lebar Kanvas dan Tinggi Kanvas TIDAK BOLEH 2^32 - 1
.
Spesifikasi mendatang dapat menambahkan lebih banyak kolom. Kolom yang tidak dikenal HARUS diabaikan.
Animasi
Animasi dikontrol oleh Potongan 'ANIM' dan 'ANMF'.
Potongan 'ANIM':
Untuk gambar animasi, potongan ini berisi parameter global animasi.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ChunkHeader('ANIM') |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Background Color |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Loop Count |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- Warna Latar Belakang: 32 bit (uint32)
- Warna latar belakang default kanvas dalam urutan byte [Biru, Hijau, Merah, Alfa]
. Warna ini MUNGKIN digunakan untuk mengisi ruang yang tidak digunakan pada kanvas
di sekitar bingkai, serta piksel transparan dari frame pertama.
Warna latar belakang juga digunakan saat metode Disposal adalah
1
.
Catatan:
Warna latar belakang MUNGKIN berisi nilai alfa yang tidak buram, meskipun tanda Alpha di Chunk'VP8X' tidak disetel.
Aplikasi pelihat HARUS memperlakukan nilai warna latar belakang sebagai petunjuk dan tidak diwajibkan untuk menggunakannya.
Kanvas dihapus di awal setiap loop. Warna latar belakang DAPAT digunakan untuk mencapai ini.
- Jumlah Loop: 16 bit (uint16)
- Berapa kali animasi akan diulang. Jika nilainya
0
, ini berarti tak terbatas.
Potongan ini HARUS muncul jika tanda Animation dalam Chunk 'VP8X' ditetapkan. Jika flag Animation tidak ditetapkan dan potongan ini ada, HARUS diabaikan.
Potongan 'ANMF':
Untuk gambar animasi, potongan ini berisi informasi tentang satu frame. Jika Tanda animasi tidak ditetapkan, bagian ini TIDAK BOLEH ada.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ChunkHeader('ANMF') |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Frame X | ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
... Frame Y | Frame Width Minus One ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
... | Frame Height Minus One |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Frame Duration | Reserved |B|D|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: Frame Data :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- Frame X: 24 bit (uint24)
- Koordinat X dari sudut kiri atas bingkai adalah
Frame X * 2
. - Frame Y: 24 bit (uint24)
- Koordinat Y dari sudut kiri atas bingkai adalah
Frame Y * 2
. - Lebar Rangka Minus Satu: 24 bit (uint24)
- Lebar frame berbasis 1.
Lebar bingkai adalah
1 + Frame Width Minus One
. - Tinggi Frame Minus Satu: 24 bit (uint24)
- Tinggi frame berbasis 1.
Tinggi bingkai adalah
1 + Frame Height Minus One
. - Durasi Frame: 24 bit (uint24)
- Waktu tunggu sebelum menampilkan frame berikutnya, dalam unit 1 milidetik. Perhatikan bahwa interpretasi Durasi Frame 0 (dan sering kali <= 10) ditentukan oleh implementasinya. Banyak alat dan browser menetapkan durasi minimum yang mirip dengan GIF.
- Dicadangkan: 6 bit
- HARUS
0
. Pembaca HARUS mengabaikan kolom ini. - Metode penggabungan (B): 1 bit
Menunjukkan bagaimana piksel transparan frame saat ini akan digabungkan dengan piksel yang sesuai dari kanvas sebelumnya:
0
: Menggunakan pencampuran alfa. Setelah membuang frame sebelumnya, render frame saat ini pada kanvas menggunakan pencampuran alfa (lihat di bawah). Jika frame saat ini tidak memiliki saluran alfa, asumsikan nilai alfa adalah 255, yang secara efektif menggantikan persegi panjang.1
: Jangan gabungkan. Setelah membuang frame sebelumnya, render frame saat ini pada kanvas dengan menimpa persegi panjang yang dicakup oleh frame saat ini.
- Metode pembuangan (D): 1 bit
Menunjukkan bagaimana frame saat ini akan diperlakukan setelah ditampilkan (sebelum merender frame berikutnya) di kanvas:
0
: Jangan buang. Biarkan kanvas apa adanya.1
: Membuang ke warna latar belakang. Isi persegi panjang di kanvas yang tertutup oleh frame saat ini dengan warna latar belakang yang ditentukan dalam 'ANIM' Chunk.
Catatan:
Pembuangan frame hanya berlaku untuk persegi panjang bingkai, yaitu persegi panjang yang ditentukan oleh Frame X, Frame Y, lebar frame, dan tinggi bingkai. Foto sampul mungkin saja memenuhi seluruh kanvas, mungkin juga tidak.
Pencampuran alfa:
Mengingat bahwa setiap saluran R, G, B, dan A adalah 8 bit, dan saluran RGB tidak dikalikan sebelumnya dengan alfa, rumus untuk menggabungkan 'dst' dengan 'src' adalah:
blend.A = src.A + dst.A * (1 - src.A / 255) if blend.A = 0 then blend.RGB = 0 else blend.RGB = (src.RGB * src.A + dst.RGB * dst.A * (1 - src.A / 255)) / blend.A
Pencampuran alfa HARUS dilakukan di ruang warna linear, dengan mempertimbangkan profil warna gambar. Jika profil warna tidak ada, RGB standar (sRGB) akan diasumsikan. (Perhatikan bahwa sRGB juga perlu dilinearisasi karena gamma memiliki nilai gamma ~2,2.)
- Data Frame: Ukuran Potongan -
16
byte Terdiri dari:
Subbagian alfa opsional untuk frame.
Subbagian bitstream untuk frame.
Daftar opsional bagian yang tidak diketahui.
Catatan: Payload 'ANMF', Frame Data, terdiri dari setiap bagian dengan padding, seperti yang dijelaskan oleh format file RIFF.
Alfa
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ChunkHeader('ALPH') |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Rsv| P | F | C | Alpha Bitstream... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- Dicadangkan (Rsv): 2 bit
- HARUS
0
. Pembaca HARUS mengabaikan kolom ini. - Prapemrosesan (P): 2 bit
Bit informatif ini digunakan untuk memberikan sinyal pra-pemrosesan yang telah dilakukan selama kompresi. Decoder dapat menggunakan informasi ini untuk misalnya, mengubah nilai atau menghaluskan gradien sebelum ditampilkan.
0
: Tidak ada pra-pemrosesan.1
: Pengurangan level.
Decoder tidak diharuskan menggunakan informasi ini dengan cara apa pun.
- Metode pemfilteran (F): 2 bit
Metode pemfilteran yang digunakan dijelaskan sebagai berikut:
0
: Tidak ada.1
: Filter horizontal.2
: Filter vertikal.3
: Filter gradien.
Untuk setiap {i>pixel<i}, penyaringan dilakukan menggunakan perhitungan berikut.
Asumsikan nilai alfa di sekitar posisi X
saat ini diberi label sebagai:
C | B |
---+---+
A | X |
Kita berusaha menghitung nilai alfa pada posisi X
. Pertama, prediksi akan dibuat bergantung pada metode pemfilteran:
- Metode
0
: prediktor = 0 - Metode
1
: prediktor = A - Metode
2
: prediktor = B - Metode
3
: prediktor = klip(A + B - C)
dengan clip(v)
sama dengan:
- 0 jika v < 0,
- 255 jika v > 255, atau
- v jika tidak
Nilai akhir diperoleh dengan menambahkan nilai X
yang didekompresi ke
prediksi dan menggunakan aritmetika modulo-256 untuk menggabungkan rentang [256..511] ke dalam rentang [0..255]:
alpha = (predictor + X) % 256
Ada kasus khusus untuk posisi piksel paling kiri dan paling atas. Misalnya, nilai kiri atas di lokasi (0, 0) menggunakan 0 sebagai nilai prediktor. Atau:
- Untuk metode pemfilteran horizontal atau gradien, piksel paling kiri di lokasi (0, y) diprediksi menggunakan lokasi (0, y-1) tepat di atasnya.
- Untuk metode pemfilteran vertikal atau gradien, piksel paling atas di lokasi (x, 0) diprediksi menggunakan lokasi (x-1, 0) di sebelah kiri.
- Metode kompresi (C): 2 bit
Metode kompresi yang digunakan:
0
: Tanpa kompresi.1
: Dikompresi menggunakan format lossless WebP.
- Bitstream alfa: Ukuran Potongan -
1
byte Bitstream alfa yang dienkode.
Potongan opsional ini berisi data alfa yang dienkode untuk {i>frame<i} ini. Frame yang berisi Potongan 'VP8L' TIDAK BOLEH berisi potongan ini.
Rasional: Informasi transparansi sudah menjadi bagian dari Chunk 'VP8L'.
Data saluran alfa disimpan sebagai data mentah yang tidak dikompresi (jika metode kompresi adalah '0') atau dikompresi menggunakan format lossless (jika metode kompresi adalah '1').
Data mentah: Data ini terdiri dari urutan byte panjang = lebar * tinggi, yang berisi semua nilai transparansi 8-bit dalam urutan pemindaian.
Kompresi format lossless: Urutan byte adalah streaming gambar terkompresi (seperti yang dijelaskan dalam "WebP Lossless Bitstream Format") dengan dimensi implisit, lebar x tinggi. Artinya, aliran gambar ini TIDAK berisi header apa pun yang menjelaskan dimensi gambar.
Rasional: Dimensi sudah diketahui dari sumber lain, jadi menyimpannya lagi akan menjadi redundan dan rentan terhadap error.
Setelah aliran gambar didekode menjadi nilai warna Alfa, Merah, Hijau, Biru (ARGB), dengan mengikuti proses yang dijelaskan dalam spesifikasi format lossless, informasi transparansi harus diekstrak dari saluran hijau untuk quadruplet ARGB.
Rasional: Saluran hijau diizinkan untuk melakukan langkah transformasi tambahan dalam spesifikasi, tidak seperti saluran lainnya, yang dapat meningkatkan kompresi.
Bitstream (VP8/VP8L)
Potongan ini berisi data bitstream terkompresi untuk satu {i>frame<i}.
Potongan bitstream dapat berupa (i) Chunk 'VP8 ', menggunakan 'VP8 ' (perhatikan ruang karakter keempat yang signifikan) sebagai FourCC-nya, atau (ii) Chunk 'VP8L', menggunakan 'VP8L' sebagai FourCC-nya.
Format Potongan 'VP8 ' dan 'VP8L' dijelaskan di bagian Format File Sederhana (Lossy) dan Format File Sederhana (lossless).
Profil Warna
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ChunkHeader('ICCP') |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: Color Profile :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- Profil Warna: Ukuran Potongan byte
- Profil ICC.
Potongan ini HARUS muncul sebelum data gambar.
SEharusnya ada paling banyak satu potongan tersebut. Jika ada lebih banyak potongan seperti itu, pembaca DAPATLAH mengabaikan semua kecuali yang pertama. Lihat Spesifikasi ICC untuk mengetahui detailnya.
Jika bagian ini tidak ada, sRGB SEHARUSNYA diasumsikan.
Metadata
Metadata dapat disimpan dalam Potongan 'EXIF' atau 'XMP '.
HARUS ada maksimal satu bagian dari setiap jenis ('EXIF' dan 'XMP '). Jika ada lebih banyak potongan seperti itu, pembaca MUNGKIN mengabaikan semuanya, kecuali yang pertama.
Potongan ini didefinisikan sebagai berikut:
Potongan 'EXIF':
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ChunkHeader('EXIF') |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: Exif Metadata :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- Metadata Exif: Ukuran Potongan byte
- Metadata gambar dalam format Exif.
Potongan 'XMP ':
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ChunkHeader('XMP ') |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: XMP Metadata :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- Metadata XMP: Ukuran Potongan byte
- Metadata gambar dalam format XMP.
Perhatikan bahwa karakter keempat dalam FourCC 'XMP ' adalah spasi ASCII (0x20).
Panduan tambahan tentang penanganan metadata dapat ditemukan dalam "Panduan Menangani Metadata" dari Metadata Working Group.
Potongan yang Tidak Diketahui
Bagian RIFF (dijelaskan di bagian RIFF File Format) yang FourCC-nya berbeda dengan bagian mana pun yang dijelaskan dalam dokumen ini dianggap sebagai bagian yang tidak diketahui.
Rasional: Mengizinkan potongan yang tidak diketahui akan memberikan penyediaan untuk ekstensi format di masa mendatang dan juga memungkinkan penyimpanan data khusus aplikasi.
Sebuah file MUNGKIN berisi potongan yang tidak diketahui:
- di akhir file, seperti yang dijelaskan di bagian header file WebP yang diperluas, atau
- di akhir Potongan 'ANMF', seperti yang dijelaskan di bagian Animasi.
Pembaca HARUS mengabaikan potongan ini. Penulis HARUS menyimpannya dalam urutan aslinya (kecuali jika mereka secara khusus ingin mengubah potongan ini).
Perakitan Kanvas dari Bingkai
Di sini kami memberikan ringkasan tentang bagaimana pembaca HARUS merakit kanvas untuk gambar animasi.
Prosesnya dimulai dengan membuat kanvas menggunakan dimensi yang diberikan dalam
Chunk 'VP8X', dengan lebar Canvas Width Minus One + 1
piksel dan tinggi Canvas Height Minus
One + 1
piksel. Kolom Loop Count
dari Chunk 'ANIM' mengontrol frekuensi proses animasi diulang. Ini adalah Loop Count - 1
untuk
nilai Loop Count
bukan nol atau tak terbatas jika Loop Count
adalah nol.
Pada awal setiap iterasi loop, kanvas diisi menggunakan warna latar belakang dari Chunk 'ANIM' atau warna yang ditentukan aplikasi.
Potongan 'ANMF' berisi frame individual yang diberikan dalam urutan tampilan. Sebelum merender
setiap frame, Disposal method
frame sebelumnya akan diterapkan.
Rendering frame yang didekode dimulai pada koordinat Kartesius (2 *
Frame X
, 2 * Frame Y
), menggunakan sudut kiri atas kanvas sebagai asal.
Lebar Frame Width Minus One + 1
piksel dan tinggi Frame Height Minus One + 1
piksel
dirender ke kanvas menggunakan Blending method
.
Kanvas ditampilkan selama Frame Duration
milidetik. Proses ini akan berlanjut hingga semua frame yang diberikan oleh Potongan 'ANMF' telah ditampilkan. Iterasi loop baru akan dimulai, atau kanvas akan dibiarkan dalam status akhir jika semua iterasi telah selesai.
Kode semu berikut mengilustrasikan proses rendering. Notasi VP8X.field berarti kolom dalam Chunk 'VP8X' dengan deskripsi yang sama.
VP8X.flags.hasAnimation MUST be TRUE
canvas ← new image of size VP8X.canvasWidth x VP8X.canvasHeight with
background color ANIM.background_color or
application-defined color.
loop_count ← ANIM.loopCount
dispose_method ← Dispose to background color
if loop_count == 0:
loop_count = ∞
frame_params ← nil
next chunk in image_data is ANMF MUST be TRUE
for loop = 0..loop_count - 1
clear canvas to ANIM.background_color or application-defined color
until eof or non-ANMF chunk
frame_params.frameX = Frame X
frame_params.frameY = Frame Y
frame_params.frameWidth = Frame Width Minus One + 1
frame_params.frameHeight = Frame Height Minus One + 1
frame_params.frameDuration = Frame Duration
frame_right = frame_params.frameX + frame_params.frameWidth
frame_bottom = frame_params.frameY + frame_params.frameHeight
VP8X.canvasWidth >= frame_right MUST be TRUE
VP8X.canvasHeight >= frame_bottom MUST be TRUE
for subchunk in 'Frame Data':
if subchunk.tag == "ALPH":
alpha subchunks not found in 'Frame Data' earlier MUST be
TRUE
frame_params.alpha = alpha_data
else if subchunk.tag == "VP8 " OR subchunk.tag == "VP8L":
bitstream subchunks not found in 'Frame Data' earlier MUST
be TRUE
frame_params.bitstream = bitstream_data
apply dispose_method.
render frame with frame_params.alpha and frame_params.bitstream
on canvas with top-left corner at (frame_params.frameX,
frame_params.frameY), using Blending method
frame_params.blendingMethod.
canvas contains the decoded image.
Show the contents of the canvas for
frame_params.frameDuration * 1 ms.
dispose_method = frame_params.disposeMethod
Contoh Tata Letak File
Gambar yang dienkode lossy dengan alfa dapat terlihat seperti berikut:
RIFF/WEBP
+- VP8X (descriptions of features used)
+- ALPH (alpha bitstream)
+- VP8 (bitstream)
Gambar berenkode lossless mungkin terlihat seperti berikut:
RIFF/WEBP
+- VP8X (descriptions of features used)
+- VP8L (lossless bitstream)
+- XYZW (unknown chunk)
Gambar lossless dengan profil ICC dan metadata XMP dapat terlihat seperti berikut:
RIFF/WEBP
+- VP8X (descriptions of features used)
+- ICCP (color profile)
+- VP8L (lossless bitstream)
+- XMP (metadata)
Gambar animasi dengan metadata Exif dapat terlihat sebagai berikut:
RIFF/WEBP
+- VP8X (descriptions of features used)
+- ANIM (global animation parameters)
+- ANMF (frame1 parameters + data)
+- ANMF (frame2 parameters + data)
+- ANMF (frame3 parameters + data)
+- ANMF (frame4 parameters + data)
+- EXIF (metadata)