PicScrub logoPicScrub
กลับไปหน้ารูปแบบไฟล์

รูปแบบไฟล์ WebP

รูปแบบไฟล์ภาพยุคใหม่จาก Google

คอนเทนเนอร์ RIFF

Google ไม่ได้คิดคอนเทนเนอร์ใหม่ขึ้นมาให้ WebP แต่เลือกใช้ RIFF ซึ่งเป็นรูปแบบเดียวกับที่ห่อไฟล์เสียง WAV และวิดีโอ AVI มาตั้งแต่ต้นยุค 90 ถ้าคุณเคยแกะไฟล์ WAV มาก่อน คุณก็เข้าใจการทำงานของ WebP ในระดับคอนเทนเนอร์อยู่แล้ว

รูปแบบนี้ใช้ chunk ซ้อนกันโดยมีตัวระบุยาว 4 ตัวอักษร (เรียกว่ารหัส FourCC) เป็นการออกแบบที่เรียบง่ายและทนทาน จนผ่านการพิสูจน์ของเวลามาได้

โครงสร้างไฟล์ WebP (คอนเทนเนอร์ RIFF)

RIFF
Size
WEBP
VP8X
EXIF/XMP
VP8/VP8L
RIFF
4 ไบต์
signature ของคอนเทนเนอร์
Size
4 ไบต์
ขนาดไฟล์ - 8
WEBP
4 ไบต์
ตัวระบุรูปแบบไฟล์
VP8X
18 ไบต์
แฟล็กของฟีเจอร์เสริม
EXIF/XMP
100 ไบต์
chunk ที่เก็บเมทาดาต้า
VP8/VP8L
ความยาวไม่คงที่
ข้อมูลภาพ

ส่วนหัวของ WebP

signature ของ RIFF
ขนาดไฟล์ - 8
ตัวระบุ WEBP
ชนิดของ chunk VP8X
ขนาดของ VP8X (10)
แฟล็กของ VP8X
ขนาดของผืนภาพ
OffsetHexASCII
0000
52494646241A00005745425056503858
RIFF$...WEBPVP8X
0010
0A00000010000000FF0000FF00000000
..............

โครงสร้างของ chunk แบบ RIFF

FourCCSizeData
4 ไบต์4 ไบต์ (LE)ไม่คงที่

หมายเหตุ: ข้อมูลใน 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 เมทาดาต้าออก เราจึงต้องอัปเดตแฟล็กพวกนี้ด้วย ไม่อย่างนั้นตัวถอดรหัสจะไปตามหาข้อมูลที่ไม่มีอยู่แล้ว

บิตของแฟล็ก

Bit 0สงวนไว้ (ต้องเป็น 0)
Bit 1แฟล็กภาพเคลื่อนไหว
Bit 2มีเมทาดาต้า XMP อยู่
Bit 3มีเมทาดาต้า EXIF อยู่
Bit 4มีช่องอัลฟาอยู่
Bit 5มีโปรไฟล์ ICC อยู่

ทำไมแฟล็กถึงสำคัญ

เมื่อ PicScrub ลบ chunk EXIF/XMP ออก มันต้องอัปเดตแฟล็กของ VP8X ให้สอดคล้องกันด้วย ไม่อย่างนั้นตัวถอดรหัสอาจคาดหวังข้อมูลที่ไม่มีอยู่จริง

PicScrub จัดการไฟล์ WebP อย่างไร

1

ตรวจสอบส่วนหัว RIFF

เช็กว่ามี signature RIFF....WEBP

2

อ่าน chunk

ไล่ดู chunk ของ RIFF ทุกตัว อ่านทั้ง FourCC และขนาด

3

ลบ chunk ที่เป็นเมทาดาต้า

ข้าม chunk EXIF และ XMP ตอนเขียนไฟล์ผลลัพธ์

4

อัปเดตแฟล็กของ VP8X

เคลียร์บิตแฟล็ก EXIF/XMP ใน chunk VP8X

5

คำนวณขนาดไฟล์ใหม่

อัปเดตส่วนหัว RIFF ด้วยขนาดไฟล์รวมค่าใหม่

เก็บไว้

  • • ข้อมูลภาพ VP8/VP8L
  • • ช่องอัลฟา ALPH
  • • ข้อมูลภาพเคลื่อนไหว ANIM/ANMF
  • • โปรไฟล์สี ICCP (เลือกได้)

ถูกลบ

  • • เมทาดาต้า EXIF
  • • เมทาดาต้า XMP

WebP แบบธรรมดากับแบบขยาย

ถ้าไฟล์ WebP ไม่มี chunk VP8X แปลว่ามันเป็น WebP "แบบธรรมดา" คือมีแค่ RIFF ห่อ chunk VP8 หรือ VP8L ตัวเดียวไว้ ไฟล์ WebP แบบธรรมดาจึงเก็บเมทาดาต้าไม่ได้เลย ถ้าคุณใส่ใจความเป็นส่วนตัว แบบนี้ถือว่าเหมาะที่สุด

WebP แบบธรรมดา

มีแค่ chunk VP8 หรือ VP8L เก็บเมทาดาต้าไม่ได้

RIFF + WEBP + VP8/VP8L

WebP แบบขยาย

มี chunk VP8X ที่เปิดทางให้เก็บเมทาดาต้า ช่องอัลฟา และภาพเคลื่อนไหวได้

RIFF + WEBP + VP8X + [ICCP] + [ANIM] + [EXIF] + [XMP] + VP8/VP8L