Giriş
WebP, (i) VP8 anahtar çerçevesi kodlamasını kullanarak veya (ii) WebP kayıpsız kodlamasını kullanarak resim verilerini sıkıştırabilir. Bu kodlama şemaları, JPEG, Flash veya Drive gibi eski biçimlerden GIF ve PNG. Ağ üzerinden hızlı görüntü aktarımı ( örneğin web siteleri için). WebP biçiminde özellik denkliği (renk profili, meta veriler, animasyon vb.) diğer biçimlerle de uyumlu şekilde çalışır. Bu belgede, WebP dosyasının yapısı açıklanmaktadır.
WebP kapsayıcısı (yani WebP için RIFF kapsayıcısı), WebP'nin temel kullanım alanının (yani VP8 anahtar karesi olarak kodlanmış tek bir resim içeren bir dosya) ötesinde özellik desteği sağlar. WebP kapsayıcısı, şunlar için destek:
Kayıpsız sıkıştırma: WebP Kayıpsız Biçimi kullanılarak resimler kayıpsız sıkıştırılabilir.
Meta veri: Bir resmin, Değiştirilebilir Resim Dosyasında depolanan meta verileri olabilir Biçim (Exif) veya Genişletilebilir Meta Veri Platformu (XMP) biçimi.
Şeffaflık: Resimlerde şeffaflık (alfa kanalı) olabilir.
Renk Profili: Bir resimde, Uluslararası Renk Konsorsiyumu tarafından açıklandığı şekilde yerleştirilmiş bir ICC profili olabilir.
Animasyon: Bir resimde, aralarında duraklar olan birden çok kare olabilir. animasyona dönüştürüyorum.
Adlandırma
WebP kapsayıcısından bahsederken aşağıdaki türlerin kullanılması ÖNERİLİR:
Kapsayıcı Biçimi Adı | WebP |
Dosya Adı Uzantısı | .webp |
MIME türü | image/webp |
Tekdüzen Tür Tanımlayıcı | org.webmproject.webp |
Terminoloji ve Temel Bilgiler
Şu anahtar kelimeler "ZORUNLU", "ZORUNLU OLMAMALIDIR", "GEREKLİ", "YAPILMAYACAK", "YA ALINMAMALIDIR", "KULLANILMAMALIDIR", "ÖNERİLİR", "ÖNERİLMEZ", "OLABİLİR" ve "İSTEĞE BAĞLI" bu belge, BCP 14 RFC 2119 RFC 8174'te açıklandığı gibi yorumlanacaktır burada gösterildiği gibi, yalnızca ne zaman ve ne zaman büyük harflerle yazılmış olarak görünürler.
Bir WebP dosyası hareketsiz bir resim (yani, kodlanmış pikseller matrisi) içerir animasyon içerir. İsteğe bağlı olarak, şeffaflık da içerebilir. bilgileri, renk profilini ve meta verileri içerir. Piksel matrisine resmin kanvası denir.
RFC 1166'da açıklandığı gibi, parça şemalarındaki bit numaralandırması en önemli bit ("MSB 0") için 0
ile başlar.
Aşağıda, bu belgede kullanılan ek terimler verilmiştir:
- Okuyucu/Yazar
- WebP dosyalarını okuyan kod okuyucu olarak adlandırılır. WebP dosyalarını okuyan kod ise kullanıcı yazar olarak adlandırılır.
- uint16
- 16 bit, küçük uçlu, işaretsiz tam sayı.
- uint24
- 24 bit, küçük son, işaretsiz bir tam sayı.
- uint32
- 32 bit, küçük endian, imzalanmamış tam sayı.
- FourCC
- Dört karakterlik kod (FourCC), dört karakterin birleştirilmesiyle oluşturulmuş bir uint32'dir. Küçük endian sırasına göre ASCII karakterler. Bu, "aaaa" (0x61616161) ve "AAAA" (0x41414141) değerlerinin farklı FourCC olarak değerlendirildiği anlamına gelir.
- 1 tabanlı
-1
ile uzaklık değerlerinin depolandığı imzasız bir tam sayı alanı; örneğin, alanı, 25 değerini 24 olarak saklar.- ChunkHeader('ABCD')
- Bağımsız parçaların FourCC ve Chunk Size başlığını tanımlamak için kullanılır. "ABCD" parçanın FourCC'si olur. Bu öğenin boyutu 8 bayttır.
RIFF Dosya Biçimi
WebP dosya biçimi, RIFF (Resource Interchange File Format) doküman biçimini temel alır.
RIFF dosyasının temel öğesi parçadır. Şunları içerir:
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 :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- Chunk FourCC: 32 bit
- Blok tanımlama için kullanılan dört karakterli ASCII kodu.
- Yığın Boyutu: 32 bit (uint32)
- Bu alan, parça tanımlayıcısı veya dolgu dahil değilse parçanın bayt cinsinden boyutu.
- Yığın Yükü: Parça Boyutu bayt
- Veri yükü. Parça Boyutu tek ise tek bir dolgu baytı.
RIFF ile uyum sağlamak için
0
olmalıdır -- eklenir.
Not: RIFF'te, tamamı büyük harf olan FourCC'lerin tüm RIFF dosya biçimleri için geçerli olan standart parçalar, bir dosya biçimine özgü FourCC'lerin ise tümü küçük harfli olacak şekilde bir kural vardır. WebP bu kurala uymaz.
WebP Dosya Başlığı
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
- "R", "I", "F", "F" ASCII karakterleri.
- Dosya Boyutu: 32 bit (uint32)
- 8 ofsetinden itibaren dosyanın bayt cinsinden boyutu. Bu alanın maksimum değeri 2^32 eksi 10 bayttır. Dolayısıyla, dosyanın tamamının boyutu en fazla 4 GiB eksi 2 bayttır.
- "WEBP": 32 bit
- "W", "E", "B", "P" ASCII karakterleri.
WebP dosyaları, FourCC "WEBP" içeren bir RIFF üstbilgiyle BAŞLAMALIDIR. Dosya boyutu
içinde, takip eden parçaların toplam boyutu artı 4
bayttır.
'WEBP' FourCC'ye gidin. Dosya, Dosya Boyutu ile belirtilen verilerden sonra veri İÇERMEMELİDİR. Okuyucular, son verileri yok sayarak bu tür dosyaları ayrıştırabilir. Her bir parçanın boyutu çift olduğundan RIFF başlığı tarafından verilen boyut da çifttir. Her bir parçanın içeriği aşağıdaki bölümlerde açıklanmıştır.
Basit Dosya Biçimi (Kayıplı)
Bu düzen, resim kayıp kodlaması gerektiriyorsa ve şeffaflık veya genişletilmiş biçimde sağlanan diğer gelişmiş özellikler gerektirir. Bu düzene sahip dosyalar daha küçüktür ve eski yazılımlar tarafından desteklenir.
Basit WebP (kaybedilen) dosya biçimi:
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" Paketi:
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 :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- VP8 verileri: Parça Boyutu bayt
- VP8 bit akışı verileri.
"VP8" içindeki dördüncü karakterin FourCC, bir ASCII alanıdır (0x20).
VP8 bit akış biçimi spesifikasyonu, VP8 Veri Biçimi ve Kod Çözme Kılavuzu'nda açıklanmaktadır. VP8 çerçeve başlığının VP8 çerçevesini içerdiğini unutmayın ve yüksekliği belirtmelisiniz. Bu, kanvasın genişliği ve yüksekliği olarak kabul edilir.
VP8 spesifikasyonunda, resmin Y'CbCr biçiminde nasıl kodunun çözüleceği açıklanmaktadır. RGB'ye dönüştürmek için Öneri BT.601 KULLANILMALIDIR. Uygulamalar başka bir dönüştürme yöntemi kullanabilir ancak görsel sonuçlar kod çözücüler arasında farklılık gösterebilir.
Basit Dosya Biçimi (Kayıpsız)
Not: Eski okuyucular, kayıpsız biçimi kullanan dosyaları desteklemeyebilir.
Bu düzen, resim kayıpsız kodlama ( isteğe bağlı şeffaflık kanalı) ve gelişmiş özelliklerin sağlanması gerekmez. genişletilmiş biçime göre.
Basit WebP (kaybetsiz) dosya biçimi:
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' Bloku:
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 :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- VP8L verileri: Parça Boyutu bayt
- VP8L bit akışı verileri.
VP8L bit akışının mevcut spesifikasyonunu WebP Lossless Bitstream Format (WebP Lossless Bitstream Format) sayfasında bulabilirsiniz. VP8L başlığının, VP8L resim genişliğini ve yüksekliğini içerdiğini unutmayın. Bunun, genişliği 1000 dolar olduğu varsayılır ve kanvasın yüksekliğini ayarlayın.
Genişletilmiş Dosya Biçimi
Not: Eski okuyucular, genişletilmiş biçimi kullanan dosyaları desteklemeyebilir.
Genişletilmiş biçim dosyası şunları içerir:
Dosyada kullanılan özelliklerle ilgili bilgiler içeren bir "VP8X" parçası.
İsteğe bağlı bir "ICCP" Renk profiline sahip yığın.
Animasyon kontrol verilerini içeren isteğe bağlı bir "ANIM" parçası.
Resim verileri.
Exif meta verileri içeren isteğe bağlı bir "EXIF" parçası.
İsteğe bağlı bir "XMP " XMP meta verileriyle yığın.
İsteğe bağlı bir bilinmeyen parçalar listesi.
Hareketsiz bir resim için resim verileri tek bir kareden oluşur. Bu kare en fazla:
İsteğe bağlı bir alfa alt yığını.
Animasyonlu resim için resim verileri birden fazla kareden oluşur. Karelerle ilgili daha fazla bilgiyi Animasyon bölümünde bulabilirsiniz.
Yeniden oluşturma ve renk düzeltme için gerekli tüm parçalar (yani "VP8X", "ICCP", "ANIM", "ANMF", "ALPH", "VP8" ve "VP8L") daha önce açıklanan sırada GÖSTERİLMELİDİR. Yeniden oluşturma ve renk düzeltme için gerekli parçalar sıra dışı olduğunda okuyucular BAŞARISIZ OLMALIDIR.
Meta veriler ve bilinmeyen parçalar sıra dışı görünebilir.
Mantık: Okuyucunun tüm verileri almadan önce bir resmin kodunu çözmeye başlamasına izin vermek için yeniden oluşturma için gerekli parçalar dosyada ilk olarak görünmelidir. Bir uygulama, meta verilerin ve özel parçaların sırasını uygulamaya uygun şekilde değiştirerek avantaj sağlayabilir.
Genişletilmiş WebP dosya başlığı:
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 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- Ayrılmış (Rsv): 2 bit
0
olmalıdır. Okuyucular bu alanı Yoksaymalıdır.- ICC profili (I): 1 bit
- Dosyanın "ICCP" içerip içermediğini ayarlayın Yığın.
- Alfa (L): 1 bit
- Resmin çerçevelerinden herhangi birinin şeffaflık bilgisi içerip içermediğini ayarlayın ("alfa")
- Exif meta verileri (E): 1 bit
- Dosyanın EXIF meta verileri içerip içermediğini ayarlayın.
- XMP meta verileri (X): 1 bit
- Dosyanın XMP meta verileri içerip içermediğini ayarlayın.
- Animasyon (A): 1 bit
- Bunun animasyonlu bir resim olup olmadığını ayarlayın. Animasyonu kontrol etmek için "ANIM" ve "ANMF" parçalarındaki veriler kullanılmalıdır.
- Ayrılmış (R): 1 bit
0
olmalıdır. Okuyucular bu alanı Yoksaymalıdır.- Ayrılmış: 24 bit
0
OLMALIDIR. Okuyucular bu alanı Yoksaymalıdır.- Tuval Genişliği Eksi Bir: 24 bit
- Kanvasın piksel cinsinden 1 tabanlı genişliği.
Gerçek kanvas genişliği
1 + Canvas Width Minus One
'tür. - Tuval Yüksekliği Eksi Bir: 24 bit
- Kanvasın piksel cinsinden 1 tabanlı yüksekliği.
Gerçek tuval yüksekliği
1 + Canvas Height Minus One
.
Tuval Genişliği ve Kanvas Yüksekliği değerleri en fazla 2^32 - 1
OLMALIDIR.
Gelecekteki spesifikasyonlar daha fazla alan ekleyebilir. Bilinmeyen alanlar yok sayılmalıdır.
Animasyon
Animasyonlar, "ANIM" ve "ANMF" parçaları tarafından kontrol edilir.
'ANIM' Öbeği:
Bu parça, animasyonlu bir resim için animasyon ekler.
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 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- Arka Plan Rengi: 32 bit (uint32)
- Tuvalin varsayılan arka plan rengi [Mavi, Yeşil, Kırmızı, Alfa] bayt sırasına göre. Bu renk, kanvastaki karelerin etrafındaki kullanılmayan alanı ve ilk karenin şeffaf piksellerini doldurmak için KULLANILABİLİR.
Arka plan rengi, İmha yöntemi
1
olduğunda da kullanılır.
Not:
Arka plan rengi opak olmayan bir alfa değeri içerebilir. 'VP8X'teki Alpha işareti Yığın ayarlanmamış.
İzleyici uygulamaları, arka plan rengi değerini ipucu olarak DEĞERLENDİRMELİDİR ve bu değeri kullanması gerekmez.
Tuval, her döngünün başında temizlenir. Arka plan rengi nasıl kullanılır?
- Döngü Sayısı: 16 bit (uint16)
- Animasyonun kaç kez döngü oluşturacağı.
0
ise sonsuz anlamına gelir.
"VP8X"te Animasyon işareti varsa bu parçanın görünmesi ZORUNLUDUR Yığın ayarlandı. Animasyon işareti ayarlanmamışsa ve bu parça mevcutsa yoksayılmalıdır.
'ANMF' Öbeği:
Animasyonlu resimlerde bu parça, tek bir kareyle ilgili bilgileri içerir. Animasyon işareti ayarlanmazsa bu parçanın mevcut olmaması GEREKİR.
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 :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- X çerçevesi: 24 bit (uint24)
- Çerçevenin sol üst köşesindeki X koordinatı
Frame X * 2
şeklindedir. - Y çerçevesi: 24 bit (uint24)
- Çerçevenin sol üst köşesinin Y koordinatı
Frame Y * 2
'tır. - Çerçeve Genişliği Eksi Bir: 24 bit (uint24)
- Çerçevenin 1 tabanlı genişliğidir.
Çerçeve genişliği:
1 + Frame Width Minus One
. - Bir Eksili Kare Yüksekliği: 24 bit (uint24)
- Karenin 1 tabanlı yüksekliği.
Kare yüksekliği
1 + Frame Height Minus One
. - Kare süresi: 24 bit (uint24)
- Sonraki kareyi görüntülemeden önce beklenecek süre (1 milisaniye cinsinden). 0 (ve genellikle <= 10) olan kare süresinin yorumunun uygulama tarafından tanımlandığını unutmayın. Birçok araç ve tarayıcı, belirli bir hedefe süresi GIF'tekine benzer.
- Ayrılmış: 6 bit
0
olmalıdır. Okuyucular bu alanı Yoksaymalıdır.- Harmanlama yöntemi (B): 1 bit
Mevcut karenin şeffaf piksellerinin önceki kanvasın ilgili pikselleriyle nasıl harmanlanacağını belirtir:
0
: Alfa harmanlamasını kullanın. Önceki kareyi attıktan sonra, alfa karıştırmayı kullanarak tuvaldeki geçerli kareyi seçin (aşağıya bakın). Mevcut karenin alfa kanalı yoksa alfa değerinin 255 olduğu varsayılır ve dikdörtgen etkili bir şekilde değiştirilir.1
: Karıştırmayın. Önceki kareyi kaldırdıktan sonra, geçerli karenin kapladığı dikdörtgenin üzerine yazarak mevcut kareyi tuvalde oluşturun.
- Atma yöntemi (D): 1 bit
Mevcut karenin tuvalde gösterildikten sonra (sonraki kare oluşturulmadan önce) nasıl işleneceğini belirtir:
0
: Atmayın. Kanvası olduğu gibi bırakın.1
: Arka plan rengine atar. Tuvaldeki dikdörtgeni, mevcut karenin kapladığı alanı 'ANIM' parçasında belirtilen arka plan rengiyle doldurun.
Notlar:
Kare kaldırma işlemi yalnızca kare dikdörtgeni için geçerlidir. Yani kare X, kare Y, kare genişliği ve kare yüksekliği ile tanımlanan dikdörtgen. Zeminin tamamını kaplayabilir veya kapmayabilir.
Alfa karıştırma:
R, G, B ve A kanallarının her biri 8 bit ve RGB kanalların, harmanlama formülü olan alfa ile önceden çarpılmaz "dst" yerine şununla eşleşir:
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
Alfa harmanlama işlemi, resmin renk profili dikkate alınarak doğrusal renk uzayında YAPILMALIDIR. Renk profili standart RGB (sRGB) olduğu varsayılır. (sRGB'nin yaklaşık 2,2 olan bir gama nedeniyle doğrusallaştırılması gerektiğini unutmayın.)
- Çerçeve Verileri: Blok Boyutu bayt -
16
Şunları içerir:
Çerçeve için isteğe bağlı bir alfa alt yığını.
Çerçeve için bir bit akışı alt parçası.
İsteğe bağlı bir bilinmeyen parçalar listesi.
Not: "ANMF" Çerçeve Verileri, tek bir değerden RIFF dosya biçiminde açıklandığı şekilde dolgulu parçalar.
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... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- Ayrılmış (Rsv): 2 bit
0
olmalıdır. Okuyucular bu alanı Yoksaymalıdır.- Ön işleme (P): 2 bit
Bu bilgilendirici bitler, sıkıştırma sırasında yapılan ön işleme işlemini belirtmek için kullanılır. Kod çözücü bu bilgiyi kullanarak değerini değiştirebilirsiniz.
0
: Ön işleme yok.1
: Seviye azaltma.
Kod çözücülerin bu bilgileri belirli bir şekilde kullanması gerekmez.
- Filtreleme yöntemi (F): 2 bit
Kullanılan filtreleme yöntemleri aşağıda açıklanmıştır:
0
: Yok.1
: Yatay filtre.2
: Dikey filtre.3
: Gradyan filtresi.
Her piksel için filtreleme, aşağıdaki hesaplamalar kullanılarak gerçekleştirilir.
Geçerli X
konumunu çevreleyen alfa değerlerinin şu şekilde etiketlendiğini varsayalım:
C | B |
---+---+
A | X |
X
konumunda alfa değerini hesaplamaya çalışırız. İlk olarak, filtreleme yöntemine bağlı olarak bir tahmin yapılır:
0
yöntemi: predictor = 0- Yöntem
1
: predictor = A 2
yöntemi: predictor = B- Yöntem
3
: predictor = clip(A + B - C)
clip(v)
şuna eşittir:
- 0 if v < 0,
- v > ise 255 255 veya
- v, aksi takdirde
Nihai değer, sıkıştırılmış X
değerinin
tahmin edici ve [256..511] aralığını sarmak için modülo-256 aritmetiğini kullanma
[0..255] olan içine:
alpha = (predictor + X) % 256
En soldaki ve en üstteki piksel konumları için özel durumlar vardır. Örneğin, (0, 0) konumundaki sol üst değerde tahmin değeri olarak 0 kullanılır. Diğer durumlarda:
- Yatay veya gradyan filtreleme yöntemlerinde, en soldaki pikseller konum (0, y), hemen üzerindeki konum (0, y-1) kullanılarak tahmin edilir.
- Dikey veya gradyan filtreleme yöntemleri için (x, 0) konumundaki en üstteki pikseller, soldaki (x-1, 0) konumu kullanılarak tahmin edilir.
- Sıkıştırma yöntemi (C): 2 bit
Kullanılan sıkıştırma yöntemi:
0
: Sıkıştırma yok.1
: WebP kayıpsız biçimi kullanılarak sıkıştırılmıştır.
- Alfa bit akışı: Parça Boyutu baytları -
1
Kodlanmış alfa bit akışı.
Bu isteğe bağlı parça, bu çerçeve için kodlanmış alfa verileri içerir. Çerçeve 'VP8L' içeren Yığın, bu parçayı İÇERMEMELİDİR.
Açıklama: Şeffaflık bilgileri zaten "VP8L" parçasının bir parçasıdır.
Alfa kanalı verileri, sıkıştırılmamış ham veri olarak saklanır ( sıkıştırma yöntemi '0'dır) veya kayıpsız biçim kullanılarak sıkıştırılır (sıkıştırma yöntemi "1" olduğunda).
Ham veri: Bu, bir bayt uzunluğundan oluşur = genişlik * yükseklik, tarama düzeninde tüm 8 bit şeffaflık değerlerini içerir.
Kayıpsız biçim sıkıştırması: Bayt dizisi, genişlik x yükseklik boyutlarında gizli bir sıkıştırılmış resim akışıdır ("WebP Kayıpsız Bit Akış Biçimi" bölümünde açıklandığı gibi). Yani, image-stream, resim boyutlarını açıklayan herhangi bir başlık İÇERMEZ.
Mantık: Boyutlar zaten diğer kaynaklardan bilindiği için tekrar depolanması gereksiz ve hataya açık olur.
Resim akışının kodu, kayıpsız biçim spesifikasyonunda açıklanan işleme göre Alfa, Kırmızı, Yeşil, Mavi (ARGB) renk değerlerine dönüştürüldükten sonra şeffaflık bilgileri, ARGB dörtlüsünün yeşil kanalından ayıklanmalıdır.
Açıklama: Diğer kanalların aksine, yeşil kanalda sıkıştırmayı iyileştirebilecek ek dönüşüm adımlarına izin verilir.
Bit akışı (VP8/VP8L)
Bu parça, tek bir kare için sıkıştırılmış bit akışı verileri içerir.
Bit akışı yığını, (i) bir "VP8" olabilir Yığın, "VP8" kullanılarak ( önemli dördüncü karakter boşluğu) FourCC olarak veya (ii) "VP8L" olarak Yığın, "VP8L" kullanılıyor olarak da düşünebilirsiniz.
"VP8" biçimleri ve "VP8L" Yığınlar, bölümler halinde açıklandığı gibi Basit Dosya Biçimi (Kayıp) ve Basit Dosya Biçimi (Kayıpsız) seçeneklerini belirleyin.
Renk Profili
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 :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- Renk Profili: Parça Boyutu bayt
- ICC profili
Bu parça, resim verilerinden ÖNCE gösterilmelidir.
Böyle bir parçanın en fazla bir tane olması ZORUNLUDUR. Bu tür daha fazla parça varsa okuyucular ilk parça dışındaki tümünü yoksayabilir. Ayrıntılar için ICC Spesifikasyonu'na bakın.
Bu parça mevcut değilse sRGB'nin üstlenilmesi GEREKİR.
Meta veri
Meta veriler "EXIF" biçiminde depolanabilir veya "XMP" Topuklar.
Her türde en fazla bir parça ('EXIF' ve 'XMP') OLMALIDIR. Varsa okuyucular ilki hariç tümünü yok sayabilir.
Parçalar aşağıdaki şekilde tanımlanır:
"EXIF" Yığın:
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 :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- Exif Meta Verileri: Blok Boyutu bayt
- Exif biçiminde resim meta verileri.
"XMP" Yığın:
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 :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- XMP Meta Verileri: Parça Boyutu baytları
- XMP biçiminde resim meta verileri.
"XMP" FourCC'sindeki dördüncü karakterin ASCII boşluk (0x20) olduğunu unutmayın.
Meta verileri işleme hakkında daha fazla bilgiyi Meta Veri Çalışma Grubu'nun "Meta Verileri İşleme Yönergeleri" bölümünde bulabilirsiniz.
Bilinmeyen Parçalar
FourCC'si bu dokümanda açıklanan parçalardan farklı olan RIFF parçaları (RIFF Dosya Biçimi bölümünde açıklanmıştır), bilinmeyen parça olarak kabul edilir.
Gerekçe: Bilinmeyen parçalara izin verildiğinde gelecekteki uzatmalar için bir temel sağlanır saklamasına izin verir ve uygulamaya özel verilerin depolanmasına olanak tanır.
Dosyalar bilinmeyen parçalar İÇERİEBİLİR:
- dosyanın sonuna ekleyin, Genişletilmiş WebP dosyasında açıklandığı gibi başlık bölümü veya
- 'ANMF' dosyasının sonunda Parçalar, Animasyon bölümü.
Okuyucular bu bölümleri Yoksaymalıdır. Yazarlar, bu parçaları orijinal sıralarında muhafaza ETMELİDİR (özellikle bu parçaları değiştirmeyi amaçlamıyorsa).
Çerçevelerden Tuval Montajı
Burada, okuyucunun animasyonlu resim söz konusu olduğunda kanvası nasıl oluşturması gerektiğine dair genel bir bakış sunulmaktadır.
İşlem, "VP8X" parçasında belirtilen boyutları (Canvas Width Minus One + 1
piksel genişliğinde ve Canvas Height Minus
One + 1
piksel yüksekliğinde) kullanarak bir tuval oluşturmakla başlar. "ANIM" parçasındaki Loop Count
alanı, animasyon sürecinin kaç kez tekrarlanacağını kontrol eder. Bu değer, sıfır olmayan Loop Count
değerleri için Loop Count - 1
veya Loop Count
sıfır ise sonsuzdur.
Her döngü iterasyonunun başında tuval, "ANIM" parçasındaki arka plan rengi veya uygulama tanımlı bir renk kullanılarak doldurulur.
"ANMF" parçaları, görüntüleme sırasına göre verilen tek tek kareleri içerir. Her kare oluşturulmadan önce önceki karenin Disposal method
değeri uygulanır.
Kodu çözülmüş karenin oluşturulması, tuvalin sol üst köşesi orijin olarak kullanılarak Kartezyen koordinatlardan (2 *
Frame X
, 2 * Frame Y
) başlar.
Frame Width Minus One + 1
piksel genişliğinde ve Frame Height Minus One + 1
piksel
yüksek değerler tuvalde Blending method
kullanılarak oluşturulur.
Tuval Frame Duration
milisaniye boyunca gösterilir. Bu işlem, "ANMF" parçaları tarafından verilen tüm kareler görüntülenene kadar devam eder. Yeni bir döngü yinelemesi
tüm yinelemeler bu şekilde uygulanmışsa zemin son
tamamlandı.
Aşağıdaki sözde kod, oluşturma işlemini göstermektedir. Gösterim VP8X.field, "VP8X" içindeki alanı ifade eder Aynı açıklamaya sahip yığın.
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
Örnek dosya düzenleri
Alfa içeren kayıplı kodlanmış bir resim aşağıdaki gibi görünebilir:
RIFF/WEBP
+- VP8X (descriptions of features used)
+- ALPH (alpha bitstream)
+- VP8 (bitstream)
Kayıpsız kodlanmış bir resim aşağıdaki gibi görünebilir:
RIFF/WEBP
+- VP8X (descriptions of features used)
+- VP8L (lossless bitstream)
+- XYZW (unknown chunk)
ICC profiline ve XMP meta verilerine sahip kayıpsız bir resim, şöyle görünür:
RIFF/WEBP
+- VP8X (descriptions of features used)
+- ICCP (color profile)
+- VP8L (lossless bitstream)
+- XMP (metadata)
Exif meta verisi içeren animasyonlu bir resim aşağıdaki gibi görünebilir:
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)