Spesifikasi Penampung WebP

Pengantar

WebP adalah format gambar yang menggunakan (i) encoding frame utama VP8 untuk mengompresi data gambar dengan cara lossy atau (ii) encoding lossless WebP. Ini skema encoding seharusnya membuatnya lebih efisien dibandingkan format lama, seperti JPEG, GIF, dan PNG. Dioptimalkan untuk transfer gambar yang cepat melalui jaringan (untuk misalnya, untuk situs). Format WebP memiliki paritas fitur (profil warna, metadata, animasi, dll.) dengan format lain juga. Dokumen ini menjelaskan struktur file WebP.

Penampung WebP (yaitu, container RIFF untuk WebP) memungkinkan dukungan fitur melebihi kasus penggunaan dasar WebP (yaitu, file yang berisi satu gambar yang dienkode sebagai frame kunci VP8). Penampung WebP menyediakan dukungan untuk hal berikut:

  • Kompresi Lossless: Gambar dapat dikompresi secara lossless, menggunakan Format lossless WebP.

  • Metadata: Gambar mungkin memiliki metadata yang disimpan di File Gambar yang Dapat Ditukar Format (Exif) atau Extensible Metadata Platform (XMP).

  • Transparansi: Gambar mungkin memiliki transparansi, yaitu saluran alfa.

  • Profil Warna: Gambar mungkin memiliki profil ICC tersemat seperti yang dijelaskan oleh International Color Consortium.

  • Animasi: Sebuah gambar mungkin memiliki beberapa frame dengan jeda di antaranya, menjadikannya animasi.

Penamaan

DIREKOMENDASIKAN untuk menggunakan jenis berikut saat merujuk ke WebP penampung:

Nama Format ContainerWebP
Ekstensi Nama File.webp
Jenis MIMEimage/webp
ID Jenis Seragamorg.webmproject.webp

Terminologi & Dasar-dasar

Kata kunci "HARUS", "TIDAK BOLEH", "DIPERLUKAN", "TIDAK BOLEH", "TIDAK BOLEH", "Seharusnya", "TIDAK BOLEH", "DIREKOMENDASIKAN", "TIDAK DIREKOMENDASIKAN", "MUNGKIN", dan "OPSIONAL" dalam dokumen harus ditafsirkan seperti yang dijelaskan dalam BCP 14 RFC 2119 RFC 8174. kapan saja, dan hanya jika, semua dalam huruf kapital semua, seperti yang ditunjukkan di sini.

File WebP berisi gambar diam (yaitu, matriks piksel yang dienkode) atau animasi. Secara opsional, hal ini juga dapat berisi transparansi informasi, profil warna, dan {i>metadata<i}. Kita menyebut matriks {i>pixel<i} 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 persyaratan 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, little-endian, tanpa label.
uint24
Bilangan bulat 24-bit, little-endian, tanpa label.
uint32
Bilangan bulat 32-bit, little-endian, tanpa label.
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 berbeda.
Berbasis 1
Kolom bilangan bulat yang tidak ditandatangani diimbangi dengan -1, misalnya, akan menyimpan nilai 25 sebagai 24.
ChunkHeader(&#39;ABCD&#39;)
Digunakan untuk mendeskripsikan header FourCC dan Chunk Size dari setiap potongan, dengan 'ABCD' adalah FourCC untuk potongan tersebut. Ukuran elemen ini adalah 8 byte.

Format File RIFF

Format file WebP didasarkan pada RIFF (Resource Interchange File Format) format dokumen.

Elemen dasar file RIFF adalah bagian. Ini 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 FourCC: 32 bit
Kode empat karakter ASCII yang digunakan untuk identifikasi potongan.
Ukuran Bagian: 32 bit (uint32)
Ukuran potongan dalam byte, tidak termasuk kolom ini, potongan ID, atau padding.
Payload Bagian: Ukuran Chunk
Payload data. Jika Chunk Size ganjil, byte padding tunggal -- yang HARUS menjadi 0 agar sesuai dengan RIFF -- ditambahkan.

Catatan: RIFF memiliki konvensi bahwa FourCC potongan semua huruf besar adalah standar potongan yang berlaku untuk semua format file RIFF, sedangkan FourCC khusus untuk suatu file formatnya semua dalam 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 isian ini adalah 2^32 dikurangi 10 byte dan dengan demikian ukuran seluruh file menjadi sebagian besar 4 GiB minus 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 yang mengikuti ditambah 4 byte untuk yakni 'WEBP' FourCC. File TIDAK BOLEH berisi data apa pun setelah data yang ditentukan oleh File Size. Pembaca MUNGKIN mengurai file tersebut, dengan mengabaikan di akhir layanan otomatis dan data skalabel. Karena ukuran setiap potongan adalah rata, ukuran yang diberikan oleh {i>header<i} RIFF adalah juga sama. Isi dari masing-masing potongan diuraikan sebagai berikut bagian.

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                           :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

'VP8' Bagian:

 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: byte Ukuran Chunk
Data bitstream VP8.

Perhatikan bahwa karakter keempat dalam 'VP8 ' FourCC adalah ruang ASCII (0x20).

Spesifikasi format bitstream VP8 dijelaskan dalam Format Data VP8 dan Panduan Decoding. Perhatikan bahwa header frame VP8 berisi frame VP8 lebar dan tinggi. Itu diasumsikan sebagai lebar dan tinggi kanvas.

Spesifikasi VP8 menjelaskan cara mendekode gambar ke dalam format Y'CbCr. Kepada mengonversi ke RGB, Rekomendasi BT.601 SEHARUSNYA digunakan. Pendaftaran MUNGKIN gunakan metode konversi lain, tetapi hasil visual mungkin berbeda antar-decoder.

Format File Sederhana (Hilang)

Catatan: Pembaca lama mungkin tidak mendukung file menggunakan format lossless.

Tata letak ini HARUS digunakan jika gambar memerlukan encoding lossless (dengan saluran transparansi opsional) dan tidak memerlukan fitur lanjutan yang disediakan dengan 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                          :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

‘VP8L’ Bagian:

 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: byte Ukuran Chunk
Data bitstream VP8L.

Spesifikasi bitstream VP8L saat ini dapat ditemukan di Format WebP Lossless Bitstream. Perhatikan bahwa {i>header<i} 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:

  • 'VP8X' Bagian dengan informasi tentang fitur yang digunakan dalam file.

  • 'ICCP' opsional Potongan dengan profil warna.

  • 'ANIM' opsional Bagian dengan data kontrol animasi.

  • Data gambar.

  • 'EXIF' opsional Potongan dengan metadata Exif.

  • 'XMP' opsional Potongan dengan metadata XMP.

  • Daftar opsional potongan yang tidak diketahui.

Untuk gambar diam, data gambar terdiri dari satu bingkai, yang dibuat lebih dari:

Untuk gambar animasi, data gambar terdiri dari beberapa frame. Selengkapnya detail tentang bingkai dapat ditemukan di bagian Animasi.

Semua potongan yang diperlukan untuk rekonstruksi dan koreksi warna, yaitu 'VP8X', 'ICCP', 'ANIM', 'ANMF', 'ALPH', 'VP8' dan 'VP8L', HARUS muncul dalam urutan jelaskan sebelumnya. Pembaca HARUS gagal saat potongan yang diperlukan untuk rekonstruksi dan koreksi warna tidak berurutan.

Metadata dan potongan tidak diketahui MUNGKIN muncul dari pesanan.

Alasan: Potongan yang diperlukan untuk rekonstruksi harus muncul terlebih dahulu dalam {i>file<i} untuk memungkinkan pembaca untuk mulai mendekode gambar sebelum menerima semua yang mengupload data. Aplikasi dapat mengambil manfaat dari berbagai urutan {i>metadata<i} dan potongan khusus yang 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 jika file berisi 'ICCP' Potongan.
Alfa (L): 1 bit
Setel jika salah satu bingkai gambar berisi informasi transparansi ("alfa").
Metadata Exif (E): 1 bit
Tetapkan apakah file berisi metadata Exif.
Metadata XMP (X): 1 bit
Tetapkan jika file berisi metadata XMP.
Animasi (A): 1 bit
Setel jika ini adalah gambar animasi. Data di 'ANIM' dan 'ANMF' Bagian harus berupa 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
Lebar kanvas berbasis 1 dalam piksel. Lebar kanvas 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 HARUS maksimal 2^32 - 1.

Spesifikasi mendatang mungkin menambahkan lebih banyak kolom. Kolom tidak dikenal HARUS diabaikan.

Animasi

Animasi dikontrol oleh 'ANIM' dan 'ANMF' Potongan.

'ANIM' Bagian:

Untuk gambar animasi, potongan ini berisi parameter global dari 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 warna [Biru, Hijau, Merah, Alfa] urutan byte. Warna ini MUNGKIN digunakan untuk mengisi ruang yang tidak terpakai di kanvas. di sekitar {i>frame<i}, serta {i>pixel<i} transparan dari {i>frame<i} pertama. Warna latar belakang juga digunakan saat metode Disposal adalah 1.

Catatan:

  • Warna latar belakang MUNGKIN berisi nilai alfa yang tidak buram, meskipun Flag Alfa di 'VP8X' Bagian tidak ditetapkan.

  • Aplikasi pelihat HARUS memperlakukan nilai warna latar belakang sebagai petunjuk dan tidak perlu menggunakannya.

  • Kanvas dibersihkan di awal setiap loop. Warna latar belakang MUNGKIN yang digunakan untuk mencapai hasil ini.

Jumlah Loop: 16 bit (uint16)
Frekuensi animasi berulang. Jika yang ditampilkan adalah 0, artinya tanpa batas.

Potongan ini HARUS muncul jika flag Animation di 'VP8X' Bagian telah diatur. Jika flag Animation tidak ditetapkan dan potongan ini ada, flag HARUS diabaikan.

'ANMF' Bagian:

Untuk gambar animasi, potongan ini berisi informasi tentang satu frame. Jika Flag Animation tidak disetel, potongan ini SEHARUSNYA TIDAK 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 sudut kiri atas bingkai adalah Frame X * 2.
Frame Y: 24 bit (uint24)
Koordinat Y sudut kiri atas bingkai adalah Frame Y * 2.
Lebar Frame Minus Satu: 24 bit (uint24)
Lebar bingkai 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 {i>Frame<i} 0 (dan sering kali <= 10) adalah yang ditentukan oleh implementasi. Banyak alat dan browser menetapkan batas minimum durasi yang mirip dengan GIF.
Dicadangkan: 6 bit
HARUS 0. Pembaca HARUS mengabaikan kolom ini.
Metode pencampuran (B): 1 bit

Menunjukkan bagaimana piksel transparan frame saat ini dicampur dengan piksel yang sesuai dari kanvas sebelumnya:

  • 0: Menggunakan pencampuran alfa. Setelah membuang frame sebelumnya, render {i>frame <i}saat ini di kanvas dengan 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 dicampur. Setelah membuang frame sebelumnya, render {i>frame<i} saat ini di kanvas dengan menimpa persegi panjang yang tertutup oleh {i>frame <i}saat ini.

Metode pembuangan (D): 1 bit

Menunjukkan cara menangani frame saat ini setelah ditampilkan (sebelum merender bingkai berikutnya) di kanvas:

  • 0: Jangan dibuang. Biarkan kanvas sebagaimana adanya.

  • 1: Buang ke warna latar belakang. Isi persegi panjang di kanvas dicakup oleh frame saat ini dengan warna latar belakang yang ditentukan dalam 'ANIM' Bagian.

Catatan:

  • Pembuangan bingkai hanya berlaku untuk bingkai persegi panjang, yaitu, persegi panjang yang ditentukan oleh Frame X, Frame Y, lebar bingkai, dan bingkai tinggi. Foto tersebut mungkin menutupi seluruh kanvas, mungkin juga tidak.

  • Pencampuran alfa:

    Mengingat bahwa setiap saluran R, G, B, dan A adalah 8 bit, dan setiap saluran RGB saluran tidak diawali dengan alfa, yakni formula untuk pencampuran 'dst' ke '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 dalam ruang warna linear, dengan mempertimbangkan profil warna gambar. Jika profil warna tidak ada, maka akan diasumsikan RGB standar (sRGB). (Perhatikan bahwa sRGB juga perlu dilinierkan karena gamma ~2,2.)

Data Frame: Ukuran Chunk - 16 byte

Terdiri dari:

Catatan: Tag 'ANMF' payload, Data Frame, terdiri dari 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 menandakan pra-pemrosesan yang yang dilakukan selama kompresi. Decoder dapat menggunakan informasi ini untuk misalnya, membagi nilai atau memperhalus gradien sebelum ditampilkan.

  • 0: Tidak ada pra-pemrosesan.
  • 1: Pengurangan level.

Decoder tidak diperlukan untuk menggunakan informasi ini dengan cara yang ditentukan.

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 piksel, pemfilteran dilakukan dengan menggunakan penghitungan berikut. Asumsikan nilai alfa yang mengelilingi posisi X saat ini diberi label sebagai:

 C | B |
---+---+
 A | X |

Kita akan menghitung nilai alfa di posisi X. Pertama, prediksi dibuat tergantung 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 sebaliknya

Nilai akhir diperoleh dengan menambahkan nilai yang didekompresi X ke prediktor dan menggunakan aritmatika modulo-256 untuk menggabungkan rentang ke dalam [0..255]:

alpha = (predictor + X) % 256

Ada kasus khusus untuk posisi piksel paling kiri dan paling atas. Sebagai 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 atas.
  • 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: Tidak ada kompresi.
  • 1: Dikompresi menggunakan format lossless WebP.
Bitstream alfa: Ukuran Chunk - 1 byte

Bitstream alfa yang dienkode.

Potongan opsional ini berisi data alfa yang dienkode untuk {i>frame<i} ini. Bingkai yang berisi error 'VP8L' Potongan TIDAK BOLEH berisi potongan ini.

Alasan: Informasi transparansi sudah menjadi bagian dari 'VP8L' Potongan.

Data saluran alfa disimpan sebagai data mentah yang tidak dikompresi (pada saat metode kompresinya adalah '0') atau dikompresi menggunakan format lossless (jika metode kompresi adalah '1').

  • Data mentah: Ini terdiri dari urutan byte panjang = lebar * tinggi, yang berisi semua nilai transparansi 8-bit dalam urutan pemindaian.

  • Kompresi format lossless: Urutan byte adalah kompresi streaming gambar (seperti yang dijelaskan dalam "Format Lossless Bitstream WebP") untuk dimensi implisit x tinggi. Yaitu, proyek ini image-stream TIDAK berisi header apa pun yang menjelaskan dimensi gambar.

    Argumentasi: Dimensi ini sudah diketahui dari sumber lain, sehingga menyimpannya lagi akan redundan dan rentan terhadap error.

    Setelah aliran gambar didekode menjadi warna Alfa, Merah, Hijau, Biru (ARGB) nilai, dengan mengikuti proses yang dijelaskan dalam format lossless spesifikasi, informasi transparansi harus diekstrak dari saluran hijau dari segi empat ARGB.

    Argumentasi: Saluran hijau diizinkan transformasi tambahan langkah-langkah 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) 'VP8 ' Bagian, menggunakan 'VP8 ' (perhatikan spasi karakter keempat yang signifikan) sebagai FourCC-nya, atau (ii) huruf 'VP8L' Potongan menggunakan 'VP8L' sebagai FourCC-nya.

Format 'VP8' dan 'VP8L' Potongan seperti dijelaskan dalam bagian Format File Sederhana (Hilang) dan Simple File Format (losssless).

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: Chunk Size byte
Profil ICC.

Potongan ini HARUS muncul sebelum data gambar.

HARUS ada paling banyak satu bagian. Jika ada lebih banyak potongan seperti itu, pembaca MUNGKIN mengabaikan semua, kecuali yang pertama. Lihat Spesifikasi ICC untuk detailnya.

Jika potongan ini tidak ada, sRGB HARUS diasumsikan.

Metadata

Metadata dapat disimpan di 'EXIF' atau 'XMP ' Potongan.

HARUS ada paling banyak satu bagian dari setiap jenis ('EXIF' dan 'XMP '). Jika ada lebih banyak potongan seperti itu, pembaca MUNGKIN mengabaikan semua kecuali yang pertama.

potongan-potongan didefinisikan sebagai berikut:

‘EXIF’ Bagian:

 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: byte Ukuran Chunk
Metadata gambar dalam format Exif.

'XMP' Bagian:

 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: byte Ukuran Chunk
Metadata gambar dalam format XMP.

Perhatikan bahwa karakter keempat dalam 'XMP' FourCC adalah ruang ASCII (0x20).

Panduan tambahan tentang penanganan metadata dapat ditemukan di "Panduan untuk Menangani Metadata" dari Metadata Working Group.

Bagian yang Tidak Diketahui

Potongan RIFF (dijelaskan di bagian Format File RIFF) yang FourCC-nya berbeda dari potongan apa pun yang dijelaskan dalam dokumen ini, dianggap sebagai potongan yang tidak diketahui.

Alasan: Mengizinkan potongan yang tidak diketahui akan memberikan ketentuan untuk ekstensi pada masa mendatang format dan juga memungkinkan penyimpanan data khusus aplikasi.

Sebuah file MUNGKIN berisi potongan yang tidak dikenal:

Pembaca HARUS mengabaikan bagian ini. Penulis HARUS mempertahankannya dalam urutan asli (kecuali jika mereka secara khusus bermaksud untuk memodifikasi potongan-potongan ini).

Perakitan Kanvas dari Bingkai

Di sini kami memberikan ringkasan tentang bagaimana pembaca HARUS menyusun kanvas dalam kasus ini gambar animasi.

Prosesnya dimulai dengan membuat kanvas menggunakan dimensi yang diberikan dalam 'VP8X' Bagian, lebar Canvas Width Minus One + 1 piksel dan tinggi Canvas Height Minus One + 1 piksel. Kolom Loop Count dari 'ANIM' Bagian mengontrol cara berkali-kali proses animasinya diulang. 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 'ANIM' Bagian atau warna yang ditentukan aplikasi.

'ANMF' Bagian berisi frame individual yang diberikan dalam urutan tampilan. Sebelum rendering setiap frame, Disposal method frame sebelumnya diterapkan.

Rendering frame yang didekode dimulai pada koordinat Kartesius (2 * Frame X, 2 * Frame Y), menggunakan sudut kiri atas kanvas sebagai titik asal. Lebar Frame Width Minus One + 1 piksel x Frame Height Minus One + 1 piksel dengan tinggi dirender ke kanvas menggunakan Blending method.

Kanvas ditampilkan selama Frame Duration milidetik. Hal ini berlanjut sampai semua frame yang diberikan oleh 'ANMF' Bagian telah ditampilkan. Iterasi loop baru adalah kemudian dimulai, atau kanvas dibiarkan dalam keadaan akhir jika semua iterasi telah selesai.

Kode semu berikut mengilustrasikan proses rendering. Notasi VP8X.field berarti kolom di 'VP8X' Bagian 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 yang dienkode dengan lossless mungkin akan 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)