WebP Kapsayıcı Özelliği

Giriş

WebP, (i) resim verilerini kayıplı bir şekilde sıkıştırmak için VP8 anahtar kare kodlamasını veya (ii) WebP kayıpsız kodlamasını kullanan bir resim biçimidir. Bu kodlama şemaları, dosyayı JPEG, GIF ve PNG gibi eski biçimlerden daha verimli hale getirmelidir. Ağ üzerinden hızlı görüntü aktarımı için optimize edilmiştir (örneğin, web siteleri için). WebP biçimi, diğer biçimlerle de özellik benzerliğ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 (VP8 anahtar çerçevesi olarak kodlanmış tek bir resim içeren dosya) üzerinde ve bunun üzerinde özellik desteğine izin verir. WebP kapsayıcısı, aşağıdakiler için ek destek sağlar:

  • Kayıpsız Sıkıştırma: Bir resim, WebP Kayıpsız Biçimi kullanılarak kayıpsız bir şekilde sıkıştırılabilir.

  • Meta veri: Bir görüntünün meta verileri, Değiştirilebilir Resim Dosyası Biçimi (Exif) veya Genişletilebilir Meta Veri Platformu (XMP) biçiminde olabilir.

  • Şeffaflık: Bir resmin şeffaflığı, yani alfa kanalı olabilir.

  • Renk Profili: Bir resmin, Uluslararası Renk Konsorsiyumu tarafından açıklandığı gibi yerleştirilmiş bir ICC profili olabilir.

  • Animasyon: Bir resimde, aralarında duraklamaların bulunduğu birden çok kare olabilir ve bu durumda resim animasyon haline gelir.

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üresim/webp
Tek Tip Tür Tanımlayıcıorg.webmproject.webp

Terminoloji ve Temel Bilgiler

Bu belgedeki "ZORUNLUDUR", "GEREKLİ", "GEREKLİ", "SHALL", "SHALL NOT", "GEREKLİ", ""ÖNERİLMEZ", "ÖNERİLMEZ", "MAYIS" ve "İSTEĞE BAĞLI" anahtar kelimeleri BCP 14 RFC 21174 olarak burada gösterildiği için ve sadece büyük harf RFC 21174 olarak gösterilirken

Bir WebP dosyası, hareketsiz bir resim (yani kodlanmış piksel matrisi) veya bir animasyon içerir. İsteğe bağlı olarak, şeffaflık bilgisi, renk profili ve meta verileri de içerebilir. Piksel matrisine resmin tuvali deriz.

Parça diyagramlarında bit numaralandırması, RFC 1166'da açıklandığı gibi en önemli bit için (MSB 0') 0 değerinden başlar.

Bu belgede kullanılan ek terimleri aşağıda bulabilirsiniz:

Okuyucu/Yazar
WebP dosyalarını okuyan koda okuyucu, bunları yazan kod ise yazar olarak adlandırılır.
uint16
16 bit, küçük uçlu, imzasız tam sayı.
uint24
24 bit, küçük uçlu, imzasız tam sayı.
uint32
32 bit, küçük uçlu, imzasız tam sayı.
FourCC
Dört karakterden oluşan kod (FourCC), dört ASCII karakterinin uint32 şeklinde birleştirilmesiyle oluşturulan bir uint32 kodudur. Yani "aaaa" (0x61616161) ve "AAAA" (0x41414141), farklı FourCCs'ler olarak işlenir.
1 tabanlı
Değerleri -1 göreli olarak depolayan imzalanmamış bir tam sayı alanı. Örneğin, böyle bir alan 25 değerini 24 olarak depolar.
ChunkHeader('ABCD')
Ayrı parçaların FourCC ve Chunk Size üst bilgilerini tanımlamak için kullanılır. Burada "ABCD", parça için FourCC'dir. 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 bir öbektir. Şunlardan oluşur:

 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                         :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Yığın FourCC: 32 bit
Parça tanımlama için kullanılan dört karakterli ASCII kodu.
Yığın Boyutu: 32 bit (uint32)
Bu alan, yığın tanımlayıcısı veya dolgu hariç, yığının bayt cinsinden boyutu.
Yığın Yük: Parça Boyutu bayt
Veri yükü. Yığın Boyutu tek ise tek bir dolgu baytı (RIFF'e uyum için 0 olması GEREKİR) eklenir.

Not: RIFF'te, tamamı büyük harfli öbek FourCC'ler tüm RIFF dosya biçimleri için geçerli olan standart parçalarken, bir dosya biçimine özgü FourCC'lerin tümünün küçük harfle yazıldığı 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)
Ofset 8'den başlayarak 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.

Bir WebP dosyasının, FourCC "WEBP" bilgisine sahip bir RIFF başlığıyla başlaması ZORUNLUDUR. Başlıktaki dosya boyutu, izleyen parçaların toplam boyutunun artı "WEBP" FourCC için 4 bayttır. Dosya, Dosya Boyutu tarafından belirtilen verilerden sonra hiçbir veri İÇERMEMELİDİR. Okuyucular, sondaki verileri yok sayarak bu tür dosyaları ayrıştırabilir. Yığının boyutu eşit olduğundan, RIFF başlığı tarafından belirtilen boyut da eşittir. Bağımsız parçaların içeriği aşağıdaki bölümlerde açıklanmıştır.

Basit Dosya Biçimi (Kayıp)

Bu düzen, resim kayıplı kodlama gerektiriyorsa ve şeffaflık veya genişletilmiş biçim tarafından sağlanan diğer gelişmiş özellikler gerektirmiyorsa KULLANILMALIDIR. Bu düzene sahip dosyalar daha küçüktür ve eski yazılımlar tarafından desteklenir.

Basit WebP (kayıplı) 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: Bölüm Boyutu bayt
VP8 bit akışı verileri.

"VP8" FourCC'deki dördüncü karakterin bir ASCII boşluk olduğunu (0x20) unutmayın.

VP8 bit akışı biçim spesifikasyonu, VP8 Veri Biçimi ve Kod Çözme Kılavuzu'nda açıklanmıştır. VP8 çerçeve üstbilgisinin VP8 kare genişliğini ve yüksekliğini içerdiğini unutmayın. Bunun zeminin genişliği ve yüksekliği olduğu varsayılır.

VP8 spesifikasyonu, resmin kodunun Y'CbCr biçiminde nasıl çözüleceğini açıklar. RGB'ye dönüştürmek için BT.601 Önerisi KULLANILMALIDIR. Uygulamalar başka bir dönüştürme yöntemi KULLANABİLİR ancak kod çözücüler arasında görsel sonuçlar 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ı bir şeffaflık kanalıyla) gerektiriyorsa ve genişletilmiş biçim tarafından sağlanan gelişmiş özellikler gerektirmiyorsa KULLANILMALIDIR.

Basit WebP (kayıpsız) 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" 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('VP8L')                      |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
:                           VP8L data                           :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
VP8L verileri: Chunk Size bayt
VP8L bit akış verileri.

VP8L bit akışının geçerli spesifikasyonunu WebP Kayıpsız Bit Akışı Biçimi bölümünde bulabilirsiniz. VP8L başlığının VP8L resim genişliğini ve yüksekliğini içerdiğini unutmayın. Bunun zeminin genişliği ve yüksekliği olduğu varsayılır.

Genişletilmiş Dosya Biçimi

Not: Eski okuyucular, genişletilmiş biçimin kullanıldığı dosyaları desteklemeyebilir.

Genişletilmiş biçimli dosya şu öğelerden oluşur:

  • Dosyada kullanılan özellikler hakkında bilgiler içeren bir "VP8X" Yığını.

  • Renk profili içeren isteğe bağlı bir "ICCP" Yığını.

  • Animasyon kontrol verileri içeren isteğe bağlı bir "ANIM" Yığını.

  • Resim verileri.

  • İsteğe bağlı ve EXIF meta verilerine sahip "EXIF" Yığını.

  • XMP meta verilerine sahip isteğe bağlı bir "XMP" Yığını.

  • İsteğe bağlı bilinmeyen parçalar listesi.

Hareketsiz resim için resim verileri şunlardan oluşan tek bir kareden oluşur:

Animasyonlu resimler için resim verileri birden çok 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 olan "VP8X", "ICCP", "ANIM", "ANMF", "ALPH", "VP8" ve "VP8L" parçalarının önceden açıklanan sırayla görünmesi ZORUNLUDUR. Yeniden oluşturma ve renk düzeltme için gereken parçalar sıra dışı olduğunda okuyucuların başarısız olması ZORUNLUDUR.

Meta veri ve bilinmeyen parçalar sırasız görünebilir.

Rasyonalite: Okuyucunun, tüm verileri almadan önce bir resmin kodunu çözmesine izin vermek üzere dosyada yeniden oluşturma için gerekli parçalar ilk sırada görünmelidir. Bir uygulama, meta verilerin ve özel parçaların sırasının uygulamaya uygun olması için değiştirilmesinden yararlanabilir.

Genişletilmiş WebP dosya üstbilgisi:

 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 OLMALIDIR. Okuyucular bu alanı yoksaymalıdır.
ICC profili (I): 1 bit
Dosyada "ICCP" Yığını varsa ayarlayın.
Alfa (L): 1 bit
Resmin karelerinden herhangi birinin şeffaflık bilgisi ("alfa") içerip içermediğini ayarlayın.
EXIF meta verileri (E): 1 bit
Dosyada EXIF meta verileri olup olmadığını belirtin.
XMP meta verileri (X): 1 bit
Dosyada XMP meta verileri olup olmadığını belirtin.
Animasyon (A): 1 bit
Bunun animasyonlu bir resim olup olmadığını ayarlayın. Animasyonu kontrol etmek için "ANIM" ve "ANMF" yığınlarındaki veriler kullanılmalıdır.
Ayrılmış (R): 1 bit
0 OLMALIDIR. 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
Tuvalin piksel cinsinden 1 tabanlı genişliği. Gerçek tuval genişliği 1 + Canvas Width Minus One.
Tuval Yüksekliği Eksi Bir: 24 bit
Tuvalin piksel cinsinden 1 tabanlı yüksekliği. Gerçek tuval yüksekliği 1 + Canvas Height Minus One.

Tuval Genişliği ve Tuval Yüksekliği ürünü en fazla 2^32 - 1 olmalıdır.

Gelecekteki spesifikasyonlarda daha fazla alan eklenebilir. Bilinmeyen alanların yoksayılması ZORUNLUDUR.

Animasyonlar

Animasyonlar "ANIM" ve "ANMF" Yığınları tarafından kontrol edilir.

"ANIM" Yığını:

Animasyonlu bir resimde bu parça, animasyonun global 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)
Tuvalin varsayılan arka plan rengi ([Mavi, Yeşil, Kırmızı, Alfa] bayt sırasına göre). Bu renk, kanvasta çerçevelerin etrafındaki kullanılmayan alanı ve ilk karenin şeffaf piksellerini doldurmak için KULLANILABİLİR. Elden çıkarma yöntemi 1 olduğunda arka plan rengi de kullanılır.

Not:

  • "VP8X" Yığınındaki Alfa işareti ayarlanmamış olsa bile arka plan rengi opak olmayan bir alfa değeri içerebilir.

  • Görüntüleyen uygulamalar, arka plan rengi değerini bir ipucu olarak görmelidir ve bunları kullanmaları gerekmez.

  • Kanvas, her döngünün başında temizlenir. Bunu başarmak için arka plan rengi KULLANILABİLİR.

Döngü Sayısı: 16 bit (uint16)
Animasyonun döngüye girme sayısı. 0 ise bu sonsuz anlamına gelir.

Bu parçanın, "VP8X" Yığınındaki Animasyon işareti ayarlanmışsa görünmesi ZORUNLUDUR. Animasyon işareti ayarlanmazsa ve bu parça mevcutsa bu parçanın yoksayılması ZORUNLUDUR.

"ANMF" Yığını:

Animasyonlu resimlerde bu küme, tek bir kare hakkında bilgiler içerir. Animasyon işareti ayarlanmamışsa bu parça mevcut OLMAMALIDIR.

 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                            :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Kare X: 24 bit (uint24)
Çerçevenin sol üst köşesinin X koordinatı Frame X * 2.
Kare 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.
Çerçeve Yüksekliği Eksi Bir: 24 bit (uint24)
Çerçevenin 1 tabanlı yüksekliği. Kare yüksekliği 1 + Frame Height Minus One.
Frame Duration: 24 bit (uint24)
Bir sonraki kareyi görüntülemeden önce 1 milisaniyelik birimlerde bekleme süresi. 0 (ve genellikle <= 10) şeklinde yorumlanan Çerçeve Süresi'nin uygulama tarafından tanımlandığını unutmayın. Birçok araç ve tarayıcı, GIF'e benzer bir minimum süre atar.
Ayrılmış: 6 bit
0 OLMALIDIR. Okuyucular bu alanı yoksaymalıdır.
Harmanlama yöntemi (B): 1 bit

Geçerli çerçevenin şeffaf piksellerinin, önceki tuvalin karşılık gelen pikselleriyle ne kadar karıştırılacağını belirtir:

  • 0: Alfa karıştırmayı kullanın. Önceki kareyi attıktan sonra alfa karıştırmayı kullanarak mevcut kareyi kanvasta oluşturun (aşağıya bakın). Geçerli çerçevede alfa kanalı yoksa alfa değerinin 255 olduğunu ve dikdörtgeni etkin bir şekilde değiştirdiğini varsayın.

  • 1: Karıştırmayın. Önceki kareyi attıktan sonra geçerli çerçevenin kapsadığı dikdörtgenin üzerine yazarak mevcut kareyi kanvasta oluşturun.

İmha yöntemi (D): 1 bit

Kanvasta gösterildikten sonra (sonraki kare oluşturulmadan önce) geçerli karenin nasıl ele alınacağını belirtir:

  • 0: Atmayın. Tuvali olduğu gibi bırakın.

  • 1: Arka plan rengine uygulayın. Geçerli çerçevenin kapladığı kanvastaki dikdörtgeni "ANIM" Yığını'nda belirtilen arka plan rengiyle doldurun.

Notlar:

  • Çerçeve silme işlemi yalnızca çerçeve dikdörtgeni, yani Çerçeve X, Kare Y, kare genişliği ve kare yüksekliği tarafından tanımlanan dikdörtgen için geçerlidir. Tuvalin tamamını kaplayabilir veya kaplamayabilir.

  • Alfa karıştırma:

    R, G, B ve A kanallarının her birinin 8 bit olduğu ve RGB kanallarının alfa ile önceden çarpılmadığı düşünülürse, "dst" değerinin "src" ile karıştırılmasına ilişkin 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, resmin renk profili dikkate alınarak doğrusal renk alanında YAPILMALIDIR. Renk profili mevcut değilse standart RGB (sRGB) olduğu varsayılır. (sRGB'nin yaklaşık 2,2'lik bir gama nedeniyle doğrusallaştırılması gerektiğini de unutmayın.)

Frame Data: Chunk Size - 16 bayt

Şunlardan oluşur:

Not: "ANMF" yükü olan Frame Data, RIFF dosya biçimi tarafından tanımlandığı gibi bağımsız doldurulmuş 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 OLMALIDIR. Okuyucular bu alanı yoksaymalıdır.
Ön işleme (P): 2 bit

Bu bilgilendirici bitler, sıkıştırma sırasında gerçekleştirilen ön işlemeye işaret etmek için kullanılır. Kod çözücü, örneğin değerleri karartmak veya görüntülemeden önce renk geçişlerini yumuşatmak için bu bilgileri kullanabilir.

  • 0: Ön işleme yok.
  • 1: Seviye düşürme.

Kod çözücülerin bu bilgileri herhangi bir şekilde kullanması gerekmez.

Filtreleme yöntemi (F): 2 bit

Kullanılan filtreleme yöntemleri şu şekildedir:

  • 0: Yok.
  • 1: Yatay filtre.
  • 2: Dikey filtre.
  • 3: Gradyan filtresi.

Her piksel için aşağıdaki hesaplamalar kullanılarak filtreleme gerçekleştirilir. Mevcut X konumunu çevreleyen alfa değerlerinin şu şekilde etiketlendiğini varsayalım:

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

X konumundaki alfa değerini hesaplamaya çalışıyoruz. İlk olarak, filtreleme yöntemine bağlı olarak bir tahmin yapılır:

  • 0 yöntemi: tahmin edici = 0
  • 1 yöntemi: tahmin edici = A
  • 2 yöntemi: tahmin edici = B
  • 3 yöntemi: tahmin edici = klip(A + B - C)

burada clip(v) şuna eşittir:

  • v < 0 ise 0,
  • v > 255 ise 255 veya
  • v aksi durumda

Nihai değer, tahminciye sıkıştırılmış X değeri eklenerek ve [256..511] aralığını [0..255] olan aralık içine sarmak üzere modül-256 aritmetiği kullanılarak elde edilir:

alpha = (predictor + X) % 256

En soldaki ve en üstteki piksel konumları için özel durumlar vardır. Örneğin, konumdaki sol üstteki değer (0, 0), tahmin aracı değeri olarak 0'ı kullanır. Diğer durumlarda:

  • Yatay veya gradyan filtreleme yöntemlerinde, (0, y) konumunda en soldaki pikseller, hemen yukarıdaki konum (0, y-1) kullanılarak tahmin edilir.
  • Dikey veya gradyan filtreleme yöntemleri için konumdaki (x, 0) en üstteki pikseller, soldaki konum (x-1, 0) 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ışı: Bölüm Boyutu - 1 bayt

Kodlanmış alfa bit akışı.

Bu isteğe bağlı parça, bu çerçeve için kodlanmış alfa verilerini içerir. "VP8L" Yığını içeren bir çerçeve bu parçayı İÇERMEMELİDİR.

Gerekçe: Şeffaflık bilgileri zaten "VP8L" Chunk öğesinin bir parçasıdır.

Alfa kanalı verileri, sıkıştırılmamış ham veri olarak (sıkıştırma yöntemi "0" olduğunda) 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: Uzunluk = genişlik * yükseklik şeklinde bir bayt dizisinden oluşur ve tüm 8 bit şeffaflık değerlerini tarama sırasında içerir.

  • Kayıpsız biçim sıkıştırma: Bayt dizisi, örtülü genişlik x yükseklik olan sıkıştırılmış bir görüntü 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 hiçbir başlık İÇERMEZ.

    Gerekçe: Boyutlar zaten diğer kaynaklardan bilinmektedir. Bu nedenle, bunların tekrar depolanması gereksiz olabilir ve hataya açık olabilir.

    Resim akışının kodu 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 çıkarılmalıdır.

    Gerekçe: Yeşil kanala spesifikasyonda, diğer kanalların aksine, sıkıştırmayı iyileştirebilecek ekstra dönüştürme adımlarına izin verilir.

Bit akışı (VP8/VP8L)

Bu parça, tek bir çerçeve için sıkıştırılmış bit akışı verileri içerir.

Bit akışı parçası, (i) FourCC olarak "VP8" (önemli dördüncü karakterli boşluğa dikkat edin) kullanılan bir "VP8" Yığını veya (ii) FourCC olarak "VP8L" kullanılan bir "VP8L" Yığını olabilir.

"VP8" ve "VP8L" Yığınlarının biçimleri sırasıyla Basit Dosya Biçimi (Kayıp) ve Basit Dosya Biçimi (Kayıpsız) bölümlerinde açıklanmıştır.

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ÖRÜNMELİDİR.

Bu türden en fazla bir yığın BULUNMALIDIR. Bu tür daha fazla parça varsa okuyucular ilk grup hariç her şeyi yoksayabilir. Ayrıntılar için ICC Spesifikasyonu'na bakın.

Bu yığın mevcut değilse sRGB'nin varsayılması gerekir.

Meta veri

Meta veriler, "EXIF" veya "XMP" Yığınları halinde depolanabilir.

Her türden en fazla bir yığın OLMALIDIR ("EXIF" ve "XMP "). Bu tür daha fazla parça varsa okuyucular ilki hariç tümünü yoksayabilir.

Parçalar şu ş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: Chunk Size 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: Chunk Size bayt
XMP biçiminde resim meta verileri.

"XMP" FourCC'deki dördüncü karakter ASCII boşluktur (0x20).

Meta verilerin işlenmesi hakkında daha fazla bilgiyi Meta Veri Çalışma Grubu'nun "Meta Verileri İşleme Kuralları" bölümünde bulabilirsiniz.

Bilinmeyen Yığınlar

FourCC'si bu dokümanda açıklanan parçalardan herhangi birinden farklı olan bir RIFF parçası (RIFF Dosya Biçimi bölümünde açıklanmıştır) bilinmeyen yığın olarak kabul edilir.

Gerekçe: Bilinmeyen parçalara izin vermek, biçimin gelecekte genişletilmesi için bir temel hazırlar ve ayrıca, uygulamaya özel tüm verilerin depolanmasına olanak tanır.

Bir dosya bilinmeyen parçalar içeriyor OLABİLİR:

Okuyucular bu bölümleri yoksaymalıdır. Yazarlar (bu parçaları özellikle değiştirmeyi amaçlamadıkları sürece) orijinal sıralarında KORUMALIDIR.

Çerçevelerden Kanvas Montajı

Burada, animasyonlu resim kullanılması durumunda bir okuyucunun tuvali nasıl derLEMESİ GEREKİR.

Süreç, "VP8X" Yığınında belirtilen boyutlar kullanılarak Canvas Width Minus One + 1 piksel genişliğinde ve Canvas Height Minus One + 1 piksel yüksekliğinde bir tuval oluşturulmasıyla başlar. "ANIM" Yığınındaki Loop Count alanı, animasyon işleminin kaç kez tekrarlanacağını kontrol eder. Bu, sıfır olmayan Loop Count değerleri için Loop Count - 1 veya Loop Count sıfırsa 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üleme sırasına göre verilen bağımsız kareleri içerir. Her kareyi oluşturmadan önce, önceki karenin Disposal method değeri uygulanır.

Kodu çözülmüş çerçevenin oluşturulması, tuvalin sol üst köşesinin başlangıç noktası olarak kullanılarak Kartezyen koordinatlarda (2 * Frame X, 2 * Frame Y) başlar. Blending method kullanılarak tuvale Frame Width Minus One + 1 piksel genişliğinde ve Frame Height Minus One + 1 piksel yüksekliğinde oluşturulur.

Kanvas Frame Duration milisaniye boyunca gösterilir. Bu işlem, "ANMF" Yığınları tarafından verilen tüm kareler görüntülenene kadar devam eder. Ardından yeni bir döngü yinelemesi başlar veya tüm yinelemeler tamamlanmışsa zemin son durumunda bırakılır.

Aşağıdaki sözde kod, oluşturma işlemini göstermektedir. VP8X.field gösterimi, "VP8X" Yığınında 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.
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
    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ış resim aşağıdaki gibi görünebilir:

RIFF/WEBP
+- VP8X (descriptions of features used)
+- VP8L (lossless bitstream)
+- XYZW (unknown chunk)

ICC profili ve XMP meta verisine sahip 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)

Animasyonlu bir resim ve EXIF meta verileri şu şekilde 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)