รูปแบบไฟล์ WebP
รูปแบบไฟล์ภาพยุคใหม่จาก Google
คอนเทนเนอร์ RIFF
Google ไม่ได้คิดคอนเทนเนอร์ใหม่ขึ้นมาให้ WebP แต่เลือกใช้ RIFF ซึ่งเป็นรูปแบบเดียวกับที่ห่อไฟล์เสียง WAV และวิดีโอ AVI มาตั้งแต่ต้นยุค 90 ถ้าคุณเคยแกะไฟล์ WAV มาก่อน คุณก็เข้าใจการทำงานของ WebP ในระดับคอนเทนเนอร์อยู่แล้ว
รูปแบบนี้ใช้ chunk ซ้อนกันโดยมีตัวระบุยาว 4 ตัวอักษร (เรียกว่ารหัส FourCC) เป็นการออกแบบที่เรียบง่ายและทนทาน จนผ่านการพิสูจน์ของเวลามาได้
โครงสร้างไฟล์ WebP (คอนเทนเนอร์ RIFF)
ส่วนหัวของ WebP
| Offset | Hex | ASCII | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | 52494646241A00005745425056503858 | RIFF$...WEBPVP8X | |||||||||||||||
| 0010 | 0A00000010000000FF0000FF00000000 | .............. | |||||||||||||||
โครงสร้างของ chunk แบบ RIFF
หมายเหตุ: ข้อมูลใน chunk จะถูกเติมด้วยไบต์ศูนย์ให้ความยาวเป็นเลขคู่ หากจำเป็น
offset ที่สำคัญ
- • จุดเริ่มของ sub-chunk: 12 ไบต์ (ถัดจาก RIFF + size + WEBP)
- • ส่วนหัวของ chunk: 8 ไบต์ (FourCC 4 ไบต์ + ขนาด 4 ไบต์)
- • offset ของฟิลด์ขนาด: +4 จากจุดเริ่มของ chunk (little-endian)
chunk ที่เก็บภาพ
จริงๆ แล้ว WebP คือสามรูปแบบในหนึ่งเดียว ทั้งแบบเสียคุณภาพ (VP8) แบบไม่เสียคุณภาพ (VP8L) และแบบขยาย (VP8X) ชนิดของ chunk จะบอกว่าใช้วิธีบีบอัดแบบไหน
VP8:การบีบอัดแบบเสียคุณภาพ
ใช้ตัวเข้ารหัสวิดีโอ VP8 ในการบีบอัด ได้อัตราส่วนคุณภาพต่อขนาด ใกล้เคียงกับ JPEG ไฟล์ WebP แบบธรรมดามีแค่ chunk นี้ตัวเดียว
VP8L:การบีบอัดแบบไม่เสียคุณภาพ
บีบอัดแบบ lossless ด้วยการทำนายค่า การแปลงสี และการเข้ารหัสเอนโทรปี โดยทั่วไปเล็กกว่า PNG ราว 25-34%
VP8X:รูปแบบขยาย
บอกว่ามีฟีเจอร์เสริมอะไรอยู่บ้าง เช่น ภาพเคลื่อนไหว ช่องอัลฟา โปรไฟล์ ICC, EXIF หรือ XMP จำเป็นต้องมีเมื่อมีฟีเจอร์เหล่านี้อย่างใดอย่างหนึ่ง
ALPH:ช่องอัลฟา
ข้อมูลช่องอัลฟาที่แยกออกมา บีบอัดแบบเสียหรือไม่เสียคุณภาพก็ได้ โดยแยกอิสระจากข้อมูลสี
ANIM/ANMF:ภาพเคลื่อนไหว
ANIM เก็บพารามิเตอร์ภาพรวมของภาพเคลื่อนไหว ส่วน chunk ANMF เก็บแต่ละเฟรมพร้อมข้อมูลจังหวะเวลา
chunk ที่เก็บเมทาดาต้า
ต่างจากไฟล์ WebP แบบธรรมดาที่มีแค่ข้อมูลภาพ ไฟล์ WebP แบบขยายพกเมทาดาต้ามาด้วยได้ ข่าวดีคือ chunk พวกนี้ แยกออกจากข้อมูลภาพอย่างชัดเจน จึงหาเจอและลบออกได้ง่าย
EXIF:เมทาดาต้า EXIF
เก็บข้อมูล EXIF ในรูปแบบเดียวกับ JPEG (โครงสร้าง TIFF ดิบ) มีทั้งข้อมูลกล้อง พิกัด GPS วันเวลา และภาพขนาดย่อ จุดเสี่ยงหลักด้านความเป็นส่วนตัว
XMP:เมทาดาต้า XMP
เมทาดาต้าบนพื้นฐาน XML อาจซ้ำกับข้อมูล EXIF และมีประวัติการแก้ไข ข้อมูลซอฟต์แวร์ และฟิลด์ที่ผู้ใช้กำหนดเองเพิ่มเข้ามาด้วย
ICCP:โปรไฟล์สี ICC
โปรไฟล์สี ICC สำหรับการจัดการสี PicScrub เก็บไว้เป็นค่าเริ่มต้น เพื่อให้สียังตรงเหมือนเดิม
แฟล็กของ VP8X
chunk VP8X ทำหน้าที่เหมือนสารบัญ คอยบอกตัวถอดรหัสว่าจะเจออะไรในไฟล์บ้าง เวลาเราลบ chunk เมทาดาต้าออก เราจึงต้องอัปเดตแฟล็กพวกนี้ด้วย ไม่อย่างนั้นตัวถอดรหัสจะไปตามหาข้อมูลที่ไม่มีอยู่แล้ว
บิตของแฟล็ก
ทำไมแฟล็กถึงสำคัญ
เมื่อ PicScrub ลบ chunk EXIF/XMP ออก มันต้องอัปเดตแฟล็กของ VP8X ให้สอดคล้องกันด้วย ไม่อย่างนั้นตัวถอดรหัสอาจคาดหวังข้อมูลที่ไม่มีอยู่จริง
PicScrub จัดการไฟล์ WebP อย่างไร
ตรวจสอบส่วนหัว RIFF
เช็กว่ามี signature RIFF....WEBP
อ่าน chunk
ไล่ดู chunk ของ RIFF ทุกตัว อ่านทั้ง FourCC และขนาด
ลบ chunk ที่เป็นเมทาดาต้า
ข้าม chunk EXIF และ XMP ตอนเขียนไฟล์ผลลัพธ์
อัปเดตแฟล็กของ VP8X
เคลียร์บิตแฟล็ก EXIF/XMP ใน chunk VP8X
คำนวณขนาดไฟล์ใหม่
อัปเดตส่วนหัว RIFF ด้วยขนาดไฟล์รวมค่าใหม่
เก็บไว้
- • ข้อมูลภาพ VP8/VP8L
- • ช่องอัลฟา ALPH
- • ข้อมูลภาพเคลื่อนไหว ANIM/ANMF
- • โปรไฟล์สี ICCP (เลือกได้)
ถูกลบ
- • เมทาดาต้า EXIF
- • เมทาดาต้า XMP
WebP แบบธรรมดากับแบบขยาย
ถ้าไฟล์ WebP ไม่มี chunk VP8X แปลว่ามันเป็น WebP "แบบธรรมดา" คือมีแค่ RIFF ห่อ chunk VP8 หรือ VP8L ตัวเดียวไว้ ไฟล์ WebP แบบธรรมดาจึงเก็บเมทาดาต้าไม่ได้เลย ถ้าคุณใส่ใจความเป็นส่วนตัว แบบนี้ถือว่าเหมาะที่สุด
WebP แบบธรรมดา
มีแค่ chunk VP8 หรือ VP8L เก็บเมทาดาต้าไม่ได้
WebP แบบขยาย
มี chunk VP8X ที่เปิดทางให้เก็บเมทาดาต้า ช่องอัลฟา และภาพเคลื่อนไหวได้