Giriş
WebP, (i) görüntü verilerini kayıplı bir şekilde sıkıştırmak için VP8 anahtar çerçevesi kodlamasını veya (ii) WebP kayıpsız kodlamasını kullanan bir resim biçimidir. Bu kodlama şemaları, JPEG, GIF ve PNG gibi eski biçimlere kıyasla daha verimli olmasını sağlar. Ağ üzerinden hızlı resim aktarımı (ör. web siteleri) için optimize edilmiştir. WebP biçimi, diğer biçimlerle de özellik eşdeğerliğine (renk profili, meta veri, animasyon vb.) sahiptir. 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ı aşağıdakiler için ek destek sağlar:
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 meta verileri Exchangeable Resim Dosyası Biçimi (Exif) veya Genişletilebilir Meta Veri Platformu (XMP) biçiminde depolanabilir.
Şeffaflık: Resimlerde şeffaflık (alfa kanalı) olabilir.
Renk Profili: Bir resimde, International Color Consortium tarafından açıklandığı şekilde yerleştirilmiş bir ICC profili olabilir.
Animasyon: Bir resimde, aralarında duraklamalar olan birden fazla kare bulunabilir. Bu, resmi animasyon haline getirir.
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 |
Tek tip tür tanımlayıcısı | org.webmproject.webp |
Terminoloji ve Temel Bilgiler
Bu belgedeki "MUST" (GEREKİYOR), "MUST NOT" (GEREKMEZ), "REQUIRED" (ZORUNLU), "SHALL" (OLMALI), "SHALL NOT" (OLMAMALI), "SHOULD" (OLMALI), "SHOULD NOT" (OLMAMALI), "RECOMMENDED" (ÖNERİLİR), "NOT RECOMMENDED" (ÖNERİLMEZ), "MAY" (OLUR) ve "OPTIONAL" (İSTEĞE BAĞLI) anahtar kelimeleri, burada gösterildiği gibi yalnızca büyük harflerle göründüklerinde BCP 14 RFC 2119 RFC 8174'te açıklandığı şekilde yorumlanmalıdır.
WebP dosyası, sabit resim (yani kodlanmış bir piksel matrisi) veya animasyon içerir. İsteğe bağlı olarak şeffaflık bilgileri, renk profili ve meta veriler de içerebilir. 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.
Bu belgede kullanılan diğer terimler aşağıda verilmiştir:
- Okuyucu/Yazar
- WebP dosyalarını okuyan koda okur, bunları yazan koda ise yazar denir.
- 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 karakterli kod (FourCC), dört ASCII karakteri küçük-endian sırayla bir araya getirerek oluşturulan bir uint32 kodudur. Bu nedenle, "aaaa" (0x61616161) ve "AAAA" (0x41414141) farklı FourCCs olarak ele alınır.
- 1 tabanlı
- Değerlerin
-1
farkını sakladığı imzasız bir tam sayı alanı, örneğin, 25 değerini 24 olarak depolar. - ChunkHeader('ABCD')
- Bağımsız parçaların FourCC ve Parça Boyutu üstbilgisini tanımlamak için kullanılır. Burada "ABCD", parçanın FourCC'sidir. Bu öğenin boyutu 8 bayttır.
RIFF Dosya Biçimi
WebP dosya biçimi, RIFF (Kaynak Değişim Dosya Biçimi) belge biçimine dayanı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.
- Parça Boyutu: 32 bit (uint32)
- Bu alan, parça tanımlayıcısı veya dolgu dahil değilse parçanın bayt cinsinden boyutu.
- Parça Yükü: Parça Boyutu bayt
- Veri yükü. Blok Boyutu tek sayılıysa RIFF'e uygun olması için
0
olması gereken tek bir dolgu baytı eklenir.
Not: RIFF'te, tümü büyük harfli FourCC'lerin, herhangi bir RIFF dosya biçimi için geçerli olan standart parçalar olduğu, bir dosya biçimine özel FourCC'lerin ise tamamı küçük harfle yazılan 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. Bu nedenle, tüm dosyanın boyutu en fazla 4 GiB eksi 2 bayt olur.
- "WEBP": 32 bit
- "W", "E", "B", "P" ASCII karakterleri.
WebP dosyası, FourCC "WEBP" içeren bir RIFF üstbilgiyle BAŞLAMALIDIR. Üstbilgideki dosya boyutu, sonraki parçaların toplam boyutu artı "WEBP" FourCC için 4
bayttır. Dosya, Dosya Boyutu tarafından belirtilen verilerden sonra herhangi bir 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ı)
Görsel için kaybeden kodlama gerekiyorsa ve şeffaflık veya genişletilmiş biçim tarafından sağlanan diğer gelişmiş özellikler gerekli değilse bu düzen KULLANILMALIDIR. 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" 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('VP8 ') |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: VP8 data :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- VP8 verileri: Blok Boyutu bayt
- VP8 bit akışı verileri.
"VP8" FourCC'sindeki dördüncü karakterin ASCII boşluk (0x20) olduğunu unutmayın.
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çeve genişliğini ve yüksekliğini içerdiğini unutmayın. Zemin, tuval genişliği ve yüksekliği olarak kabul edilir.
VP8 spesifikasyonu, resmin Y'CbCr biçiminde şifresinin nasıl çözüleceğini açıklar. 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çim kullanan dosyaları desteklemeyebilir.
Resim için kaybetsiz kodlama (isteğe bağlı bir şeffaflık kanalıyla) gerekiyorsa ve genişletilmiş biçim tarafından sağlanan gelişmiş özellikler gerekmiyorsa bu düzen KULLANILMALIDIR.
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: Blok 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ği ve yüksekliğini içerdiğini unutmayın. Bu, kanvasın genişliği ve yüksekliği olarak kabul edilir.
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ı.
Renk profili içeren isteğe bağlı bir "ICCP" parçası.
Animasyon kontrol verileri içeren isteğe bağlı bir "ANIM" yığını.
Resim verileri.
Exif meta verileri içeren isteğe bağlı bir "EXIF" parçası.
XMP meta verileri içeren isteğe bağlı bir "XMP" parçası.
İsteğe bağlı olarak bilinmeyen parçaların listesi.
Hareketsiz resim için resim verileri tek bir kareden oluşur. Bu kare şunları içerir:
İsteğe bağlı bir alfa alt dilimi.
Animasyonlu resim için resim verileri birden fazla kareden oluşur. Çerçevelerle ilgili daha fazla ayrıntıyı 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.
Açıklama: Okuyucunun tüm verileri almadan önce bir resmin kodunu çözmeye başlamasına olanak tanımak 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 olacak şekilde değiştirerek avantaj elde edebilir.
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" Yığını içerip içermediğini ayarlayın.
- Alfa (L): 1 bit
- Resmin karelerinden herhangi birinin şeffaflık bilgisi ("alpha") içerip içermediğini ayarlayın.
- 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ı İYİCE 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
. - 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 spesifikasyonlara daha fazla alan eklenebilir. Bilinmeyen alanlar YOKSAYILMALIDIR.
Animasyon
Animasyonlar, "ANIM" ve "ANMF" parçaları tarafından kontrol edilir.
'ANIM' Öbeği:
Animasyonlu bir resim için bu parça, animasyonun genel parametrelerini 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ChunkHeader('ANIM') |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Background Color |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Loop Count |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- Arka Plan Rengi: 32 bit (uint32)
- Kanvasın [Mavi, Yeşil, Kırmızı, Alfa] bayt sırasına göre varsayılan arka plan rengi. 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.
Notlar:
"VP8X" parçası'ndaki Alfa işareti ayarlanmadan bırakılsa bile arka plan rengi opak olmayan bir alfa değeri İÇERİEBİLİR.
İ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 bu amaçla KULLANILABİLİR.
- Döngü Sayısı: 16 bit (uint16)
- Animasyonun döngü sayısı.
0
ise bu sonsuza kadar anlamına gelir.
"VP8X" paketindeki Animasyon işareti ayarlanmışsa bu paket GÖSTERİLMELİDİR. 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 ayarlanmamışsa bu parça BULUNMAMALIDIR.
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öşesinin X koordinatı
Frame X * 2
'dir. - Çerçeve Y: 24 bit (uint24)
- Çerçevenin sol üst köşesinin Y koordinatı
Frame Y * 2
. - Çerçeve Genişliği Eksi Bir: 24 bit (uint24)
- Çerçevenin 1 tabanlı genişliği.
Çerçeve genişliği:
1 + Frame Width Minus One
. - Bir Eksili Kare Yüksekliği: 24 bit (uint24)
- Çerçevenin 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). Kare Süresi değerinin 0 (ve genellikle <= 10) olarak yorumlanmasının uygulama tarafından tanımlandığını unutmayın. Birçok araç ve tarayıcı, GIF'ye benzer bir minimum süre atar.
- 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 karıştırma kullanır. Önceki kareyi kaldırdıktan sonra, alfa harmanlama yöntemini kullanarak mevcut kareyi tuvalde oluşturun (aşağıya bakın). Mevcut karenin alfa kanalı yoksa alfa değerinin 255 olduğu varsayılarak 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.
- Bertaraf 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 mevcut karenin kapladığı dikdörtgeni, 'ANIM' parçasında belirtilen arka plan rengiyle doldurun.
Notlar:
Çerçevenin atılması yalnızca çerçeve dikdörtgeni için geçerlidir. Dikdörtgen, X Çerçevesi, Y Çerçeve, kare genişliği ve kare yüksekliği ile tanımlanır. Tüm kanvası kaplayabilir veya kaplamayamayabilir.
Alfa harmanlaması:
R, G, B ve A kanallarının her birinin 8 bit olduğu ve RGB kanallarının alfa ile ön çarpılmadığı göz önüne alındığında, "dst"yi "src" ile karıştırma formülü şudur:
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 karıştırma işlemi, resmin renk profili dikkate alınarak doğrusal renk alanında yapılmalıdır. Renk profili yoksa standart RGB (sRGB) olduğu varsayılır. (sRGB'nin yaklaşık 2,2 olan bir gama değeri 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ı.
Kare için bir bit akış alt yığını.
İsteğe bağlı olarak bilinmeyen parçaların listesi.
Not: Kare Verileri olan "ANMF" yükü, RIFF dosya biçiminde açıklandığı gibi ayrı dolgulu parçalardan oluşur.
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ı İYİCE yoksaymalıdır.- Ön işleme (P): 2 bit
Bu bilgilendirici bitler, sıkıştırma sırasında gerçekleştirilen ön işlemeyi bildirmek için kullanılır. Kod çözücü, örneğin değerleri dithering yapmak veya görüntülemeden önce gradyanları yumuşatmak için bu bilgileri kullanabilir.
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öntem: tahminci = B- Yöntem
3
: predictor = clip(A + B - C)
Burada clip(v)
şu değerlere eşit olabilir:
- 0 if v < 0,
- v > 255 ise 255 veya
- v aksi durumda
Nihai değer, sıkıştırılmamış değer X
öngörücüye eklenerek ve [256..511] aralığını [0..255] aralığına sığdırmak için mod-256 aritmetiği kullanılarak türetilir:
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ğer, tahmin değeri olarak 0'ı kullanır. Diğer durumlarda:
- Yatay veya gradyan filtreleme yöntemleri için (0, y) konumundaki en soldaki pikseller, hemen üstteki (0, y-1) konumu 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ılır.
- Alfa bit akışı: Blok Boyutu bayt -
1
Kodlanmış alfa bit akışı.
Bu isteğe bağlı parça, bu çerçeve için kodlanmış alfa verileri içerir. "VP8L" Yığını içeren bir çerçeve, 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ırma yöntemi "0" olduğunda sıkıştırılmamış ham veri olarak veya sıkıştırma yöntemi "1" olduğunda kayıpsız biçim kullanılarak sıkıştırılmış olarak depolanır.
Ham veri: Bu, uzunluk = genişlik * yükseklik şeklinde bir bayt dizisinden oluşur ve tarama sırasındaki 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 bu resim akışı, 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ış dilimi, FourCC olarak "VP8" (dördüncü karakterdeki boşluğa dikkat edin) kullanan (i) bir "VP8" dilimi veya veya FourCC olarak "VP8L" kullanan (ii) bir "VP8L" dilimi olabilir.
"VP8" ve "VP8L" parçalarının biçimleri sırasıyla Basit Dosya Biçimi (Kayıplı) ve Basit Dosya Biçimi (Kayıpsız) bölümlerinde açıklandığı gibidir.
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: Blok 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 hariç hepsini 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" veya "XMP" parçalarında depolanabilir.
Her türden en fazla bir parça ("EXIF" ve "XMP") OLMALIDIR. Bu türden daha fazla parça varsa okuyucular ilk parça dışındaki tümünü yoksayabilir.
Parçalar aşağıdaki şekilde tanımlanır:
"EXIF" parçası:
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" parçası:
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: Blok Boyutu bayt
- XMP biçiminde resim meta verileri.
"XMP" FourCC'sindeki dördüncü karakterin ASCII boşluk (0x20) olduğunu unutmayın.
Meta verilerin işlenmesi hakkında daha fazla bilgi, Meta Veri Çalışma Grubu'nun "Meta Verileri İşleme Kuralları" bölümünde bulunabilir.
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.
Mantık: Bilinmeyen parçalara izin vermek, biçimin gelecekte genişletilmesine olanak tanır ve uygulamaya özgü verilerin depolanmasına da izin verir.
Bir dosya bilinmeyen parçalar İÇEREBİLİR:
- Genişletilmiş WebP dosyası başlığında açıklandığı gibi dosyanın sonunda veya
- Animasyon bölümünde açıklandığı gibi "ANMF" Topuklarının sonuna ekleyin.
Okuyucular bu parçaları YOKSAYMALIDIR. Yazarlar, bunları orijinal sıralarında KORUMALIDIR (bu parçaları özellikle değiştirmeyi amaçlamıyorlarsa).
Ç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" yığınındaki Loop Count
alanı, animasyon işleminin kaç kez tekrarlandığı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ü yinelemesinin başında tuval, "ANIM" yığınındaki arka plan rengi veya uygulama tanımlı bir renk kullanılarak doldurulur.
"ANMF" yığınları, görüntülenme sırasına göre verilen bağımsız çerçeveler 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üksekliğinde bir resim, Blending method
kullanılarak tuvale oluşturulur.
Tuval Frame Duration
milisaniye boyunca gösterilir. Bu işlem, "ANMF" Büyükleri tarafından verilen tüm kareler görüntülenene kadar devam eder. Ardından yeni bir döngü iterasyonu başlatılır veya tüm iterasyonlar tamamlandıysa tuval nihai durumunda bırakılır.
Aşağıdaki sözde kod, oluşturma sürecini göstermektedir. VP8X.field gösterimi, "VP8X" parçasındaki aynı açıklamaya sahip alanı ifade eder.
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 şu şekilde görünebilir:
RIFF/WEBP
+- VP8X (descriptions of features used)
+- VP8L (lossless bitstream)
+- XYZW (unknown chunk)
ICC profili ve XMP meta verisi içeren kayıpsız bir resim aşağıdaki gibi görünebilir:
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)