บทนำ
WebP คือรูปแบบอิมเมจที่ใช้ (1) การเข้ารหัสคีย์เฟรม VP8 เพื่อบีบอัดข้อมูลรูปภาพในลักษณะที่สูญเสียรายละเอียด หรือ (2) การเข้ารหัส WebP แบบไม่สูญเสียรายละเอียด รูปแบบการเข้ารหัสเหล่านี้ควรมีประสิทธิภาพมากกว่ารูปแบบเก่าๆ เช่น JPEG, GIF และ PNG รูปแบบนี้ได้รับการเพิ่มประสิทธิภาพสำหรับการโอนรูปภาพผ่านเครือข่ายอย่างรวดเร็ว (เช่น สําหรับเว็บไซต์) รูปแบบ WebP มีฟีเจอร์ที่เทียบเท่า (โปรไฟล์สี ข้อมูลเมตา ภาพเคลื่อนไหว ฯลฯ) กับรูปแบบอื่นๆ ด้วย เอกสารนี้อธิบายโครงสร้างของไฟล์ WebP
คอนเทนเนอร์ WebP (นั่นคือคอนเทนเนอร์ RIFF สำหรับ WebP) รองรับฟีเจอร์เพิ่มเติมนอกเหนือจากกรณีการใช้งานพื้นฐานของ WebP (นั่นคือไฟล์ที่มีรูปภาพเดียวที่เข้ารหัสเป็นเฟรมหลัก VP8) คอนเทนเนอร์ WebP รองรับสิ่งต่อไปนี้เพิ่มเติม
การบีบอัดแบบไม่สูญเสียรายละเอียด: สามารถบีบอัดรูปภาพแบบไม่สูญเสียรายละเอียดโดยใช้ WebP Lossless Format
ข้อมูลเมตา: รูปภาพอาจมีข้อมูลเมตาที่จัดเก็บในรูปแบบไฟล์ภาพแบบเปลี่ยนรูปแบบได้ (Exif) หรือรูปแบบแพลตฟอร์มข้อมูลเมตาแบบขยาย (XMP)
ความโปร่งใส: รูปภาพอาจมีค่าความโปร่งใส ซึ่งเป็นช่องอัลฟ่า
โปรไฟล์สี: รูปภาพอาจมีโปรไฟล์ ICC ที่ฝังอยู่ตามที่อธิบายโดย International Color Consortium
ภาพเคลื่อนไหว: รูปภาพอาจมีหลายเฟรมที่มีการหยุดชั่วคราวระหว่างเฟรม ซึ่งทำให้เป็นภาพเคลื่อนไหว
การตั้งชื่อ
เราขอแนะนำให้ใช้ประเภทต่อไปนี้เมื่ออ้างอิงถึงคอนเทนเนอร์ WebP
ชื่อรูปแบบคอนเทนเนอร์ | WebP |
นามสกุลชื่อไฟล์ | .webp |
ประเภท MIME | image/webp |
Uniform Type Identifier (UTI) | org.webmproject.webp |
คําศัพท์และข้อมูลเบื้องต้น
คีย์เวิร์ด "ต้อง" "ต้องไม่" "ต้อง" "ต้องไม่" "ควร" "ควรไม่" "แนะนำ" "ไม่แนะนำ" "อาจ" และ "ไม่บังคับ" ในเอกสารนี้ต้องตีความตามที่อธิบายไว้ใน BCP 14 RFC 2119 RFC 8174 เมื่อคีย์เวิร์ดดังกล่าวปรากฏขึ้นเป็นอักษรตัวพิมพ์ใหญ่ทั้งหมดเท่านั้น ดังที่แสดงที่นี่
ไฟล์ WebP มีรูปภาพนิ่ง (นั่นคือเมทริกซ์พิกเซลที่เข้ารหัส) หรือภาพเคลื่อนไหว นอกจากนี้ ไฟล์ยังอาจมีข้อมูลระดับการโปร่งใส โปรไฟล์สี และข้อมูลเมตาด้วย เราเรียกเมทริกซ์ของพิกเซลว่า แคนวาสของรูปภาพ
การนับบิตในแผนภาพกลุ่มเริ่มต้นที่ 0
สำหรับบิตที่มีนัยสำคัญมากที่สุด ('MSB 0') ตามที่อธิบายไว้ใน RFC 1166
คําศัพท์เพิ่มเติมที่ใช้ตลอดทั้งเอกสารมีดังนี้
- ผู้อ่าน/ผู้เขียน
- โค้ดที่อ่านไฟล์ WebP เรียกว่าโปรแกรมอ่าน ส่วนโค้ดที่เขียนไฟล์ WebP เรียกว่าโปรแกรมเขียน
- uint16
- จำนวนเต็มแบบ 16 บิตแบบ Little Endian ที่ไม่มีค่า
- uint24
- จำนวนเต็ม 24 บิตแบบ Little Endian ที่ไม่มีค่าลงท้าย
- uint32
- จำนวนเต็มแบบ 32 บิตที่เป็นลูกเล่นที่ไม่มีเครื่องหมาย
- FourCC
- รหัส 4 อักขระ (FourCC) คือ uint32 ที่สร้างขึ้นโดยการต่ออักขระ ASCII 4 ตัวตามลําดับ Little-endian ซึ่งหมายความว่าระบบจะถือว่า "aaaa" (0x61616161) และ "AAAA" (0x41414141) เป็น FourCCs ที่แตกต่างกัน
- ฐาน 1
- เช่น ช่องจำนวนเต็มที่ไม่มีเครื่องหมายซึ่งจัดเก็บค่าชดเชยด้วย
-1
เช่น ช่องดังกล่าวจะจัดเก็บค่า 25 เป็น 24 - ChunkHeader('ABCD')
- ใช้อธิบายส่วนหัว FourCC และขนาดข้อมูลของข้อมูลแต่ละส่วน โดยที่ "ABCD" คือ FourCC ของข้อมูล ขนาดขององค์ประกอบนี้คือ 8 ไบต์
รูปแบบไฟล์ RIFF
รูปแบบไฟล์ WebP อิงตามรูปแบบเอกสาร RIFF (Resource Interchange File Format)
องค์ประกอบพื้นฐานของไฟล์ RIFF คือข้อมูล ซึ่งประกอบด้วย
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Chunk FourCC |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Chunk Size |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: Chunk Payload :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- FourCC ของกลุ่ม: 32 บิต
- รหัส ASCII 4 อักขระที่ใช้ระบุข้อมูลโค้ด
- ขนาดกลุ่ม: 32 บิต (uint32)
- ขนาดของข้อมูลในหน่วยไบต์ โดยไม่รวมฟิลด์นี้ ตัวระบุข้อมูล หรือส่วนเพิ่ม
- เพย์โหลดของข้อมูล: ขนาดข้อมูลเป็นไบต์
- เพย์โหลดข้อมูล หากขนาดกลุ่มเป็นเลขคี่ ระบบจะเพิ่มไบต์ช่องว่างขนาดเดียวซึ่งต้องเป็น
0
เพื่อให้สอดคล้องกับ RIFF
หมายเหตุ: RIFF มีข้อกำหนดว่า FourCC ของข้อมูลโค้ดที่เป็นตัวพิมพ์ใหญ่ทั้งหมดจะเป็นข้อมูลโค้ดมาตรฐานที่ใช้กับรูปแบบไฟล์ RIFF ใดก็ได้ ส่วน FourCC ที่เจาะจงสำหรับรูปแบบไฟล์หนึ่งๆ จะเป็นตัวพิมพ์เล็กทั้งหมด WebP ไม่เป็นไปตามแบบแผนนี้
ส่วนหัวของไฟล์ WebP
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 'R' | 'I' | 'F' | 'F' |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| File Size |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 'W' | 'E' | 'B' | 'P' |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- "RIFF": 32 บิต
- อักขระ ASCII 'R', 'I', 'F', 'F'
- ขนาดไฟล์: 32 บิต (uint32)
- ขนาดของไฟล์ในหน่วยไบต์ โดยเริ่มจากออฟเซต 8 ค่าสูงสุดของช่องนี้คือ 2^32 ลบ 10 ไบต์ ดังนั้นขนาดของทั้งไฟล์จะอยู่ที่ 4 GiB ลบ 2 ไบต์
- 'WEBP': 32 บิต
- อักขระ ASCII "W", "E", "B", "P"
ไฟล์ WebP ต้องขึ้นต้นด้วยส่วนหัว RIFF ที่มี FourCC "WEBP" ขนาดไฟล์ในส่วนหัวคือขนาดรวมของส่วนย่อยที่ตามมาบวก 4
ไบต์สำหรับ FourCC ของ "WEBP" ไฟล์ไม่ควรมีข้อมูลใดๆ หลังข้อมูลที่ระบุโดยขนาดไฟล์ โปรแกรมอ่านอาจแยกวิเคราะห์ไฟล์ดังกล่าวโดยไม่สนใจข้อมูลต่อท้าย เนื่องจากขนาดของชิ้นใดก็ตามมีขนาดเท่ากัน ขนาดที่ส่วนหัว RIFF กำหนดจึงเท่ากันด้วย เนื้อหาของข้อมูลแต่ละกลุ่มจะอธิบายไว้ในส่วนต่อไปนี้
รูปแบบไฟล์แบบง่าย (มีการสูญเสีย)
ควรใช้เลย์เอาต์นี้หากรูปภาพต้องมีการเข้ารหัสแบบสูญเสียคุณภาพและไม่จำเป็นต้องใช้ความโปร่งใสหรือฟีเจอร์ขั้นสูงอื่นๆ ที่รูปแบบแบบขยายมีให้ ไฟล์ที่มีเลย์เอาต์นี้จะเล็กกว่าและซอฟต์แวร์รุ่นเก่าๆ รองรับ
รูปแบบไฟล์ WebP (แบบสูญเสีย) แบบง่าย:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| WebP file header (12 bytes) |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: 'VP8 ' Chunk :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
ข้อมูลโค้ด "VP8"
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ChunkHeader('VP8 ') |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: VP8 data :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- ข้อมูล VP8: ไบต์ขนาดกลุ่ม
- ข้อมูลบิตสตรีม VP8
โปรดทราบว่าอักขระที่ 4 ใน FourCC ของ "VP8" คือเว้นวรรค ASCII (0x20)
ข้อมูลจำเพาะของรูปแบบ VP8 บิตสตรีมมีอธิบายอยู่ในรูปแบบข้อมูล VP8 และคู่มือการถอดรหัส โปรดทราบว่าส่วนหัวของเฟรม VP8 ประกอบด้วยความกว้างและความสูงของเฟรม VP8 ซึ่งจะถือว่าเป็นความกว้างและความสูงของภาพพิมพ์แคนวาส
ข้อมูลจำเพาะของ VP8 อธิบายวิธีถอดรหัสรูปภาพเป็นรูปแบบ Y'CbCr หากต้องการแปลงเป็น RGB ควรใช้การแนะนำ BT.601 แอปพลิเคชันอาจใช้วิธีการแปลงอื่น แต่ผลลัพธ์ภาพอาจแตกต่างกันไปตามโปรแกรมถอดรหัส
รูปแบบไฟล์แบบง่าย (ไม่มีการสูญเสีย)
หมายเหตุ: เครื่องอ่านรุ่นเก่าอาจไม่รองรับไฟล์ที่ใช้รูปแบบแบบไม่สูญเสียคุณภาพ
ควรใช้เลย์เอาต์นี้หากรูปภาพต้องมีการเข้ารหัสแบบไม่สูญเสียข้อมูล (โดยมีแชแนลความโปร่งใสที่ไม่บังคับ) และไม่ต้องใช้ฟีเจอร์ขั้นสูงที่รูปแบบแบบขยายมีให้
รูปแบบไฟล์ WebP (ไม่มีการสูญเสีย) แบบง่าย
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| WebP file header (12 bytes) |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: 'VP8L' Chunk :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
กลุ่ม "VP8L":
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ChunkHeader('VP8L') |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: VP8L data :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- ข้อมูล VP8L: ไบต์ขนาดกลุ่ม
- ข้อมูลบิตสตรีม VP8L
ดูข้อกำหนดปัจจุบันของบิตสตรีม VP8L ได้ที่รูปแบบบิตสตรีม WebP แบบไม่มีการสูญเสีย โปรดทราบว่าส่วนหัว VP8L จะมีความกว้างและความสูงของรูปภาพ VP8L ซึ่งจะถือว่าเป็นความกว้างและความสูงของภาพพิมพ์แคนวาส
รูปแบบไฟล์แบบขยาย
หมายเหตุ: เครื่องอ่านรุ่นเก่าอาจไม่รองรับไฟล์ที่ใช้รูปแบบแบบขยาย
ไฟล์รูปแบบแบบขยายประกอบด้วยรายการต่อไปนี้
ข้อมูล "VP8X" ที่มีข้อมูลเกี่ยวกับฟีเจอร์ที่ใช้ในไฟล์
ข้อมูล "ICCP" ที่ไม่บังคับซึ่งมีโปรไฟล์สี
ข้อมูล "ANIM" ที่ไม่บังคับซึ่งมีข้อมูลการควบคุมภาพเคลื่อนไหว
ข้อมูลรูปภาพ
ข้อมูล "EXIF" ที่ไม่บังคับซึ่งมีข้อมูลเมตา Exif
กลุ่ม "XMP " ที่ไม่บังคับที่มีข้อมูลเมตา XMP
รายการข้อมูลโค้ดที่ไม่รู้จัก (ไม่บังคับ)
สำหรับภาพนิ่ง ข้อมูลรูปภาพประกอบด้วยเฟรมเดียวซึ่งประกอบด้วยข้อมูลต่อไปนี้
ข้อมูลย่อยอัลฟ่า (ไม่บังคับ)
สําหรับรูปภาพเคลื่อนไหว ข้อมูลรูปภาพจะประกอบด้วยหลายเฟรม ดูรายละเอียดเพิ่มเติมเกี่ยวกับเฟรมได้ในส่วนภาพเคลื่อนไหว
ข้อมูลทั้งหมดที่จำเป็นต่อการสร้างใหม่และการแก้สี ซึ่งได้แก่ 'VP8X', 'ICCP', 'ANIM', 'ANMF', 'ALPH', 'VP8 ' และ 'VP8L' จะต้องปรากฏตามลำดับที่อธิบายไว้ก่อนหน้านี้ ผู้อ่านอาจล้มเหลวเมื่อชิ้นส่วนที่จำเป็นต่อการสร้างใหม่และการแก้สีไม่เป็นระเบียบ
ข้อมูลเมตาและข้อมูลที่ไม่รู้จักอาจปรากฏไม่เป็นระเบียบ
เหตุผล: ข้อมูลส่วนที่จำเป็นต่อการสร้างใหม่ควรปรากฏในไฟล์ก่อนเพื่อให้โปรแกรมอ่านเริ่มถอดรหัสรูปภาพได้ก่อนที่จะได้รับข้อมูลทั้งหมด แอปพลิเคชันอาจได้รับประโยชน์จากการเรียงลําดับข้อมูลเมตาและกลุ่มที่กําหนดเองให้เหมาะกับการใช้งาน
ส่วนหัวของไฟล์ WebP แบบขยาย
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| WebP file header (12 bytes) |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ChunkHeader('VP8X') |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Rsv|I|L|E|X|A|R| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Canvas Width Minus One | ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
... Canvas Height Minus One |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- สงวนไว้ (Rsv): 2 บิต
- ต้องเป็น
0
ผู้อ่านต้องไม่ต้องสนใจช่องนี้ - โปรไฟล์ ICC (I): 1 บิต
- ตั้งค่าหากไฟล์มีส่วน "ICCP"
- อัลฟ่า (L): 1 บิต
- ตั้งค่าว่าเฟรมใดของรูปภาพมีข้อมูลความโปร่งใสหรือไม่ ('alpha")
- ข้อมูลเมตา Exif (E): 1 บิต
- ตั้งค่าหากไฟล์มีข้อมูลเมตา Exif
- ข้อมูลเมตา XMP (X): 1 บิต
- ตั้งค่าหากไฟล์มีข้อมูลเมตา XMP
- ภาพเคลื่อนไหว (A): 1 บิต
- ตั้งค่าหากรูปภาพนี้เป็นภาพเคลื่อนไหว ควรใช้ข้อมูลในข้อมูลโค้ด "ANIM" และ "ANMF" เพื่อควบคุมภาพเคลื่อนไหว
- สงวนไว้ (R): 1 บิต
- ต้องเป็น
0
ผู้อ่านต้องไม่สนใจช่องนี้ - สงวนไว้: 24 บิต
- ต้องเป็น
0
ผู้อ่านต้องไม่สนใจช่องนี้ - ความกว้างของภาพพิมพ์แคนวาสลบ 1: 24 บิต
- ความกว้างของแคนวาส 1 ฐาน หน่วยเป็นพิกเซล
ความกว้างของภาพพิมพ์แคนวาสจริงคือ
1 + Canvas Width Minus One
- ความสูงของภาพพิมพ์แคนวาสลบ 1: 24 บิต
- ความสูงของแคนวาสตาม 1 หน่วยเป็นพิกเซล
ความสูงจริงของภาพพิมพ์แคนวาสคือ
1 + Canvas Height Minus One
ผลคูณของความกว้างของภาพพิมพ์แคนวาสและความสูงของภาพพิมพ์แคนวาสต้องไม่เกิน 2^32 - 1
ข้อมูลจำเพาะในอนาคตอาจเพิ่มช่องอื่นๆ ระบบต้องละเว้นช่องที่ไม่รู้จัก
แอนิเมชัน
ภาพเคลื่อนไหวจะควบคุมโดยข้อมูลโค้ด "ANIM" และ "ANMF"
ข้อมูลโค้ด "ANIM"
สำหรับรูปภาพเคลื่อนไหว ข้อมูลโค้ดนี้จะมีพารามิเตอร์ส่วนกลางของภาพเคลื่อนไหว
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ChunkHeader('ANIM') |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Background Color |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Loop Count |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- สีพื้นหลัง: 32 บิต (uint32)
- สีพื้นหลังเริ่มต้นของผืนผ้าใบในลำดับไบต์ [น้ำเงิน เขียว แดง อัลฟ่า]
ระบบอาจใช้สีนี้เพื่อเติมพื้นที่ที่ไม่ได้ใช้บนผืนผ้าใบรอบๆ เฟรม รวมถึงพิกเซลที่โปร่งใสของเฟรมแรก
ระบบจะใช้สีพื้นหลังเมื่อวิธีการกำจัดขยะเป็น
1
ด้วย
หมายเหตุ
สีพื้นหลังอาจมีค่าอัลฟ่าที่ไม่ทึบแสง แม้ว่าจะไม่มีการตั้งค่าแฟล็กอัลฟ่าในกลุ่มกลุ่ม "VP8X" ก็ตาม
แอปพลิเคชันโปรแกรมดูควรใช้ค่าสีพื้นหลังเป็นคำแนะนำและไม่จำเป็นต้องใช้
ระบบจะล้างผืนผ้าออกเมื่อเริ่มต้นแต่ละรอบ อาจใช้สีพื้นหลังเพื่อดำเนินการนี้
- จำนวนรอบ: 16 บิต (uint16)
- จำนวนครั้งที่จะเล่นภาพเคลื่อนไหวซ้ำ หากเป็น
0
หมายความว่าไม่มีขีดจำกัด
ชิ้นส่วนนี้ต้องปรากฏขึ้นหากมีการตั้งค่าแฟล็กภาพเคลื่อนไหวในกลุ่ม "VP8X" หากไม่ได้ตั้งค่า Flag Animation และมีข้อมูลโค้ดนี้อยู่ ระบบต้องละเว้นข้อมูลโค้ดดังกล่าว
ข้อมูลโค้ด "ANMF"
สำหรับภาพเคลื่อนไหว กลุ่มนี้ประกอบด้วยข้อมูลเกี่ยวกับเฟรมเดียว หากไม่ได้ตั้งค่าFlag ภาพเคลื่อนไหว ไม่ควรมีข้อมูลโค้ดนี้
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ChunkHeader('ANMF') |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Frame X | ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
... Frame Y | Frame Width Minus One ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
... | Frame Height Minus One |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Frame Duration | Reserved |B|D|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: Frame Data :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- เฟรม X: 24 บิต (uint24)
- พิกัด X ของมุมซ้ายบนของเฟรมคือ
Frame X * 2
- เฟรม Y: 24 บิต (uint24)
- พิกัด Y ของมุมซ้ายบนของเฟรมคือ
Frame Y * 2
- ความกว้างของกรอบลบที่ 1: 24 บิต (uint24)
- ความกว้างของเฟรมฐาน 1
ความกว้างของเฟรมคือ
1 + Frame Width Minus One
- ความสูงของเฟรมลบ 1: 24 บิต (uint24)
- ความสูงตาม 1 ของเฟรม
ความสูงของเฟรมคือ
1 + Frame Height Minus One
- ระยะเวลาของเฟรม: 24 บิต (uint24)
- เวลารอก่อนแสดงเฟรมถัดไปในหน่วย 1 มิลลิวินาที โปรดทราบว่าการตีความระยะเวลาเฟรม 0 (และมักเป็น <= 10) จะกำหนดโดยการใช้งาน เครื่องมือและเบราว์เซอร์จํานวนมากกําหนดระยะเวลาขั้นต่ำไว้คล้ายกับ GIF
- ข้อมูลสำรอง: 6 บิต
- ต้องเป็น
0
ผู้อ่านต้องไม่สนใจช่องนี้ - วิธีการผสม (B): 1 บิต
ระบุวิธีผสมผสานพิกเซลโปร่งใสของเฟรมปัจจุบันกับพิกเซลที่สอดคล้องกันของภาพพิมพ์แคนวาสก่อนหน้า
0
: ใช้การผสมอัลฟ่า หลังจากทิ้งเฟรมก่อนหน้าแล้ว ให้แสดงผลเฟรมปัจจุบันบนผืนผ้าใบโดยใช้การปรับอัลฟ่า (ดูด้านล่าง) หากเฟรมปัจจุบันไม่มีช่องสีอัลฟ่า ให้ถือว่าค่าอัลฟ่าเป็น 255 ซึ่งทำได้โดยแทนที่รูปสี่เหลี่ยมผืนผ้า1
: อย่าผสม หลังจากทิ้งเฟรมก่อนหน้าแล้ว ให้แสดงผลเฟรมปัจจุบันบนผืนผ้าใบโดยการเขียนทับสี่เหลี่ยมผืนผ้าที่เฟรมปัจจุบันปกปิด
- วิธีกำจัด (D): 1 บิต
ระบุวิธีจัดการเฟรมปัจจุบันหลังจากที่แสดงแล้ว (ก่อนแสดงผลเฟรมถัดไป) บนผืนผ้าใบ
0
: ห้ามกำจัด ปล่อยภาพพิมพ์แคนวาสไว้เช่นนั้น1
: ทิ้งไปยังสีพื้นหลัง เติมสี่เหลี่ยมผืนผ้าบนผืนผ้าแคนวาสที่เฟรมปัจจุบันปกคลุมด้วยสีพื้นหลังที่ระบุไว้ในข้อมูลโค้ด "ANIM"
หมายเหตุ
การนำเฟรมออกจะใช้เฉพาะกับสี่เหลี่ยมผืนผ้าของเฟรม กล่าวคือ สี่เหลี่ยมผืนผ้าที่กำหนดโดยเฟรม X, เฟรม Y, ความกว้างของเฟรม และความสูงของเฟรม โดยอาจครอบคลุมหรือไม่ครอบคลุมทั้งผืนผ้าใบ
การปรับเปลี่ยนอัลฟ่า:
สมมติว่าช่อง R, G, B และ A แต่ละช่องเท่ากับ 8 บิต และช่อง RGB ไม่ได้คูณไว้ล่วงหน้าด้วยอัลฟ่า สูตรการรวม "dst" เข้ากับ "src" มีดังนี้
blend.A = src.A + dst.A * (1 - src.A / 255) if blend.A = 0 then blend.RGB = 0 else blend.RGB = (src.RGB * src.A + dst.RGB * dst.A * (1 - src.A / 255)) / blend.A
การผสมอัลฟ่าควรทำในพื้นที่สีเชิงเส้น โดยคำนึงถึงโปรไฟล์สีของรูปภาพ หากไม่มีโปรไฟล์สี ระบบจะถือว่าใช้ RGB มาตรฐาน (sRGB) (โปรดทราบว่า sRGB ยังต้องเปลี่ยนเป็นเชิงเส้นด้วยเนื่องจากค่าแกมมาอยู่ที่ประมาณ 2.2)
- ข้อมูลเฟรม: ขนาดกลุ่ม ไบต์ -
16
ประกอบด้วย:
ข้อมูลย่อยอัลฟ่าที่ไม่บังคับสำหรับเฟรม
ข้อมูลย่อยของบิตสตรีมสำหรับเฟรม
รายการข้อมูลโค้ดที่ไม่รู้จัก (ไม่บังคับ)
หมายเหตุ: ข้อมูล Frame Data ของเพย์โหลด "ANMF" ประกอบด้วยกลุ่มข้อมูล padded แต่ละกลุ่มตามที่อธิบายไว้ในรูปแบบไฟล์ RIFF
อัลฟ่า
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ChunkHeader('ALPH') |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Rsv| P | F | C | Alpha Bitstream... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- สงวนไว้ (Rsv): 2 บิต
- ต้องเป็น
0
ผู้อ่านต้องไม่สนใจช่องนี้ - การประมวลผลล่วงหน้า (P): 2 บิต
ระบบใช้บิตที่ให้ข้อมูลเหล่านี้เพื่อส่งสัญญาณการประมวลผลล่วงหน้าที่ดำเนินการระหว่างการบีบอัด ตัวถอดรหัสสามารถใช้ข้อมูลนี้เพื่อดำเนินการต่างๆ เช่น การปรับค่าให้ละเอียดขึ้นหรือปรับเส้นลาดให้เรียบก่อนแสดง
0
: ไม่มีการประมวลผลก่อน1
: การลดระดับ
ผู้ถอดรหัสไม่จำเป็นต้องใช้ข้อมูลนี้ในลักษณะที่ระบุ
- วิธีการกรอง (F): 2 บิต
วิธีการกรองที่ใช้มีรายละเอียดดังนี้
0
: ไม่มี1
: ตัวกรองแนวนอน2
: ตัวกรองแนวตั้ง3
: ตัวกรองการไล่ระดับสี
ระบบจะกรองแต่ละพิกเซลโดยใช้การคํานวณต่อไปนี้
สมมติว่าค่าอัลฟ่าที่อยู่รอบตำแหน่ง X
ปัจจุบันมีป้ายกำกับดังนี้
C | B |
---+---+
A | X |
เราพยายามคำนวณค่าอัลฟ่าที่ตำแหน่ง X
ก่อนอื่น ระบบจะทำการคาดการณ์โดยขึ้นอยู่กับวิธีการกรอง ดังนี้
- วิธีการ
0
: ตัวแปรคาดการณ์ = 0 - วิธีการ
1
: ตัวแปรที่คาดการณ์ = A - วิธีการ
2
: ตัวแปรที่คาดการณ์ = B - วิธีการ
3
: ตัวแปรคาดการณ์ = clip(A + B - C)
โดยที่ clip(v)
มีค่าเท่ากับ
- 0 หาก v < 0
- 255 หาก v > 255 หรือ
- v มิเช่นนั้น
ค่าสุดท้ายได้มาจากการเพิ่มค่าที่ขยาย X
ลงในตัวคาดการณ์ และใช้การดำเนินการทางคณิตศาสตร์แบบ modulo-256 เพื่อตัดช่วง [256..511] ให้เป็น [0..255] ดังนี้
alpha = (predictor + X) % 256
มีกรณีพิเศษสำหรับตำแหน่งพิกเซลด้านซ้ายสุดและบนสุด ตัวอย่างเช่น ค่าด้านซ้ายบนที่ตำแหน่ง (0, 0) ใช้ 0 เป็นค่าตัวคาดการณ์ กรณีอื่น:
- สำหรับวิธีการกรองแนวนอนหรือแบบไล่ระดับสี ระบบจะคาดคะเนพิกเซลด้านซ้ายสุดที่ตําแหน่ง (0, y) โดยใช้ตําแหน่ง (0, y-1) ด้านบน
- สำหรับวิธีการกรองแนวตั้งหรือแบบไล่ระดับสี ระบบจะคาดคะเนพิกเซลที่ด้านบนสุดที่ตำแหน่ง (x, 0) โดยใช้ตำแหน่ง (x-1, 0) ทางด้านซ้าย
- วิธีการบีบอัด (C): 2 บิต
วิธีการบีบอัดที่ใช้
0
: ไม่มีการบีบอัด1
: บีบอัดโดยใช้รูปแบบ WebP แบบไม่สูญเสียคุณภาพ
- สตรีมบิตอัลฟ่า: ขนาดกลุ่ม ไบต์ -
1
สตรีมบิตอัลฟ่าที่เข้ารหัส
ข้อมูลที่ไม่บังคับนี้ประกอบด้วยข้อมูลอัลฟ่าที่เข้ารหัสสำหรับเฟรมนี้ เฟรมที่มีข้อมูล "VP8L" ไม่ควรมีข้อมูลนี้
เหตุผล: ข้อมูลความโปร่งใสเป็นส่วนหนึ่งของข้อมูล "VP8L" อยู่แล้ว
ระบบจะจัดเก็บข้อมูลของช่องอัลฟ่าเป็นข้อมูลดิบแบบไม่บีบอัด (เมื่อวิธีการบีบอัดคือ "0") หรือบีบอัดโดยใช้รูปแบบที่ไม่มีการสูญเสีย (เมื่อวิธีการบีบอัดคือ "1")
ข้อมูลดิบ: ประกอบด้วยลำดับไบต์ที่มีความยาว = กว้าง * สูง ซึ่งมีค่าความโปร่งใส 8 บิตทั้งหมดตามลำดับการสแกน
การบีบอัดรูปแบบแบบไม่สูญเสียข้อมูล: ลำดับไบต์คือสตรีมรูปภาพที่บีบอัด (ตามที่อธิบายไว้ใน"รูปแบบบิตสตรีมแบบไม่สูญเสียข้อมูลของ WebP") ของมิติข้อมูลที่ระบุโดยนัยคือความกว้าง x ความสูง กล่าวคือ สตรีมรูปภาพนี้ไม่มีส่วนหัวที่อธิบายขนาดรูปภาพ
เหตุผล: ระบบทราบมิติข้อมูลอยู่แล้วจากแหล่งที่มาอื่นๆ การจัดเก็บมิติข้อมูลอีกครั้งจึงจะซ้ำซ้อนและเสี่ยงที่จะเกิดข้อผิดพลาด
เมื่อสตรีมรูปภาพได้รับการถอดรหัสเป็นค่าสีอัลฟ่า แดง เขียว น้ำเงิน (ARGB) ตามกระบวนการที่อธิบายไว้ในข้อกำหนดรูปแบบแบบไม่สูญเสียข้อมูลแล้ว จะต้องดึงข้อมูลโปร่งใสจากแชแนลเขียวของชุดค่าผสม 4 รายการ ARGB
เหตุผล: ช่องสีเขียวมีขั้นตอนการแปลงเพิ่มเติมในข้อกำหนดนี้ ซึ่งต่างจากช่องอื่นๆ ที่ช่วยปรับปรุงการบีบอัดได้
บิตสตรีม (VP8/VP8L)
ข้อมูลนี้ประกอบด้วยข้อมูลบิตสตรีมแบบบีบอัดสำหรับเฟรมเดียว
ข้อมูลกลุ่มของบิตสตรีมอาจเป็น (1) ข้อมูลกลุ่ม "VP8" โดยใช้ "VP8" (โปรดสังเกตเว้นวรรคของอักขระที่ 4 ซึ่งสำคัญ) เป็น FourCC หรือ (2) ข้อมูลกลุ่ม "VP8L" โดยใช้ "VP8L" เป็น FourCC
รูปแบบของกลุ่ม "VP8" และ "VP8L" เป็นไปตามที่อธิบายไว้ในส่วนรูปแบบไฟล์แบบง่าย (มีการสูญเสีย) และรูปแบบไฟล์แบบง่าย (ไม่มีการสูญเสีย) ตามลำดับ
โปรไฟล์สี
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ChunkHeader('ICCP') |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: Color Profile :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- โปรไฟล์สี: ขนาดกลุ่ม ไบต์
- โปรไฟล์ ICC
ส่วนนี้จะต้องปรากฏก่อนข้อมูลรูปภาพ
ไม่ควรมีข้อมูลดังกล่าวเกิน 1 รายการ หากมีข้อมูลดังกล่าวมากกว่า 1 รายการ โปรแกรมอ่านอาจละเว้นข้อมูลทั้งหมดยกเว้นรายการแรก ดูรายละเอียดได้ในข้อกำหนดของ ICC
หากไม่มีส่วนนี้แสดงว่าควรใช้ sRGB
ข้อมูลเมตา
คุณสามารถจัดเก็บข้อมูลเมตาในกลุ่ม "EXIF" หรือ "XMP"
แต่ละประเภทควรมีกลุ่ม ("EXIF" และ "XMP") ไม่เกิน 1 กลุ่ม หากมีมากกว่านั้น ผู้อ่านอาจละเว้นเนื้อหาทั้งหมดยกเว้นรายการแรก
โดยมีการกําหนดข้อมูลต่อไปนี้
ข้อมูลโค้ด "EXIF"
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ChunkHeader('EXIF') |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: Exif Metadata :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- ข้อมูลเมตา Exif: ไบต์ขนาดกลุ่ม
- ข้อมูลเมตาของรูปภาพในรูปแบบ Exif
ข้อมูลโค้ด "XMP"
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ChunkHeader('XMP ') |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: XMP Metadata :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- ข้อมูลเมตา XMP: ขนาดกลุ่ม ไบต์
- ข้อมูลเมตาของรูปภาพในรูปแบบ XMP
โปรดทราบว่าอักขระที่ 4 ใน FourCC ของ "XMP" คือช่องว่าง ASCII (0x20)
ดูคำแนะนำเพิ่มเติมเกี่ยวกับการจัดการข้อมูลเมตาได้ใน"หลักเกณฑ์สำหรับการจัดการข้อมูลเมตา" ของกลุ่มทำงานด้านข้อมูลเมตา
ข้อมูลที่ไม่รู้จัก
กลุ่ม RIFF (อธิบายไว้ในส่วนรูปแบบไฟล์ RIFF) ที่ FourCC แตกต่างจากกลุ่มใดๆ ที่อธิบายไว้ในเอกสารนี้ถือเป็นกลุ่มที่ไม่รู้จัก
เหตุผล: การให้สิทธิ์สำหรับข้อมูลที่ไม่รู้จักเป็นการเผื่อไว้สำหรับการขยายรูปแบบในอนาคต และช่วยให้จัดเก็บข้อมูลเฉพาะแอปพลิเคชันได้
ไฟล์อาจมีข้อมูลที่ไม่รู้จักในกรณีต่อไปนี้
- ที่ส่วนท้ายของไฟล์ตามที่อธิบายไว้ในส่วนส่วนหัวของไฟล์ WebP แบบขยาย หรือ
- ที่ส่วนท้ายของข้อมูล "ANMF" ตามที่อธิบายไว้ในส่วนภาพเคลื่อนไหว
ผู้อ่านควรละเว้นข้อมูลส่วนนี้ ผู้เขียนควรเก็บรักษาเนื้อหาตามลำดับเดิม (เว้นแต่ตั้งใจจะปรับแต่งส่วนเหล่านี้โดยเฉพาะ)
การประกอบภาพพิมพ์แคนวาสจากเฟรม
ต่อไปนี้เป็นภาพรวมวิธีที่โปรแกรมอ่านต้องประกอบภาพพิมพ์แคนวาสในกรณีที่เป็นภาพเคลื่อนไหว
กระบวนการเริ่มต้นด้วยการสร้างผืนผ้าใบโดยใช้ขนาดที่ระบุไว้ในข้อมูลโค้ด "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)