WebP कंटेनर की खास बातें

संग्रह की मदद से व्यवस्थित रहें अपनी प्राथमिकताओं के आधार पर, कॉन्टेंट को सेव करें और कैटगरी में बांटें.

शुरुआती जानकारी

WebP वह इमेज फ़ॉर्मैट है जिसमें (i) इमेज डेटा को कंप्रेस करने के लिए, VP8 की फ़्रेम फ़्रेम एन्कोडिंग का इस्तेमाल किया जाता है या (ii) WebP लॉसलेस एन्कोडिंग (और आने वाले समय में अन्य एन्कोडिंग) का इस्तेमाल किया जाता है. कोड में बदलने का यह तरीका, फ़िलहाल इस्तेमाल किए जा रहे फ़ॉर्मैट के मुकाबले ज़्यादा असरदार होना चाहिए. इसे नेटवर्क पर तेज़ी से इमेज ट्रांसफ़र करने के लिए ऑप्टिमाइज़ किया जाता है (उदाहरण के लिए, वेबसाइटों के लिए). WebP फ़ॉर्मैट में, दूसरे फ़ॉर्मैट के साथ फ़ीचर एक जैसे (समानता, रंग प्रोफ़ाइल, मेटाडेटा, ऐनिमेशन) होती है. इस दस्तावेज़ में किसी WebP फ़ाइल के स्ट्रक्चर के बारे में बताया गया है.

WebP कंटेनर (यानी, WebP के लिए RIFF कंटेनर, WebP के बुनियादी इस्तेमाल के उदाहरण के ऊपर और उसके बाद सुविधा का इस्तेमाल करने देता है (जैसे कि एक ऐसी फ़ाइल जिसमें VP8 कुंजी फ़्रेम के तौर पर एन्कोड की गई एक इमेज शामिल हो). WebP कंटेनर इन कामों के लिए अतिरिक्त सहायता देता है:

  • लॉज़ कंप्रेस नहीं करना. WebP लॉसलेस फ़ॉर्मैट का इस्तेमाल करके, इमेज को आसानी से कंप्रेस किया जा सकता है.

  • मेटाडेटा. किसी इमेज में मेटाडेटा, Exif या XMP फ़ॉर्मैट में सेव हो सकता है.

  • पारदर्शिता. किसी इमेज में पारदर्शिता हो सकती है, जैसे कि ऐल्फ़ा चैनल.

  • कलर प्रोफ़ाइल. इंटरनैशनल कलर कंसोर्टियम में बताए गए तरीके से, इमेज में एम्बेड की गई आईसीसी प्रोफ़ाइल हो सकती है.

  • ऐनिमेशन. किसी इमेज में एक से ज़्यादा फ़्रेम हो सकते हैं, जिन पर रोक लगाई जा सकती है. इससे यह ऐनिमेशन बन जाता है.

कुछ,

चंक डायग्राम में बिट नंबर देने की शुरुआत 0 से होती है, जो सबसे अहम बिट के लिए शुरू होती है ('MSB 0') जैसा कि आरएफ़सी 1166 में बताया गया है.

इन्हें

WebP कंटेनर का रेफ़रंस देते समय, इन टाइप का इस्तेमाल करने का सुझाव दिया जाता है:

कंटेनर के फ़ॉर्मैट का नामWebP
फ़ाइल नाम एक्सटेंशन.वेबप
MIME टाइपइमेज/वेबप
यूनिफ़ॉर्म टाइप आइडेंटिफ़ायरorg.webmproject.webp

शब्दावली और बुनियादी बातें

WebP फ़ाइल में या तो कोई इमेज (यानी, पिक्सल की एन्कोड की गई मैट्रिक्स) या ऐनिमेशन होती है. वैकल्पिक रूप से, इसमें पारदर्शिता जानकारी, रंग प्रोफ़ाइल, और मेटाडेटा भी शामिल हो सकता है. अगर हमें सिर्फ़ पिक्सल के मैट्रिक्स का रिफ़रेंस देना है, तो हम उसे इमेज का कैनवस कहेंगे.

इस पूरे दस्तावेज़ में इस्तेमाल किए जाने वाले कुछ और शब्द नीचे दिए गए हैं:

रीडर/लेखक
WebP फ़ाइलों को पढ़ने वाले कोड को रीडर कहा जाता है, जबकि उन्हें लिखने वाले कोड को लेखक कहा जाता है.
uint16
16-बिट, लिटिल-एंडियन, बिना साइन वाला पूर्णांक.
uint24
एक 24-बिट, एंड एंडियन, बिना साइन वाला पूर्णांक.
uint32
एक 32-बिट, लिटिल-एंडियन, बिना हस्ताक्षर वाला पूर्णांक.
फ़ोरसीसी
FourCC (चार वर्णों वाला कोड) एक uint32 होता है, जिसे चार ASCII वर्णों को छोटे-छोटे क्रम में जोड़कर बनाया जाता है. इसका मतलब यह है कि 'aaaa' (%x61.61.61.61) और 'AAAA' (%x41.41.41.41) अलग-अलग FourCCs माने जाते हैं.
1-आधारित
एक बिना वैल्यू वाला पूर्णांक फ़ील्ड, जो -1 तक वैल्यू ऑफ़सेट को सेव करता है. उदाहरण के लिए, ऐसे फ़ील्ड में स्टोर वैल्यू 25 को 24 माना जाएगा.
ChunkHeader('ABCD')
इसका इस्तेमाल अलग-अलग टुकड़ों के चर्क और चंक साइज़ हेडर के बारे में बताने के लिए किया जाता है, जहां 'ABCD' अलग-अलग हिस्सों की चक्की है. इस एलिमेंट का साइज़ 8 बाइट है.

RIFF फ़ाइल प्रारूप

WebP फ़ाइल फ़ॉर्मैट, आरआईएफ़एफ़ (संसाधन इंटरचेंज फ़ाइल फ़ॉर्मैट) दस्तावेज़ फ़ॉर्मैट पर आधारित होता है.

आरआईएफ़एफ़ फ़ाइल की बुनियादी जानकारी एक हिस्सा होता है. इसमें ये चीज़ें शामिल हैं:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         Chunk FourCC                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Chunk Size                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
:                         Chunk Payload                         :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
चंक फ़ोरसीसी: 32 बिट
चंक की पहचान के लिए इस्तेमाल किया जाने वाला ASCII का चार वर्णों वाला कोड.
हिस्से का साइज़: 32 बिट (uint32)
उन हिस्सों का आकार जिनमें यह फ़ील्ड शामिल नहीं है, चंक पहचानकर्ता या पैडिंग की सुविधा है.
चंक पेलोड: चंक साइज़ बाइट
डेटा पेलोड. अगर चंक का साइज़ अजीब है, तो एक पैडिंग बाइट -- जिसे आरआईएफ़एफ़ के मुताबिक बनाने के लिए, 0 होना चाहिए -- को जोड़ दिया गया है. ऐप्लिकेशन में किसी दूसरी वैल्यू का इस्तेमाल किया जा सकता है, लेकिन हो सकता है कि पाठक फ़ाइल को पार्स न कर पाएं.

ध्यान दें: आरआईएफ़एफ़ का एक कन्वेंशन है कि सभी अपरकेस वाले चंक चार मानक मानक हिस्से होते हैं, जो किसी भी आरआईएफ़एफ़ फ़ाइल फ़ॉर्मैट पर लागू होते हैं, जबकि फ़ाइल फ़ॉर्मैट से जुड़े चार सीसी सभी छोटे अक्षर होते हैं. WebP इस कन्वेंशन का पालन नहीं करता.

WebP फ़ाइल हेडर

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      'R'      |      'I'      |      'F'      |      'F'      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           File Size                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      'W'      |      'E'      |      'B'      |      'P'      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
'RIFF': 32 बिट
ASCII वर्ण'R'#&33;'F' 'F'.
फ़ाइल साइज़: 32 बिट (uint32)
ऑफ़सेट 8 से शुरू करते हुए फ़ाइल का साइज़ बाइट में. इस फ़ील्ड का वैल्यू ज़्यादा से ज़्यादा 2^32 माइनस 10 बाइट होता है. इसलिए, पूरी फ़ाइल का साइज़ ज़्यादा से ज़्यादा 4GiB माइनस 2 बाइट होता है.
'WEBP': 32 बिट
ASCII वर्ण और#39;W'E''B' 'P'.

WebP फ़ाइल के लिए, RIFF हेडर के साथ शुरू करना ज़रूरी है. इसमें फ़ोरसीसी और #39;WEBP' होते हैं. हेडर में मौजूद फ़ाइल का साइज़, उन हिस्सों के कुल साइज़ का है जो #&39;WEBP' चार सीसी के साथ 4 बाइट का पालन करते हैं. फ़ाइल के बाद कुछ नहीं होना चाहिए. पढ़ने वाले लोग इन फ़ाइलों को पार्स कर सकते हैं, भले ही वे बाद के डेटा पर ध्यान न दें. किसी भी हिस्से का आकार समान होता है, और RIFF हेडर से भी आकार मिलता है. अलग-अलग हिस्सों की सामग्री की जानकारी नीचे दिए गए सेक्शन में दी जाएगी.

सिंपल फ़ाइल फ़ॉर्मैट (लूसी)

इस इमेज का इस्तेमाल तब किया जाना चाहिए, जब इमेज को नुकसान पहुंचाने वाला कोड में बदलना ज़रूरी हो. साथ ही, इसके लिए पारदर्शिता या दूसरी बेहतर सुविधाओं की ज़रूरत न हो. इस लेआउट वाली फ़ाइलें छोटी होती हैं और पुराने सॉफ़्टवेयर पर काम करती हैं.

आसान WebP (लॉसी) फ़ाइल फ़ॉर्मैट:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|                    WebP file header (12 bytes)                |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
:                          VP8 chunk                            :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

VP8 का हिस्सा:

 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 डेटा: चंक साइज़ बाइट
VP8 बिटस्ट्रीम डेटा.

ध्यान दें कि 'VP8 ' में चौथे वर्ण का इस्तेमाल होता है; FiveCC एक ASCII स्पेस (%x20) है.

VP8 बिटस्ट्रीम फ़ॉर्मैट की खास बातें, VP8 डेटा फ़ॉर्मैट और डिकोड करने की गाइड में देखी जा सकती हैं. ध्यान दें कि VP8 फ़्रेम के हेडर में VP8 फ़्रेम की चौड़ाई और ऊंचाई शामिल है. इसे कैनवस की चौड़ाई और ऊंचाई माना जाता है.

VP8 की खास जानकारी में, इमेज को Y'CbCr फ़ॉर्मैट में डिकोड करने का तरीका बताया गया है. आरजीबी में बदलने के लिए, Rec. 601 का इस्तेमाल किया जाना चाहिए. ऐप्लिकेशन में कन्वर्ज़न के किसी दूसरे तरीके का इस्तेमाल किया जा सकता है, लेकिन डिकोडर के बीच विज़ुअल नतीजे अलग-अलग हो सकते हैं.

सामान्य फ़ाइल फ़ॉर्मैट (बिना नुकसान वाला)

ध्यान दें: हो सकता है कि पुराने पाठक, कम क्वालिटी वाले फ़ॉर्मैट का इस्तेमाल करके फ़ाइलों पर काम न कर पाएं.

इस इमेज का इस्तेमाल तब किया जाना चाहिए, जब इमेज को कम फ़िल्टर करने की ज़रूरत हो (वैकल्पिक पारदर्शिता चैनल के साथ) और इसके लिए एक्सटेंडेड फ़ॉर्मैट की दी गई बेहतर सुविधाएं ज़रूरी न हों.

आसान WebP (लॉसलेस) फ़ाइल फ़ॉर्मैट:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|                    WebP file header (12 bytes)                |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
:                          VP8L chunk                           :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

VP8L वाला हिस्सा:

 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 डेटा: चंक साइज़ बाइट
VP8L बिटस्ट्रीम डेटा.

VP8L बिटस्ट्रीम के मौजूदा स्पेसिफ़िकेशन को WebP लॉसलेस बिटस्ट्रीम फ़ॉर्मैट पर देखा जा सकता है. ध्यान दें कि VP8L हेडर में VP8L की इमेज की चौड़ाई और ऊंचाई शामिल होती है. इसे कैनवस की चौड़ाई और ऊंचाई माना जाता है.

एक्सटेंडेड फ़ाइल फ़ॉर्मैट

ध्यान दें: हो सकता है कि पुराने पाठकों के लिए, एक्सटेंडेड फ़ॉर्मैट का इस्तेमाल करना फ़ाइलों पर काम न करे.

एक्सटेंडेड फ़ॉर्मैट फ़ाइल में ये चीज़ें शामिल होती हैं:

  • फ़ाइल में इस्तेमाल की गई सुविधाओं के बारे में जानकारी वाला एक 'VP8X' भाग.

  • वैकल्पिक और #39;ICCP' कलर प्रोफ़ाइल वाला डेटा समूह.

  • एक वैकल्पिक और #39;ऐनिम' ऐनिमेशन वाला डेटा समूह.

  • इमेज डेटा.

  • एक वैकल्पिक और #39;EXIF' Exif मेटाडेटा के साथ छोड़ें.

  • एक वैकल्पिक और #39;XMP ' XMP मेटाडेटा के साथ छोड़ें.

स्टिल इमेज के लिए, इमेज डेटा में एक फ़्रेम होता है, जो:

ऐनिमेशन वाली इमेज के लिए, इमेज के डेटा में एक से ज़्यादा फ़्रेम होते हैं. फ़्रेम के बारे में ज़्यादा जानकारी ऐनिमेशन सेक्शन में पाई जा सकती है.

सभी टुकड़ों को उसी क्रम में रखा जाना चाहिए जिस क्रम में ऊपर बताया गया है. अगर डेटा का कोई हिस्सा गलत जगह पर दिखता है, तो फ़ाइल अमान्य होती है. हालांकि, पाठक बहुत देर से फ़ाइल को अनदेखा करते हुए, फ़ाइल को पार्स कर सकते हैं.

तय समय पर: अलग-अलग हिस्सों के क्रम को सेट करने से, फ़ाइल पार्स होने में ज़्यादा समय नहीं लगना चाहिए. उदाहरण के लिए, अगर एक 'ALPH' चंक अपनी ज़रूरी जगह पर नहीं दिखता है, तो डिकोडर उसे खोजना बंद कर सकता है. देर से समूह को अनदेखा करने के नियम के तहत ऐसे कार्यक्रम होने चाहिए जो पूरी तरह से खोज करने वाले हों. साथ ही, उन्हें वे नतीजे भी देने चाहिए जो जल्दी बंद हो जाते हैं.

एक्सटेंडेड WebP फ़ाइल हेडर:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|                   WebP file header (12 bytes)                 |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      ChunkHeader('VP8X')                      |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Rsv|I|L|E|X|A|R|                   Reserved                    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Canvas Width Minus One               |             ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
...  Canvas Height Minus One    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
रिज़र्व (आरएसवी): 2 बिट
0 होना ज़रूरी है.
आईसीसी प्रोफ़ाइल (I): एक बिट
तय करें कि फ़ाइल में ICC प्रोफ़ाइल है या नहीं.
ऐल्फ़ा (L): 1 बिट
यह सेट करें कि इमेज के किसी भी फ़्रेम में पारदर्शिता जानकारी हो ("ऐल्फ़ा").
Exif मेटाडेटा (E): एक बिट
तय करें कि फ़ाइल में Exif मेटाडेटा मौजूद है या नहीं.
XMP मेटाडेटा (X): 1 बिट
सेट करें कि फ़ाइल में XMP मेटाडेटा मौजूद है या नहीं.
ऐनिमेशन (A): 1 बिट
अगर यह एक ऐनिमेटेड इमेज है, तो इसे सेट करें. और#39;ANMF' एनएएमएफ़ और #39; के हिस्सों का डेटा ऐनिमेशन का इस्तेमाल करने के लिए इस्तेमाल किया जाना चाहिए.
रिज़र्व किया गया (R): 1 बिट
0 होना ज़रूरी है.
रिज़र्व किया गया: 24 बिट
0 होना ज़रूरी है.
कैनवस की चौड़ाई वाली माइनस वन: 24 बिट
पिक्सल में कैनवस की 1-आधारित चौड़ाई. कैनवस की असल चौड़ाई 1 + Canvas Width Minus One है.
कैनवस हाइट माइनस वन: 24 बिट
पिक्सल में कैनवस की ऊंचाई 1-आधारित. कैनवस की असल ऊंचाई 1 + Canvas Height Minus One है.

कैनवस चौड़ाई और कैनवस हाइट वाले प्रॉडक्ट को ज़्यादा से ज़्यादा 2^32 - 1 होना चाहिए.

आने वाले समय में लागू होने वाली जानकारी में और फ़ील्ड जोड़े जा सकते हैं.

ऐनिमेशन

ऐनिमेशन को ANR और ANMF के हिस्से से कंट्रोल किया जाता है.

एनआईएम हिस्सा:

ऐनिमेट की हुई इमेज के लिए, इस हिस्से में ऐनिमेशन के ग्लोबल पैरामीटर शामिल हैं.

 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           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
बैकग्राउंड का रंग: 32 बिट (uint32)
[नीला, हरा, लाल, ऐल्फ़ा] बाइट के क्रम में कैनवस का डिफ़ॉल्ट बैकग्राउंड रंग. इस कलर का इस्तेमाल, फ़्रेम के आस-पास मौजूद कैनवस पर इस्तेमाल न की गई जगह को भरने के लिए किया जा सकता है. साथ ही, पहले फ़्रेम के पारदर्शी पिक्सल का भी इस्तेमाल किया जा सकता है. जब फ़ोन को नष्ट करने का तरीका 1 हो, तब भी बैकग्राउंड के रंग का इस्तेमाल किया जाता है.

ध्यान दें:

  • बैकग्राउंड के रंग में शायद पारदर्शिता का मान (ऐल्फ़ा) शामिल हो, भले ही VP8X के हिस्से में ऐल्फ़ा फ़्लैग सेट न हो.

  • व्यूअर ऐप्लिकेशन को बैकग्राउंड कलर वैल्यू को संकेत के तौर पर इस्तेमाल करना चाहिए. इसके लिए, इसका इस्तेमाल करना ज़रूरी नहीं है.

  • कैनवस को हर लूप की शुरुआत में साफ़ किया जाता है. इसे पाने के लिए बैकग्राउंड के रंग का इस्तेमाल किया जा सकता है.

लूप की गिनती: 16 बिट (uint16)
ऐनीमेशन को लूप में चलाने की संख्या. 0 का मतलब असीमित है.

अगर VP8X वाले हिस्से में ऐनिमेशन फ़्लैग सेट है, तो इसे दिखाना ज़रूरी है. अगर एनिमेशन फ़्लैग सेट नहीं है और यह हिस्सा मौजूद है, तो इसे अनदेखा करना चाहिए.

ANMF हिस्सा:

ऐनिमेट की हुई इमेज के लिए, इस हिस्से में एक फ़्रेम की जानकारी होती है. अगर ऐनिमेशन फ़्लैग सेट नहीं है, तो यह हिस्सा मौजूद नहीं होना चाहिए.

 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: 24 बिट (uint24)
फ़्रेम के ऊपरी बाएं कोने का X निर्देशांक Frame X * 2 है.
फ़्रेम Y: 24 बिट (uint24)
फ़्रेम के ऊपरी बाएं कोने का Y निर्देशांक और Frame Y * 2.
फ़्रेम चौड़ाई माइनस वन: 24 बिट (uint24)
फ़्रेम की 1-आधारित चौड़ाई. फ़्रेम 1 + Frame Width Minus One है.
फ़्रेम की ऊंचाई माइनस वन: 24 बिट (uint24)
फ़्रेम की 1-आधारित ऊंचाई. फ़्रेम 1 + Frame Height Minus One है.
फ़्रेम अवधि: 24 बिट (uint24)
अगली फ़्रेम दिखाने के लिए, 1 मिलीसेकंड वाली यूनिट में इंतज़ार करें. ध्यान दें कि 0 (और अक्सर <= 10) के लिए फ़्रेम रेंडर होने की अवधि के बारे में जानकारी दी गई है. कई टूल और ब्राउज़र GIF की तरह कम से कम अवधि तय करते हैं.
बुक किया गया: 6 बिट
0 होना चाहिए.
ब्लेंडिंग का तरीका (B): 1 बिट

यह बताता है कि मौजूदा फ़्रेम के पारदर्शी पिक्सल को, पिछले कैनवस के संबंधित पिक्सल के साथ कैसे ब्लेंड किया जाता है:

  • 0: ऐल्फ़ा ब्लेंडिंग का इस्तेमाल करें. पिछले फ़्रेम को नष्ट करने के बाद, अल्फ़ा-ब्लेंडिंग का इस्तेमाल करके कैनवस पर मौजूदा फ़्रेम रेंडर करें (नीचे देखें). अगर मौजूदा फ़्रेम में ऐल्फ़ा चैनल नहीं है, तो मान लें कि ऐल्फ़ा वैल्यू 255 है. असरदार तरीके से आयत की जगह लें.

  • 1: ब्लेंड न करें. पिछले फ़्रेम को नष्ट करने के बाद, मौजूदा फ़्रेम के आयत को ओवरराइट करके कैनवस पर मौजूदा फ़्रेम को रेंडर करें.

निपटारे का तरीका (D): 1 बिट

यह बताता है कि कैनवस पर मौजूदा फ़्रेम को दिखाने (अगला फ़्रेम रेंडर करने से पहले) का क्या तरीका है:

  • 0: नष्ट न करें. कैनवस को ऐसे ही छोड़ दें.

  • 1: बैकग्राउंड के रंग में नष्ट करें. कैनवस पर आयताकार भरें, जो मौजूदा फ़्रेम से ढका हो और बैकग्राउंड में रंग के बारे में ऐनिम चंक में बताया गया हो.

नोट:

  • फ़्रेम का निपटारा सिर्फ़ फ़्रेम के आयत पर लागू होता है, यानी कि फ़्रेम X, फ़्रेम Y, फ़्रेम की चौड़ाई और फ़्रेम की ऊंचाई से तय किया गया आयत. यह पूरे कैनवस को कवर कर सकता है या नहीं भी कर सकता है.

  • ऐल्फ़ा ब्लेंडिंग:

    क्योंकि R, G, B, और A चैनल का हर 8-बिट होता है और आरजीबी चैनल को ऐल्फ़ा के हिसाब से पहले से गुणा नहीं किया गया है, इन फ़ॉर्मूला को 'dst' 'src' पर ब्लेंड किया जाता है:

    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
    
  • इमेज की रंग प्रोफ़ाइल को ध्यान में रखते हुए, ऐल्फ़ा-ब्लेंडिंग को लीनियर कलर स्पेस में होना चाहिए. अगर कलर प्रोफ़ाइल मौजूद नहीं है, तो यह माना जाएगा कि एसआरजीबी मौजूद है. (ध्यान दें कि एसआरजीबी को ~2.2 के गामा की वजह से लीनियर होना चाहिए).

फ़्रेम डेटा: चंक साइज़ - 16 बाइट

इसमें ये शामिल हैं:

ध्यान दें: ऊपर दिए गए 'ANMF' पेलोड, फ़्रेम डेटा में अलग-अलग पैडेड हिस्से शामिल होते हैं, जैसा कि आरआईएफ़एफ़ फ़ाइल फ़ॉर्मैट में बताया गया है.

ऐल्फ़ा

 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...                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
रिज़र्व (आरएसवी): 2 बिट
0 होना ज़रूरी है.
प्री-प्रोसेसिंग (P): 2 बिट

इन जानकारी देने वाले बिट का इस्तेमाल उन प्री-प्रोसेसिंग को सिग्नल करने के लिए किया जाता है जो कंप्रेस करने के दौरान की गई हैं. डीकोडर इस जानकारी का इस्तेमाल वैल्यू की वैल्यू को अलग करने या दिखाने से पहले ग्रेडिएंट को आसान बनाने के लिए कर सकता है.

  • 0: कोई प्री-प्रोसेसिंग नहीं
  • 1: लेवल में कमी
फ़िल्टर करने का तरीका (F): 2 बिट

फ़िल्टर करने का तरीका इस्तेमाल किया गया:

  • 0: कोई नहीं.
  • 1: हॉरिज़ॉन्टल फ़िल्टर.
  • 2: वर्टिकल फ़िल्टर.
  • 3: ग्रेडिएंट फ़िल्टर.

हर पिक्सल के लिए, फ़िल्टर करने के इस तरीके का इस्तेमाल किया जाता है. मान लें कि मौजूदा X स्थिति के आस-पास की ऐल्फ़ा वैल्यू इस तरह लेबल की गई हैं:

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

हम X पोज़ीशन पर ऐल्फ़ा वैल्यू का हिसाब लगाना चाहते हैं. सबसे पहले, फ़िल्टर करने के तरीके के आधार पर अनुमान लगाया जाता है:

  • तरीका 0: पूर्वानुमान = 0
  • तरीका 1: अनुमान लगाने वाला व्यक्ति = A
  • तरीका 2: अनुमान लगाने वाला व्यक्ति = B
  • तरीका 3: अनुमानित = क्लिप(A + B - C)

जहां clip(v) इसके बराबर हो:

  • अगर v < 0 है, तो 0
  • v5 > 255;
  • नहीं तो

फ़ाइनल वैल्यू निकालने के लिए, प्रीप्रेक्टर को X की वैल्यू को जोड़ा जाता है और मॉड्यूलो-256 अंकगणित का इस्तेमाल करके [256-511] रेंज को [0-255] रेंज में रैप करने के लिए कहा जाता है:

alpha = (predictor + X) % 256

सबसे बाईं और सबसे ऊपर वाली पिक्सल पोज़िशन के लिए खास केस हैं:

  • जगह (0,0) पर सबसे ऊपर बाईं ओर की वैल्यू, अनुमान लगाने की वैल्यू के तौर पर 0 का इस्तेमाल करती है. या फिर,
  • हॉरिज़ॉन्टल या ग्रेडिएंट फ़िल्टर के तरीकों के लिए, जगह (0, y) पर सबसे बाईं ओर मौजूद पिक्सल का अनुमान, ऊपर बताई गई जगह (0, y-1) का इस्तेमाल करके लगाया जाता है.
  • वर्टिकल या ग्रेडिएंट फ़िल्टर के तरीकों के लिए, जगह (x, 0) पर सबसे ऊपर वाले पिक्सल का अनुमान बाईं ओर जगह (x-1, 0) का इस्तेमाल करके लगाया जाता है.

डिकोड करने वालों के लिए, इस जानकारी का किसी भी खास तरीके से इस्तेमाल करना ज़रूरी नहीं है.

कंप्रेस करने का तरीका (C): 2 बिट

कंप्रेस करने का तरीका:

  • 0: कोई कंप्रेस नहीं.
  • 1: WebP लॉसलेस फ़ॉर्मैट का इस्तेमाल करके कंप्रेस किया गया.
ऐल्फ़ा बिटस्ट्रीम: चंक साइज़ - 1 बाइट

ऐल्फ़ा बिट स्ट्रीम को कोड में बदला गया.

इस वैकल्पिक हिस्से में इस फ़्रेम के लिए, एन्कोड किया गया ऐल्फ़ा डेटा शामिल है. एक फ़्रेम जिसमें #39;VP8L' शामिल हों, इस चंक में शामिल नहीं होना चाहिए.

Rationale: पारदर्शिता की जानकारी पहले से ही 'VP8L' का हिस्सा है.

ऐल्फ़ा चैनल का डेटा, कंप्रेस नहीं किए गए रॉ डेटा (जब कंप्रेस करने का तरीका #33;0') होता है, तो डेटा लीक होने वाले फ़ॉर्मैट का इस्तेमाल करके सेव किया जाता है (जब कंप्रेस करने का तरीका ##39;1' हो).

  • अपरिष्कृत डेटा: इसमें लंबाई की चौड़ाई * ऊंचाई का बाइट क्रम होता है, जिसमें स्कैन के क्रम में सभी 8-बिट पारदर्शिता मान शामिल होते हैं.

  • लॉसलेस फ़ॉर्मैट का कंप्रेस करना: बाइट क्रम, कंप्रेस की गई इमेज स्ट्रीम है (जैसा कि WebP लॉसलेस बिटस्ट्रीम फ़ॉर्मैट) में इंप्लिसिट डाइमेंशन विड्थ x ऊंचाई के बारे में बताया गया है. इसका मतलब है कि इस इमेज-स्ट्रीम में इमेज के डाइमेंशन के बारे में बताने वाला कोई हेडर नहीं है.

    Rational: डाइमेंशन पहले से ही दूसरे सोर्स से जाना जा चुका है. इसलिए, इसे दोबारा स्टोर करना ज़रूरी नहीं है. साथ ही, इसे गड़बड़ी होने की संभावना भी कम होती है.

    इमेज को स्ट्रीम किए जाने पर, ARGB के रंग की वैल्यू में डिकोड कर दिए जाने के बाद, लॉसलेस फ़ॉर्मैट की खास बातों में बताई गई प्रक्रिया का पालन करें. इसके बाद, पारदर्शिता की जानकारी एआरजीबी के क्वाड्रेपलेट के हरे चैनल से ली जानी चाहिए.

    रंग में बदलाव करने की सुविधा: ग्रीन चैनल की मदद से, निर्देशों में बदलाव करने के अतिरिक्त चरणों का इस्तेमाल किया जा सकता है. -- दूसरे चैनलों के मुकाबले ऐसा नहीं किया जा सकता -- इसकी मदद से कंप्रेस करने की प्रोसेस को बेहतर बनाया जा सकता है.

बिटस्ट्रीम (VP8/VP8L)

इस हिस्से में एक फ़्रेम के लिए कंप्रेस किया गया बिटस्ट्रीम डेटा होता है.

बिट स्ट्रीम वाला हिस्सा या तो (i) "VP8 और कोट; का इस्तेमाल करके VP8 का हिस्सा वाला टैग हो सकता है; (टैग के चौथे वर्ण के लिए ज़रूरी खाली जगह का इस्तेमाल कर सकता है) या (ii) VP8L के हिस्से के तौर पर "VP8L" का इस्तेमाल अपने टैग के तौर पर कर सकता है.

VP8 और VP8L के फ़ॉर्मैट के फ़ॉर्मैट, नीचे दिए गए सेक्शन सिंपल फ़ाइल फ़ॉर्मैट (लॉसी) और सिंपल फ़ाइल फ़ॉर्मैट (लॉसलेस) में बताए गए हैं.

कलर प्रोफ़ाइल

 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                           :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
कलर प्रोफ़ाइल: चंक साइज़ बाइट
ICC प्रोफ़ाइल.

इस हिस्से को इमेज डेटा से पहले दिखाना ज़रूरी है.

इस तरह के ज़्यादा से ज़्यादा हिस्से को होना चाहिए. अगर किताब के ऐसे कई हिस्से हैं, तो हो सकता है कि पाठक पहले लेख को छोड़कर सभी को अनदेखा कर दें. ज़्यादा जानकारी के लिए, आईसीसी की खास बातें देखें.

अगर यह हिस्सा मौजूद नहीं है, तो sRGB माना जाना चाहिए.

मेटाडेटा

मेटाडेटा को #&39;EXIF' या 'XMP ' में शामिल किया जा सकता है.

इसमें हर टाइप के ज़्यादा से ज़्यादा एक हिस्से ('EXIF' और 'XMP ') हो सकते हैं. अगर ऐसे और भी हिस्से हैं, तो पाठक पहले वाले को छोड़कर सभी को अनदेखा कर सकते हैं. साथ ही, एक फ़ाइल में 'EXIF' और 'XMP ' दोनों हिस्से शामिल हो सकते हैं.

टुकड़ों को इस तरह परिभाषित किया गया है:

EXIF वाला हिस्सा:

 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 मेटाडेटा: चंक साइज़ की बाइट
Exif फ़ॉर्मैट में इमेज मेटाडेटा.

XMP वाला हिस्सा:

 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 मेटाडेटा: चंक साइज़ बाइट
XMP फ़ॉर्मैट में इमेज मेटाडेटा.

ध्यान दें कि 'XMP ' में चौथे वर्ण का इस्तेमाल होता है. CCCC एक ASCII स्पेस (%x20) होता है.

मेटाडेटा मैनेज करने के बारे में ज़्यादा जानकारी के लिए, मेटाडेटा वर्किंग ग्रुप's दिशा-निर्देश मैनेज करने के दिशा-निर्देश देखें.

कैनवस से अलग-अलग फ़्रेम जोड़कर

यहां बताया गया है कि रीडर को ऐनिमेशन वाली इमेज के साथ कैनवस कैसे बनाना चाहिए. नोटेशन VP8X.field का मतलब एक ही ब्यौरे वाले 'VP8X' वाले हिस्से में है.

ऐनिमेशन वाली इमेज कैनवस दिखाना, नीचे दिए गए स्यूडोकोड के जैसा होना चाहिए:

assert VP8X.flags.hasAnimation
canvas ← new image of size VP8X.canvasWidth x VP8X.canvasHeight with
         background color ANIM.background_color.
loop_count ← ANIM.loopCount
dispose_method ← ANIM.disposeMethod
if loop_count == 0:
  loop_count = ∞
frame_params ← nil
assert next chunk in image_data is ANMF
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
    assert VP8X.canvasWidth >= frame_right
    assert VP8X.canvasHeight >= frame_bottom
    for subchunk in 'Frame Data':
      if subchunk.tag == "ALPH":
        assert alpha subchunks not found in 'Frame Data' earlier
        frame_params.alpha = alpha_data
      else if subchunk.tag == "VP8 " OR subchunk.tag == "VP8L":
        assert bitstream subchunks not found in 'Frame Data' earlier
        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 dispose method dispose_method.
    canvas contains the decoded image.
    Show the contents of the canvas for
    frame_params.frameDuration * 1ms.

फ़ाइल लेआउट का उदाहरण

अल्फ़ा के रूप में एन्कोड की गई कोई इमेज इस तरह दिख सकती है:

RIFF/WEBP
+- VP8X (descriptions of features used)
+- ALPH (alpha bitstream)
+- VP8 (bitstream)

खराब तरीके से एन्कोड की गई इमेज इस तरह दिख सकती है:

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

आईसीसी प्रोफ़ाइल और एक्सएमपी मेटाडेटा के लिए कम क्वालिटी वाली इमेज इस तरह दिख सकती है:

RIFF/WEBP
+- VP8X (descriptions of features used)
+- ICCP (color profile)
+- VP8L (lossless bitstream)
+- XMP  (metadata)

Exif मेटाडेटा के साथ ऐनिमेटेड इमेज इस तरह दिख सकती है:

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)