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