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

บทนำ

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

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

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

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

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

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

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

การตั้งชื่อ

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

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

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

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

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

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

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

ผู้อ่าน/ผู้เขียน
โค้ดที่อ่านไฟล์ WebP จะเรียกว่าโปรแกรมอ่าน ขณะที่โค้ดที่ เขียนว่านักเขียน
uint16
จำนวนเต็มแบบ 16 บิตที่เป็นลูกเล่นที่ไม่มีเครื่องหมาย
uint24
จำนวนเต็ม 24 บิตแบบ Little-endian ที่ไม่มีค่าลงท้าย
uint32
จำนวนเต็มแบบ 32 บิตที่เป็นลูกเล่นที่ไม่มีเครื่องหมาย
FourCC
รหัส 4 อักขระ (FourCC) คือ uint32 ที่สร้างขึ้นโดยการต่ออักขระ ASCII 4 ตัวตามลําดับ Little-endian ซึ่งหมายความว่าระบบจะถือว่า "aaaa" (0x61616161) และ "AAAA" (0x41414141) เป็น FourCC ที่แตกต่างกัน
ฐาน 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                         :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Chunk 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 ซึ่งมี "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 แบบไม่มีการสูญเสีย โปรดทราบว่าส่วนหัว 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 บิต
กำหนดว่าเฟรมใดก็ตามของรูปภาพมีข้อมูลความโปร่งใส ("อัลฟ่า")
ข้อมูลเมตา 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 ด้วย

หมายเหตุ

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

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

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

จำนวนรอบ: 16 บิต (uint16)
จำนวนครั้งที่จะเล่นภาพเคลื่อนไหวซ้ำ หากเป็น 0 หมายความว่าไม่มีขีดจำกัด

ข้อมูลโค้ดนี้ต้องปรากฏขึ้นหากตั้งค่า Flag Animation ในข้อมูลโค้ด "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

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

หมายเหตุ: "ANMF" เพย์โหลด ข้อมูลเฟรม ประกอบด้วย ชิ้นส่วนที่มีขนาดเล็ก ตามที่อธิบายไว้ในรูปแบบไฟล์ 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: ตัวคาดการณ์ = คลิป(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) ตามกระบวนการที่อธิบายในรูปแบบแบบไม่สูญเสียรายละเอียด ข้อมูลความโปร่งใสต้องดึงมาจาก ช่องสีเขียวของสี่เหลี่ยม ARGB

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

Bitstream (VP8/VP8L)

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

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

รูปแบบของ "VP8" และ "VP8L" กลุ่มข้อมูลตามที่อธิบายไว้ในส่วน รูปแบบไฟล์แบบง่าย (สูญหาย) และรูปแบบไฟล์แบบง่าย (Lossless) ตามลำดับ

โปรไฟล์สี

 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

ข้อมูลเมตา

ข้อมูลเมตาสามารถจัดเก็บไว้ในข้อมูลโค้ด "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 ที่ไม่ใช่ 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)