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

เกริ่นนำ

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

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

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

  • ข้อมูลเมตา: รูปภาพอาจมีข้อมูลเมตาที่จัดเก็บไว้ในรูปแบบ Exchangeable Image File Format (Exif) หรือรูปแบบ Extensible Metadata Platform (XMP)

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

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

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

การตั้งชื่อ

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

ชื่อรูปแบบคอนเทนเนอร์WebP
นามสกุลชื่อไฟล์.webp
ประเภท MIMEรูปภาพ/webp
ตัวระบุประเภทเครื่องแบบorg.webmproject.webp

คำศัพท์และพื้นฐาน

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

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

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

ด้านล่างนี้เป็นข้อกำหนดเพิ่มเติมที่ใช้ในเอกสารนี้

ผู้อ่าน/ผู้เขียน
โค้ดที่อ่านไฟล์ WebP เรียกว่าโปรแกรมอ่าน ส่วนโค้ดที่เขียนโค้ดจะเรียกว่าผู้เขียน
uint16
จำนวนเต็มแบบ 16 บิตที่ไม่มีเครื่องหมาย
uint24
จำนวนเต็มแบบ 24 บิตที่ไม่มีเครื่องหมาย
uint32
จำนวนเต็มแบบ 32 บิตที่ไม่มีเครื่องหมาย
FourCC
รหัส 4 อักขระ (FourCC) คือ uint32 ที่สร้างขึ้นด้วยการเชื่อมโยงอักขระ ASCII 4 ตัวโดยเรียงลำดับต่างกัน ซึ่งหมายความว่า ระบบจะถือว่า "aaaa" (0x61616161) และ "AAAA" (0x41414141) เป็น FourCCs ที่ต่างกัน
แบบ 1
เช่น ช่องจำนวนเต็มที่ไม่มีเครื่องหมายซึ่งจัดเก็บค่าชดเชยด้วย -1 ช่องเช่นนี้จะจัดเก็บค่า 25 เป็น 24
ChunkHeader('ABCD')
ใช้อธิบายส่วนหัวของ FourCC และ Chunk Level สำหรับแต่ละส่วน โดย "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                         :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
กลุ่ม 4CC: 32 บิต
รหัส 4 อักขระ ASCII ที่ใช้สำหรับการระบุกลุ่ม
ขนาดกลุ่ม: 32 บิต (uint32)
ขนาดของชิ้นส่วนเป็นไบต์ โดยไม่รวมช่องนี้ ตัวระบุกลุ่ม หรือระยะห่างจากขอบ
เพย์โหลดกลุ่ม: ขนาดกลุ่ม ไบต์
เพย์โหลดข้อมูล หาก Chunkขนาด เป็นเลขคี่ ระบบจะเพิ่มไบต์ระยะห่างจากขอบ 1 ไบต์ ซึ่งต้องมี 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 ที่มี "WEBP" FourCC ขนาดไฟล์ในส่วนหัวคือขนาดทั้งหมดของกลุ่มที่ตามมาบวก 4 ไบต์สำหรับ "WEBP" FourCC ไฟล์ไม่ควรมีข้อมูลใดๆ ตามหลังข้อมูลที่ระบุโดยขนาดไฟล์ ผู้อ่านอาจแยกวิเคราะห์ไฟล์ดังกล่าวได้โดยไม่สนใจข้อมูลต่อท้าย เนื่องจากขนาดของท่อนต่างๆ เท่ากัน ขนาดที่ส่วนหัว 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 ใน 'VP8 ' FourCC คือช่องว่าง 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 Lossless Bitstream โปรดทราบว่าส่วนหัว 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" หรือไม่
Alpha (L): 1 บิต
กำหนดว่าเฟรมใดของรูปภาพมีข้อมูลความโปร่งใส ("อัลฟ่า")
ข้อมูลเมตา Exif (E): 1 บิต
กำหนดว่าไฟล์มีข้อมูลเมตา Exif หรือไม่
ข้อมูลเมตา XMP (X): 1 บิต
กำหนดว่าไฟล์มีข้อมูลเมตา XMP หรือไม่
ภาพเคลื่อนไหว (A): 1 บิต
ตั้งค่าว่านี่เป็นรูปภาพเคลื่อนไหวหรือไม่ ควรใช้ข้อมูลในส่วน "ANIM" และ "ANMF" เพื่อควบคุมภาพเคลื่อนไหว
สงวนไว้ (R): 1 บิต
ต้องเป็น 0 ผู้อ่านต้องไม่สนใจช่องนี้
จองแล้ว: 24 บิต
ต้องเป็น 0 ผู้อ่านต้องไม่สนใจช่องนี้
เครื่องหมายลบความกว้าง Canvas 1: 24 บิต
ความกว้างของผืนผ้าใบฐาน 1 หน่วยเป็นพิกเซล ความกว้างแคนวาสจริงคือ 1 + Canvas Width Minus One
เครื่องหมายลบสำหรับความสูงของ Canvas: 24 บิต
ความสูงของผืนผ้าใบฐาน 1 หน่วยเป็นพิกเซล ความสูงจริงของภาพพิมพ์แคนวาสคือ 1 + Canvas Height Minus One

ผลิตภัณฑ์ความกว้างของ Canvas และ Canvas Height ต้องไม่เกิน 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ด้วย

หมายเหตุ

  • สีพื้นหลังอาจมีค่าอัลฟ่าที่ไม่ทึบแสง แม้ว่าไม่ได้ตั้งค่า Flag อัลฟ่า ในส่วน VP8X" ก็ตาม

  • แอปพลิเคชันผู้ดูควรใช้ค่าสีพื้นหลังเป็นคำแนะนำ และไม่จำเป็นต้องใช้ค่าดังกล่าว

  • ระบบจะล้าง Canvas ออกเมื่อเริ่มต้นลูปแต่ละครั้ง ก็อาจใช้สีพื้นหลัง เพื่อให้บรรลุเป้าหมายนี้

จำนวนลูป: 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
ความกว้างเฟรมลบ 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 ไบต์

ประกอบด้วยรายการต่อไปนี้

หมายเหตุ: เพย์โหลด "ANMF" หรือที่เรียกว่า Frame Data ประกอบด้วยชิ้นส่วนที่มีระยะห่างจากกันแต่ละรายการตามที่อธิบายไว้ในรูปแบบไฟล์ 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: predictor = A
  • เมธอด 2: คาดการณ์ = B
  • เมธอด 3: การคาดคะเน = คลิป(A + B - C)

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

  • 0 หาก v < 0
  • 255 หาก v > 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 แบบไม่สูญเสียรายละเอียด
Alpha บิตสตรีม: ขนาดกลุ่ม - 1 ไบต์

Alpha บิตสตรีมที่เข้ารหัส

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

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

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

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

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

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

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

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

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

กลุ่มนี้มีข้อมูลบิตสตรีมที่บีบอัดสำหรับเฟรมเดียว

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

รูปแบบของ Chunk สำหรับ "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 ส่วน หากมีส่วนดังกล่าวมากกว่านี้ ผู้อ่านอาจไม่สนใจทั้งหมด ยกเว้นส่วนแรก โปรดดูรายละเอียดในข้อกำหนดของ ICC

หากไม่มีส่วนนี้ ระบบจะถือว่าใช้ sRGB

Metadata

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

แต่ละประเภทควรมีข้อมูลไม่เกิน 1 ส่วน ("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

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

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

ไม่ทราบชนิด

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

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

ไฟล์อาจมีส่วนที่ไม่รู้จัก ดังนี้

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

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

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

ขั้นตอนนี้เริ่มต้นด้วยการสร้างแคนวาสโดยใช้ขนาดที่ระบุในกลุ่ม "VP8X" กว้าง Canvas Width Minus One + 1 พิกเซลและสูง Canvas Height Minus One + 1 พิกเซล ช่อง Loop Count จากกลุ่ม "ANIM" จะควบคุมจำนวนครั้งที่กระบวนการสร้างภาพเคลื่อนไหวซ้ำ นี่คือ Loop Count - 1 สำหรับค่า Loop Count ที่ไม่ใช่ศูนย์ หรืออนันต์หาก 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.
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

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

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

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)