WebP Kapsayıcı Özelliği

Giriş

WebP, görüntü verilerini kayıplı bir şekilde sıkıştırmak için (i) VP8 anahtar kare kodlamasını veya (ii) WebP kayıpsız kodlamasını kullanan bir resim biçimidir. Bu kodlama şemaları, JPEG, Flash veya Drive gibi eski biçimlerden GIF ve PNG. Ağ üzerinden hızlı resim aktarımı (ör. web siteleri) için optimize edilmiştir. WebP biçiminin özellik denkliği (renk profili, meta veriler, animasyon vb.) diğer biçimlerle de uyumlu şekilde çalışır. Bu belgede şunlar açıklanmaktadır: yapısına dikkat edin.

WebP kapsayıcısı (yani WebP için RIFF kapsayıcısı) özellik desteğine izin verir WebP'nin (yani VP8 animasyon karesi olarak kodlanmış resim) 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, Değiştirilebilir Resim Dosyasında depolanan meta verileri olabilir Biçim (Exif) veya Genişletilebilir Meta Veri Platformu (XMP) biçimi.

  • Şeffaflık: Bir resim, saydamlığa, yani bir alfa kanalına sahip 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'den bahsederken aşağıdaki türlerin kullanılması ÖNERİLİR kapsayıcı:

Kapsayıcı Biçimi AdıWebP
Dosya Adı Uzantısı.webp
MIME türüresim/webp
Tek tip tür tanımlayıcısı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 tuvali.

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 ek 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 son, işaretsiz bir tam sayı.
uint24
24 bit, küçük endian, imzalanmamış bir tamsayı.
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 kaydırılmış değerleri depolayan, imzalanmamış bir tam sayı alanı. Örneğin, bu tür bir alan 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 (Resource Interchange File Format) doküman biçimini temel alır.

RIFF dosyasının temel öğesi parçadır. Ş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                         :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Chunk FourCC: 32 bit
Parça tanımlama için kullanılan dört karakterli ASCII kod.
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.
Parça 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 herhangi bir RIFF dosya biçimi için geçerli olan standart parçalar, bir dosya biçimine özgü FourCC'lerin ise tamamı küçük harf olan parçalar olduğu 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 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.

Bir WebP dosyasının bir RIFF başlığıyla ve FourCC 'WEBP' ile başlaması ZORUNLUDUR. 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. Bağımsız parçaların içerikleri aşağıda açıklanmıştır. bölümlerini kontrol edin.

Basit Dosya Biçimi (Kayıp)

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 (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: Parça 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. 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. Alıcı: RGB'ye dönüştürmek için BT.601 önerisi kullanılmalıdır. Başvurular OLABİLİR kullanın ama 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 (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' 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 geçerli spesifikasyonu şu adreste bulunabilir: WebP Kayıpsız Bit Akışı Biçimi. VP8L başlığının, VP8L resim genişliğini 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 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ı.

  • XMP meta verileri içeren isteğe bağlı bir "XMP" parçası.

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

Hareketsiz bir resim için resim verileri tek bir kareden oluşur. Bu kare en fazla:

Animasyonlu resim için resim verileri birden fazla kareden oluşur. Karelerle ilgili daha fazla bilgiyi Animasyon bölümünde bulabilirsiniz.

Rekonstrüksiyon ve renk düzeltme için gereken tüm parçalar, yani 'VP8X', "ICCP", "ANIM", "ANMF", "ALPH", "VP8" ve "VP8L", sırayla görünmelidir ele alacağız. Yeniden oluşturma için gerekli parçalar olduğunda okuyucular başarısız DEĞİLDİR ve renk düzeltme yanlış.

Meta veriler ve bilinmeyen parçalar sıra dışı görünebilir.

Mantıksal: Yeniden oluşturma için gerekli parçalar önce tüm bilgileri almadan önce okuyucunun bir resmin kodunu çözmeye başlamasına izin vermek için bahsedeceğim. Bir uygulama, meta verilerin ve özel parçaların sırasını uygulamaya uygun olacak şekilde değiştirerek avantaj sağlayabilir.

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
Dosyanın "ICCP" parçası 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 verisi (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
Animasyonlu bir resim olup olmadığını belirtin. "ANIM"deki veriler ve "ANMF" Parçalar animasyonu kontrol etmek için kullanılı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.
Tuval Yüksekliği Eksi Bir: 24 bit
Kanvasın piksel cinsinden 1 tabanlı yüksekliği. Gerçek kanvas 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 YOKSAYILMALIDIR.

Animasyon

Animasyon "ANIM" tarafından kontrol ediliyor ve "ANMF" Topuklar.

'ANIM' Öğesi:

Animasyonlu resimlerde bu parça, animasyonun küresel 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 varsayılan arka plan rengi [Mavi, Yeşil, Kırmızı, Alfa] bayt sırası. 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:

  • Arka plan rengi opak olmayan bir alfa değeri içerebilir. 'VP8X'teki Alpha işareti Yığın ayarlanmamış.

  • Görüntüleyen uygulamaları, arka plan rengi değerini bir ipucu olarak ve hiçbir zorunluluk yoktur.

  • 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.

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

Bu parça, animasyonlu resimler için tek bir kareyle ilgili bilgiler 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öşesindeki X koordinatı Frame X * 2 şeklindedir.
Ç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ğidir. Çerçeve genişliği 1 + Frame Width Minus One'tür.
Çerçeve Yüksekliği Eksi Bir: 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ı, GIF'ye benzer bir minimum süre atar.
Ayrılmış: 6 bit
0 OLMALIDIR. Okuyucular bu alanı İYİCE yoksaymalıdır.
Harmanlama yöntemi (B): 1 bit

Geçerli karenin şeffaf piksellerinin ne kadar karıştırılacağını gösterir önceki tuvalin karşılık gelen pikselleriyle:

  • 0: Alfa harmanlamasını kullanın. Önceki kareyi kaldırdıktan sonra, alfa harmanlama yöntemini kullanarak mevcut kareyi tuvalde oluşturun (aşağıya bakın). Öğe geçerli karenin bir alfa kanalı yok; alfa değerinin 255 gibi bir sayı yazın.

  • 1: Karıştırmayın. Önceki kareyi attıktan sonra, tuval üzerindeki geçerli kareyi kadraja alarak kapladığı dikdörtgenin geçerli kareyi seçin.

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 mevcut karenin kapladığı dikdörtgeni, '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. Tüm kanvası kaplayabilir veya kaplamayamayabilir.

  • Alfa harmanlaması:

    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 değeri nedeniyle doğrusallaştırılması gerektiğini unutmayın.)

Çerçeve Verileri: Blok Boyutu bayt - 16

Şunları içerir:

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, veri içeren ön işlemeyi bir tekniktir. 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 konumunun etrafındaki 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
  • 1. yöntem: tahminci = A
  • 2. yöntem: tahminci = B
  • 3. yöntem: tahminci = klip(A + B - C)

clip(v) şuna eşittir:

  • 0 if v < 0,
  • v > ise 255 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, Örneğin, konumdaki (0, 0) sol üstteki değer, tahmin aracı değeri olarak 0'ı kullanı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.

Gerekçe: Şeffaflık bilgileri zaten "VP8L"nin bir parçası. Yığın.

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 veriler: Bu, tarama sırasına göre tüm 8 bit şeffaflık değerlerini içeren, genişlik * yükseklik uzunluğunda bir bayt dizisinden oluşur.

  • 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ıksal: Boyutlar diğer kaynaklardan zaten bilinmektedir, bu nedenle bunları tekrar depolamak gereksiz olur ve hataya açıktır.

    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 çözüldükten sonra şeffaflık bilgileri, ARGB dörtlüsünün yeşil kanalından ayıklanmalıdır.

    Mantıksal: Yeşil kanalda ekstra dönüşüme izin verilir diğer kanallardan farklı olarak spesifikasyondaki adımlar kullanarak sıkıştırmayı iyileştirebilirsiniz.

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) DörtCC olarak veya (ii) bir "VP8L" olarak Yığın, "VP8L" kullanılıyor olarak da düşünebilirsiniz.

"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: Parça Boyutu bayt
ICC profili.

Bu parça, resim verilerinden ÖNCE gösterilmelidir.

En fazla bir tane böyle bir parça OLMALIDIR. 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 kabul EDİLMELİDİR.

Meta veri

Meta veriler "EXIF" biçiminde depolanabilir veya "XMP" Topuklar.

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 şu ş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: 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 verilerin işlenmesi hakkında daha fazla bilgiyi şurada bulabilirsiniz: Meta Veri Çalışma Grubu'nun "Meta Verileri İşleme Kuralları".

Bilinmeyen Yığınlar

RIFF parçası (RIFF Dosya Biçimi bölümünde açıklanmıştır) dört kod parçası, bu belgede açıklanan tüm parçalardan bilinmeyen yığın olarak değerlendirilir.

Mantık: Bilinmeyen parçalara izin vermek, biçimin gelecekte genişletilmesine olanak tanır ve uygulamaya özgü verilerin depolanmasına da izin verir.

Dosyalar bilinmeyen parçalar İÇERİEBİLİR:

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 Kanvas Montajı

Burada, okuyucunun kasada tuval montajı GEREKTİĞİNİ bir genel bakış sunuyoruz. bir resim.

Süreç, "VP8X" Yığın, Canvas Width Minus One + 1 piksel genişliğinde ve Canvas Height Minus One + 1 piksel yüksekliğinde. "ANIM"deki Loop Count alanı Yığın, kontrol edilir işlemi tekrarlanır. 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. Oluşturmadan ö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. 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 işlemini 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 görüntü 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 bir animasyonlu 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)