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

บทนำ

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

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

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

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

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

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

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

การตั้งชื่อ

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

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

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

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

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

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

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

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

"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" เพย์โหลด ข้อมูลเฟรม ประกอบด้วย ชิ้นส่วนที่มีขนาดเล็ก ตามที่อธิบายไว้ในรูปแบบไฟล์ 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 หรือ
  • หากเป็นอย่างอื่น

ค่าสุดท้ายได้มาจากการบวกค่าที่คลายการบีบอัด 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 ไบต์

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

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

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

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

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

  • การบีบอัดรูปแบบแบบไม่สูญเสียข้อมูล: ลำดับไบต์คือการบีบอัด สตรีมรูปภาพ (ตามที่อธิบายไว้ใน "รูปแบบ Bitstream แบบไม่สูญเสียข้อมูลของ 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)