ข้อกำหนดคอนเทนเนอร์ WebP

บทนำ

WebP คือรูปแบบอิมเมจที่ใช้ (1) การเข้ารหัสคีย์เฟรม VP8 เพื่อบีบอัดข้อมูลรูปภาพในลักษณะที่สูญเสียรายละเอียด หรือ (2) การเข้ารหัส WebP แบบไม่สูญเสียรายละเอียด รูปแบบการเข้ารหัสเหล่านี้ควรมีประสิทธิภาพมากกว่ารูปแบบเก่าๆ เช่น JPEG, GIF และ PNG รูปแบบนี้ได้รับการเพิ่มประสิทธิภาพสำหรับการโอนรูปภาพผ่านเครือข่ายอย่างรวดเร็ว (เช่น สําหรับเว็บไซต์) รูปแบบ WebP มีฟีเจอร์ที่เทียบเท่า (โปรไฟล์สี ข้อมูลเมตา ภาพเคลื่อนไหว ฯลฯ) กับรูปแบบอื่นๆ ด้วย เอกสารนี้อธิบายโครงสร้างของไฟล์ WebP

คอนเทนเนอร์ WebP (นั่นคือคอนเทนเนอร์ RIFF สำหรับ WebP) รองรับฟีเจอร์เพิ่มเติมนอกเหนือจากกรณีการใช้งานพื้นฐานของ WebP (นั่นคือไฟล์ที่มีรูปภาพเดียวที่เข้ารหัสเป็นเฟรมหลัก VP8) คอนเทนเนอร์ WebP รองรับสิ่งต่อไปนี้เพิ่มเติม

  • การบีบอัดแบบไม่สูญเสียรายละเอียด: สามารถบีบอัดรูปภาพแบบไม่สูญเสียรายละเอียดโดยใช้ WebP Lossless Format

  • ข้อมูลเมตา: รูปภาพอาจมีข้อมูลเมตาที่จัดเก็บในรูปแบบไฟล์ภาพแบบเปลี่ยนรูปแบบได้ (Exif) หรือรูปแบบแพลตฟอร์มข้อมูลเมตาแบบขยาย (XMP)

  • ความโปร่งใส: รูปภาพอาจมีค่าความโปร่งใส ซึ่งเป็นช่องอัลฟ่า

  • โปรไฟล์สี: รูปภาพอาจมีโปรไฟล์ ICC ที่ฝังอยู่ตามที่อธิบายโดย International Color Consortium

  • ภาพเคลื่อนไหว: รูปภาพอาจมีหลายเฟรมที่มีการหยุดชั่วคราวระหว่างเฟรม ซึ่งทำให้เป็นภาพเคลื่อนไหว

การตั้งชื่อ

เราขอแนะนำให้ใช้ประเภทต่อไปนี้เมื่ออ้างอิงถึงคอนเทนเนอร์ WebP

ชื่อรูปแบบคอนเทนเนอร์WebP
นามสกุลชื่อไฟล์.webp
ประเภท MIMEimage/webp
Uniform Type Identifier (UTI)org.webmproject.webp

คําศัพท์และข้อมูลเบื้องต้น

คีย์เวิร์ด "ต้อง" "ต้องไม่" "ต้อง" "ต้องไม่" "ควร" "ควรไม่" "แนะนำ" "ไม่แนะนำ" "อาจ" และ "ไม่บังคับ" ในเอกสารนี้ต้องตีความตามที่อธิบายไว้ใน BCP 14 RFC 2119 RFC 8174 เมื่อคีย์เวิร์ดดังกล่าวปรากฏขึ้นเป็นอักษรตัวพิมพ์ใหญ่ทั้งหมดเท่านั้น ดังที่แสดงที่นี่

ไฟล์ WebP มีรูปภาพนิ่ง (นั่นคือเมทริกซ์พิกเซลที่เข้ารหัส) หรือภาพเคลื่อนไหว นอกจากนี้ ไฟล์ยังอาจมีข้อมูลระดับการโปร่งใส โปรไฟล์สี และข้อมูลเมตาด้วย เราเรียกเมทริกซ์ของพิกเซลว่า แคนวาสของรูปภาพ

การนับบิตในแผนภาพกลุ่มเริ่มต้นที่ 0 สำหรับบิตที่มีนัยสำคัญมากที่สุด ('MSB 0') ตามที่อธิบายไว้ใน RFC 1166

คําศัพท์เพิ่มเติมที่ใช้ตลอดทั้งเอกสารมีดังนี้

ผู้อ่าน/ผู้เขียน
โค้ดที่อ่านไฟล์ WebP เรียกว่าโปรแกรมอ่าน ส่วนโค้ดที่เขียนไฟล์ WebP เรียกว่าโปรแกรมเขียน
uint16
จำนวนเต็มแบบ 16 บิตแบบ Little Endian ที่ไม่มีค่า
uint24
จำนวนเต็ม 24 บิตแบบ Little Endian ที่ไม่มีค่าลงท้าย
uint32
จำนวนเต็มแบบ 32 บิตที่เป็นลูกเล่นที่ไม่มีเครื่องหมาย
FourCC
รหัส 4 อักขระ (FourCC) คือ uint32 ที่สร้างขึ้นโดยการต่ออักขระ ASCII 4 ตัวตามลําดับ Little-endian ซึ่งหมายความว่าระบบจะถือว่า "aaaa" (0x61616161) และ "AAAA" (0x41414141) เป็น FourCCs ที่แตกต่างกัน
ฐาน 1
เช่น ช่องจำนวนเต็มที่ไม่มีเครื่องหมายซึ่งจัดเก็บค่าชดเชยด้วย -1 เช่น ช่องดังกล่าวจะจัดเก็บค่า 25 เป็น 24
ChunkHeader('ABCD')
ใช้อธิบายส่วนหัว FourCC และขนาดข้อมูลของข้อมูลแต่ละส่วน โดยที่ "ABCD" คือ FourCC ของข้อมูล ขนาดขององค์ประกอบนี้คือ 8 ไบต์

รูปแบบไฟล์ RIFF

รูปแบบไฟล์ WebP อิงตามรูปแบบเอกสาร RIFF (Resource Interchange File Format)

องค์ประกอบพื้นฐานของไฟล์ RIFF คือข้อมูล ซึ่งประกอบด้วย

 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                         :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
FourCC ของกลุ่ม: 32 บิต
รหัส ASCII 4 อักขระที่ใช้ระบุข้อมูลโค้ด
ขนาดกลุ่ม: 32 บิต (uint32)
ขนาดของข้อมูลในหน่วยไบต์ โดยไม่รวมฟิลด์นี้ ตัวระบุข้อมูล หรือส่วนเพิ่ม
เพย์โหลดของข้อมูล: ขนาดข้อมูลเป็นไบต์
เพย์โหลดข้อมูล หากขนาดกลุ่มเป็นเลขคี่ ระบบจะเพิ่มไบต์ช่องว่างขนาดเดียวซึ่งต้องเป็น 0 เพื่อให้สอดคล้องกับ RIFF

หมายเหตุ: RIFF มีข้อกำหนดว่า FourCC ของข้อมูลโค้ดที่เป็นตัวพิมพ์ใหญ่ทั้งหมดจะเป็นข้อมูลโค้ดมาตรฐานที่ใช้กับรูปแบบไฟล์ RIFF ใดก็ได้ ส่วน FourCC ที่เจาะจงสำหรับรูปแบบไฟล์หนึ่งๆ จะเป็นตัวพิมพ์เล็กทั้งหมด 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', 'I', 'F', 'F'
ขนาดไฟล์: 32 บิต (uint32)
ขนาดของไฟล์ในหน่วยไบต์ โดยเริ่มจากออฟเซต 8 ค่าสูงสุดของช่องนี้คือ 2^32 ลบ 10 ไบต์ ดังนั้นขนาดของทั้งไฟล์จะอยู่ที่ 4 GiB ลบ 2 ไบต์
'WEBP': 32 บิต
อักขระ ASCII "W", "E", "B", "P"

ไฟล์ WebP ต้องขึ้นต้นด้วยส่วนหัว RIFF ที่มี FourCC "WEBP" ขนาดไฟล์ในส่วนหัวคือขนาดรวมของส่วนย่อยที่ตามมาบวก 4 ไบต์สำหรับ FourCC ของ "WEBP" ไฟล์ไม่ควรมีข้อมูลใดๆ หลังข้อมูลที่ระบุโดยขนาดไฟล์ โปรแกรมอ่านอาจแยกวิเคราะห์ไฟล์ดังกล่าวโดยไม่สนใจข้อมูลต่อท้าย เนื่องจากขนาดของชิ้นใดก็ตามมีขนาดเท่ากัน ขนาดที่ส่วนหัว 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

โปรดทราบว่าอักขระที่ 4 ใน FourCC ของ "VP8" คือเว้นวรรค ASCII (0x20)

ข้อมูลจำเพาะของรูปแบบ VP8 บิตสตรีมมีอธิบายอยู่ในรูปแบบข้อมูล VP8 และคู่มือการถอดรหัส โปรดทราบว่าส่วนหัวของเฟรม VP8 ประกอบด้วยความกว้างและความสูงของเฟรม VP8 ซึ่งจะถือว่าเป็นความกว้างและความสูงของภาพพิมพ์แคนวาส

ข้อมูลจำเพาะของ VP8 อธิบายวิธีถอดรหัสรูปภาพเป็นรูปแบบ Y'CbCr หากต้องการแปลงเป็น RGB ควรใช้การแนะนำ BT.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" ที่มีข้อมูลเกี่ยวกับฟีเจอร์ที่ใช้ในไฟล์

  • ข้อมูล "ICCP" ที่ไม่บังคับซึ่งมีโปรไฟล์สี

  • ข้อมูล "ANIM" ที่ไม่บังคับซึ่งมีข้อมูลการควบคุมภาพเคลื่อนไหว

  • ข้อมูลรูปภาพ

  • ข้อมูล "EXIF" ที่ไม่บังคับซึ่งมีข้อมูลเมตา Exif

  • กลุ่ม "XMP " ที่ไม่บังคับที่มีข้อมูลเมตา XMP

  • รายการข้อมูลโค้ดที่ไม่รู้จัก (ไม่บังคับ)

สำหรับภาพนิ่ง ข้อมูลรูปภาพประกอบด้วยเฟรมเดียวซึ่งประกอบด้วยข้อมูลต่อไปนี้

สําหรับรูปภาพเคลื่อนไหว ข้อมูลรูปภาพจะประกอบด้วยหลายเฟรม ดูรายละเอียดเพิ่มเติมเกี่ยวกับเฟรมได้ในส่วนภาพเคลื่อนไหว

ข้อมูลทั้งหมดที่จำเป็นต่อการสร้างใหม่และการแก้สี ซึ่งได้แก่ 'VP8X', 'ICCP', 'ANIM', 'ANMF', 'ALPH', 'VP8 ' และ 'VP8L' จะต้องปรากฏตามลำดับที่อธิบายไว้ก่อนหน้านี้ ผู้อ่านอาจล้มเหลวเมื่อชิ้นส่วนที่จำเป็นต่อการสร้างใหม่และการแก้สีไม่เป็นระเบียบ

ข้อมูลเมตาและข้อมูลที่ไม่รู้จักอาจปรากฏไม่เป็นระเบียบ

เหตุผล: ข้อมูลส่วนที่จำเป็นต่อการสร้างใหม่ควรปรากฏในไฟล์ก่อนเพื่อให้โปรแกรมอ่านเริ่มถอดรหัสรูปภาพได้ก่อนที่จะได้รับข้อมูลทั้งหมด แอปพลิเคชันอาจได้รับประโยชน์จากการเรียงลําดับข้อมูลเมตาและกลุ่มที่กําหนดเองให้เหมาะกับการใช้งาน

ส่วนหัวของไฟล์ 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    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
สงวนไว้ (Rsv): 2 บิต
ต้องเป็น 0 ผู้อ่านต้องไม่ต้องสนใจช่องนี้
โปรไฟล์ ICC (I): 1 บิต
ตั้งค่าหากไฟล์มีส่วน "ICCP"
อัลฟ่า (L): 1 บิต
ตั้งค่าว่าเฟรมใดของรูปภาพมีข้อมูลความโปร่งใสหรือไม่ ('alpha")
ข้อมูลเมตา Exif (E): 1 บิต
ตั้งค่าหากไฟล์มีข้อมูลเมตา Exif
ข้อมูลเมตา XMP (X): 1 บิต
ตั้งค่าหากไฟล์มีข้อมูลเมตา XMP
ภาพเคลื่อนไหว (A): 1 บิต
ตั้งค่าหากรูปภาพนี้เป็นภาพเคลื่อนไหว ควรใช้ข้อมูลในข้อมูลโค้ด "ANIM" และ "ANMF" เพื่อควบคุมภาพเคลื่อนไหว
สงวนไว้ (R): 1 บิต
ต้องเป็น 0 ผู้อ่านต้องไม่สนใจช่องนี้
สงวนไว้: 24 บิต
ต้องเป็น 0 ผู้อ่านต้องไม่สนใจช่องนี้
ความกว้างของภาพพิมพ์แคนวาสลบ 1: 24 บิต
ความกว้างของแคนวาส 1 ฐาน หน่วยเป็นพิกเซล ความกว้างของภาพพิมพ์แคนวาสจริงคือ 1 + Canvas Width Minus One
ความสูงของภาพพิมพ์แคนวาสลบ 1: 24 บิต
ความสูงของแคนวาสตาม 1 หน่วยเป็นพิกเซล ความสูงจริงของภาพพิมพ์แคนวาสคือ 1 + Canvas Height Minus One

ผลคูณของความกว้างของภาพพิมพ์แคนวาสและความสูงของภาพพิมพ์แคนวาสต้องไม่เกิน 2^32 - 1

ข้อมูลจำเพาะในอนาคตอาจเพิ่มช่องอื่นๆ ระบบต้องละเว้นช่องที่ไม่รู้จัก

แอนิเมชัน

ภาพเคลื่อนไหวจะควบคุมโดยข้อมูลโค้ด "ANIM" และ "ANMF"

ข้อมูลโค้ด "ANIM"

สำหรับรูปภาพเคลื่อนไหว ข้อมูลโค้ดนี้จะมีพารามิเตอร์ส่วนกลางของภาพเคลื่อนไหว

 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" หากไม่ได้ตั้งค่า Flag Animation และมีข้อมูลโค้ดนี้อยู่ ระบบต้องละเว้นข้อมูลโค้ดดังกล่าว

ข้อมูลโค้ด "ANMF"

สำหรับภาพเคลื่อนไหว กลุ่มนี้ประกอบด้วยข้อมูลเกี่ยวกับเฟรมเดียว หากไม่ได้ตั้งค่าFlag ภาพเคลื่อนไหว ไม่ควรมีข้อมูลโค้ดนี้

 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
ความกว้างของกรอบลบที่ 1: 24 บิต (uint24)
ความกว้างของเฟรมฐาน 1 ความกว้างของเฟรมคือ 1 + Frame Width Minus One
ความสูงของเฟรมลบ 1: 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: ทิ้งไปยังสีพื้นหลัง เติมสี่เหลี่ยมผืนผ้าบนผืนผ้าแคนวาสที่เฟรมปัจจุบันปกคลุมด้วยสีพื้นหลังที่ระบุไว้ในข้อมูลโค้ด "ANIM"

หมายเหตุ

  • การนำเฟรมออกจะใช้เฉพาะกับสี่เหลี่ยมผืนผ้าของเฟรม กล่าวคือ สี่เหลี่ยมผืนผ้าที่กำหนดโดยเฟรม X, เฟรม Y, ความกว้างของเฟรม และความสูงของเฟรม โดยอาจครอบคลุมหรือไม่ครอบคลุมทั้งผืนผ้าใบ

  • การปรับเปลี่ยนอัลฟ่า:

    สมมติว่าช่อง R, G, B และ A แต่ละช่องเท่ากับ 8 บิต และช่อง RGB ไม่ได้คูณไว้ล่วงหน้าด้วยอัลฟ่า สูตรการรวม "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
    
  • การผสมอัลฟ่าควรทำในพื้นที่สีเชิงเส้น โดยคำนึงถึงโปรไฟล์สีของรูปภาพ หากไม่มีโปรไฟล์สี ระบบจะถือว่าใช้ RGB มาตรฐาน (sRGB) (โปรดทราบว่า sRGB ยังต้องเปลี่ยนเป็นเชิงเส้นด้วยเนื่องจากค่าแกมมาอยู่ที่ประมาณ 2.2)

ข้อมูลเฟรม: ขนาดกลุ่ม ไบต์ - 16

ประกอบด้วย:

หมายเหตุ: ข้อมูล Frame Data ของเพย์โหลด "ANMF" ประกอบด้วยกลุ่มข้อมูล padded แต่ละกลุ่มตามที่อธิบายไว้ในรูปแบบไฟล์ RIFF

อัลฟ่า

 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...                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
สงวนไว้ (Rsv): 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: ตัวแปรคาดการณ์ = clip(A + B - C)

โดยที่ clip(v) มีค่าเท่ากับ

  • 0 หาก v < 0
  • 255 หาก v > 255 หรือ
  • v มิเช่นนั้น

ค่าสุดท้ายได้มาจากการเพิ่มค่าที่ขยาย X ลงในตัวคาดการณ์ และใช้การดำเนินการทางคณิตศาสตร์แบบ modulo-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

สตรีมบิตอัลฟ่าที่เข้ารหัส

ข้อมูลที่ไม่บังคับนี้ประกอบด้วยข้อมูลอัลฟ่าที่เข้ารหัสสำหรับเฟรมนี้ เฟรมที่มีข้อมูล "VP8L" ไม่ควรมีข้อมูลนี้

เหตุผล: ข้อมูลความโปร่งใสเป็นส่วนหนึ่งของข้อมูล "VP8L" อยู่แล้ว

ระบบจะจัดเก็บข้อมูลของช่องอัลฟ่าเป็นข้อมูลดิบแบบไม่บีบอัด (เมื่อวิธีการบีบอัดคือ "0") หรือบีบอัดโดยใช้รูปแบบที่ไม่มีการสูญเสีย (เมื่อวิธีการบีบอัดคือ "1")

  • ข้อมูลดิบ: ประกอบด้วยลำดับไบต์ที่มีความยาว = กว้าง * สูง ซึ่งมีค่าความโปร่งใส 8 บิตทั้งหมดตามลำดับการสแกน

  • การบีบอัดรูปแบบแบบไม่สูญเสียข้อมูล: ลำดับไบต์คือสตรีมรูปภาพที่บีบอัด (ตามที่อธิบายไว้ใน"รูปแบบบิตสตรีมแบบไม่สูญเสียข้อมูลของ WebP") ของมิติข้อมูลที่ระบุโดยนัยคือความกว้าง x ความสูง กล่าวคือ สตรีมรูปภาพนี้ไม่มีส่วนหัวที่อธิบายขนาดรูปภาพ

    เหตุผล: ระบบทราบมิติข้อมูลอยู่แล้วจากแหล่งที่มาอื่นๆ การจัดเก็บมิติข้อมูลอีกครั้งจึงจะซ้ำซ้อนและเสี่ยงที่จะเกิดข้อผิดพลาด

    เมื่อสตรีมรูปภาพได้รับการถอดรหัสเป็นค่าสีอัลฟ่า แดง เขียว น้ำเงิน (ARGB) ตามกระบวนการที่อธิบายไว้ในข้อกำหนดรูปแบบแบบไม่สูญเสียข้อมูลแล้ว จะต้องดึงข้อมูลโปร่งใสจากแชแนลเขียวของชุดค่าผสม 4 รายการ ARGB

    เหตุผล: ช่องสีเขียวมีขั้นตอนการแปลงเพิ่มเติมในข้อกำหนดนี้ ซึ่งต่างจากช่องอื่นๆ ที่ช่วยปรับปรุงการบีบอัดได้

บิตสตรีม (VP8/VP8L)

ข้อมูลนี้ประกอบด้วยข้อมูลบิตสตรีมแบบบีบอัดสำหรับเฟรมเดียว

ข้อมูลกลุ่มของบิตสตรีมอาจเป็น (1) ข้อมูลกลุ่ม "VP8" โดยใช้ "VP8" (โปรดสังเกตเว้นวรรคของอักขระที่ 4 ซึ่งสำคัญ) เป็น FourCC หรือ (2) ข้อมูลกลุ่ม "VP8L" โดยใช้ "VP8L" เป็น FourCC

รูปแบบของกลุ่ม "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

ส่วนนี้จะต้องปรากฏก่อนข้อมูลรูปภาพ

ไม่ควรมีข้อมูลดังกล่าวเกิน 1 รายการ หากมีข้อมูลดังกล่าวมากกว่า 1 รายการ โปรแกรมอ่านอาจละเว้นข้อมูลทั้งหมดยกเว้นรายการแรก ดูรายละเอียดได้ในข้อกำหนดของ ICC

หากไม่มีส่วนนี้แสดงว่าควรใช้ sRGB

ข้อมูลเมตา

คุณสามารถจัดเก็บข้อมูลเมตาในกลุ่ม "EXIF" หรือ "XMP"

แต่ละประเภทควรมีกลุ่ม ("EXIF" และ "XMP") ไม่เกิน 1 กลุ่ม หากมีมากกว่านั้น ผู้อ่านอาจละเว้นเนื้อหาทั้งหมดยกเว้นรายการแรก

โดยมีการกําหนดข้อมูลต่อไปนี้

ข้อมูลโค้ด "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

โปรดทราบว่าอักขระที่ 4 ใน FourCC ของ "XMP" คือช่องว่าง ASCII (0x20)

ดูคำแนะนำเพิ่มเติมเกี่ยวกับการจัดการข้อมูลเมตาได้ใน"หลักเกณฑ์สำหรับการจัดการข้อมูลเมตา" ของกลุ่มทำงานด้านข้อมูลเมตา

ข้อมูลที่ไม่รู้จัก

กลุ่ม RIFF (อธิบายไว้ในส่วนรูปแบบไฟล์ RIFF) ที่ FourCC แตกต่างจากกลุ่มใดๆ ที่อธิบายไว้ในเอกสารนี้ถือเป็นกลุ่มที่ไม่รู้จัก

เหตุผล: การให้สิทธิ์สำหรับข้อมูลที่ไม่รู้จักเป็นการเผื่อไว้สำหรับการขยายรูปแบบในอนาคต และช่วยให้จัดเก็บข้อมูลเฉพาะแอปพลิเคชันได้

ไฟล์อาจมีข้อมูลที่ไม่รู้จักในกรณีต่อไปนี้

ผู้อ่านควรละเว้นข้อมูลส่วนนี้ ผู้เขียนควรเก็บรักษาเนื้อหาตามลำดับเดิม (เว้นแต่ตั้งใจจะปรับแต่งส่วนเหล่านี้โดยเฉพาะ)

การประกอบภาพพิมพ์แคนวาสจากเฟรม

ต่อไปนี้เป็นภาพรวมวิธีที่โปรแกรมอ่านต้องประกอบภาพพิมพ์แคนวาสในกรณีที่เป็นภาพเคลื่อนไหว

กระบวนการเริ่มต้นด้วยการสร้างผืนผ้าใบโดยใช้ขนาดที่ระบุไว้ในข้อมูลโค้ด "VP8X" ซึ่งกว้าง Canvas Width Minus One + 1 พิกเซลและสูง Canvas Height Minus One + 1 พิกเซล ช่อง Loop Count จากกลุ่ม "ANIM" จะควบคุมจำนวนครั้งที่กระบวนการแสดงภาพเคลื่อนไหวเกิดซ้ำ ค่านี้คือ Loop Count - 1 สำหรับค่า Loop Count ที่ไม่ใช่ 0 หรือเป็นอนันต์หาก Loop Count เป็น 0

ที่จุดเริ่มต้นของการวนซ้ำแต่ละรอบ ระบบจะเติมพื้นที่ทำงานโดยใช้สีพื้นหลังจากข้อมูลโค้ด "ANIM" หรือสีที่แอปพลิเคชันกำหนด

ข้อมูลโค้ด "ANMF" มีเฟรมแต่ละเฟรมตามลำดับการแสดง ก่อนแสดงผลแต่ละเฟรม ระบบจะใช้ Disposal method ของเฟรมก่อนหน้า

การแสดงผลของเฟรมที่ถอดรหัสจะเริ่มที่พิกัดพิกัดคาร์ทีเซียน (2 * Frame X, 2 * Frame Y) โดยใช้มุมซ้ายบนของผืนผ้าใบเป็นจุดเริ่มต้น แสดงผลภาพขนาดกว้าง Frame Width Minus One + 1 พิกเซล x สูง Frame Height Minus One + 1 พิกเซลบนผืนผ้าใบโดยใช้ Blending method

ผืนผ้าใบจะแสดงเป็นเวลา Frame Duration มิลลิวินาที ซึ่งจะดำเนินต่อไปจนกว่าเฟรมทั้งหมดที่กำหนดโดยกลุ่ม "ANMF" จะปรากฏ จากนั้นระบบจะเริ่มการวนซ้ำของลูปใหม่ หรือจะปล่อยให้ภาพพิมพ์แคนวาสอยู่ในสถานะสุดท้ายหากการวนซ้ำทั้งหมดเสร็จสมบูรณ์แล้วก็ได้

รหัสจำลองต่อไปนี้แสดงกระบวนการแสดงผล สัญลักษณ์ VP8X.field หมายถึงช่องในกลุ่ม "VP8X" ที่มีคำอธิบายเดียวกัน

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

ตัวอย่างเลย์เอาต์ไฟล์

รูปภาพที่เข้ารหัสแบบสูญเสียข้อมูลซึ่งมีค่าอัลฟ่าอาจมีลักษณะดังนี้

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

รูปภาพที่เข้ารหัสแบบไม่สูญเสียคุณภาพอาจมีลักษณะดังนี้

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

รูปภาพแบบไม่สูญเสียรายละเอียดที่มีโปรไฟล์ ICC และข้อมูลเมตา XMP อาจมีลักษณะดังนี้

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)