PicScrub logoPicScrub
Quay lại danh sách định dạng

Định dạng WebP

Định dạng ảnh hiện đại của Google

Container RIFF

Google không tự nghĩ ra container mới cho WebP. Họ chọn RIFF, đúng cái định dạng đã cõng âm thanh WAV và video AVI từ đầu thập niên 90. Nếu bạn từng đọc một file WAV bằng code, bạn đã biết WebP hoạt động thế nào ở mức container.

Định dạng này dùng các chunk lồng nhau với định danh 4 ký tự (gọi là mã FourCC). Một thiết kế đơn giản và bền bỉ, đã trụ được qua thời gian.

Cấu trúc file WebP (container RIFF)

RIFF
Size
WEBP
VP8X
EXIF/XMP
VP8/VP8L
RIFF
4 byte
Chữ ký container
Size
4 byte
Dung lượng file trừ 8
WEBP
4 byte
Định danh định dạng
VP8X
18 byte
Cờ báo các tính năng mở rộng
EXIF/XMP
100 byte
Các chunk siêu dữ liệu
VP8/VP8L
Độ dài thay đổi
Dữ liệu ảnh

Phần đầu file WebP

Chữ ký RIFF
Dung lượng file trừ 8
Định danh WEBP
Kiểu chunk VP8X
Kích thước VP8X (10)
Các cờ VP8X
Kích thước khung vẽ
OffsetHexASCII
0000
52494646241A00005745425056503858
RIFF$...WEBPVP8X
0010
0A00000010000000FF0000FF00000000
..............

Cấu trúc một chunk RIFF

FourCCKích thướcDữ liệu
4 byte4 byte (LE)Thay đổi

Lưu ý: nếu cần, dữ liệu chunk sẽ được đệm thêm một byte null cho đủ độ dài chẵn.

Những offset quan trọng

  • • Chunk con bắt đầu ở: byte thứ 12 (sau RIFF + size + WEBP)
  • • Phần đầu chunk: 8 byte (4 byte FourCC + 4 byte kích thước)
  • • Offset của trường kích thước: +4 tính từ đầu chunk (little-endian)

Các chunk chứa ảnh

WebP thực ra là ba định dạng gộp làm một: có mất dữ liệu (VP8), không mất dữ liệu (VP8L) và mở rộng (VP8X). Kiểu chunk sẽ cho bạn biết ảnh được nén bằng cách nào.

VP8:nén có mất dữ liệu

Dùng codec video VP8 để nén. Tỉ lệ chất lượng trên dung lượng tương đương JPEG. File WebP đơn giản chỉ chứa mỗi chunk này.

VP8L:nén không mất dữ liệu

Nén không mất dữ liệu với dự đoán, biến đổi màu và mã hóa entropy. Thường nhẹ hơn PNG khoảng 25 tới 34%.

VP8X:định dạng mở rộng

Báo hiệu file có các tính năng tùy chọn: ảnh động, kênh alpha, hồ sơ ICC, EXIF hoặc XMP. Bắt buộc phải có khi dùng bất kỳ tính năng nào trong số đó.

ALPH:kênh alpha

Dữ liệu kênh alpha nằm riêng. Có thể nén có mất hoặc không mất dữ liệu, độc lập với dữ liệu màu.

ANIM/ANMF:ảnh động

ANIM chứa các tham số chung của ảnh động. Các chunk ANMF chứa từng khung hình kèm thông tin thời lượng.

Các chunk siêu dữ liệu

Khác với file WebP đơn giản chỉ chứa dữ liệu ảnh, file WebP mở rộng có thể mang theo siêu dữ liệu. Tin tốt là những chunk này tách bạch hoàn toàn khỏi dữ liệu ảnh, nên rất dễ nhận ra và dễ xóa.

EXIF:siêu dữ liệu EXIF

Chứa dữ liệu EXIF ở đúng định dạng như trong JPEG (cấu trúc TIFF thô). Gồm thông tin máy ảnh, tọa độ GPS, ngày giờ chụp và ảnh thu nhỏ. Đây là mối lo lớn nhất về quyền riêng tư.

XMP:siêu dữ liệu XMP

Siêu dữ liệu dựa trên XML. Có thể lặp lại dữ liệu EXIF, cộng thêm lịch sử chỉnh sửa, thông tin phần mềm và các trường tùy biến.

ICCP:hồ sơ màu ICC

Hồ sơ màu ICC dùng cho việc quản lý màu. PicScrub giữ lại theo mặc định để màu sắc không bị lệch.

Các cờ VP8X

Chunk VP8X đóng vai trò như một mục lục, cho bộ giải mã biết trong file có những gì. Khi xóa các chunk siêu dữ liệu, chúng tôi cũng phải cập nhật lại những cờ này, nếu không bộ giải mã sẽ đi tìm thứ không còn tồn tại.

Các bit cờ

Bit 0Dự phòng (bắt buộc bằng 0)
Bit 1Cờ ảnh động
Bit 2Có siêu dữ liệu XMP
Bit 3Có siêu dữ liệu EXIF
Bit 4Có kênh alpha
Bit 5Có hồ sơ ICC

Vì sao các cờ này quan trọng

Khi PicScrub xóa chunk EXIF/XMP, nó cũng phải cập nhật các cờ VP8X cho khớp. Nếu không, bộ giải mã có thể đi tìm dữ liệu không còn ở đó nữa.

PicScrub xử lý WebP như thế nào

1

Kiểm tra header RIFF

Xác nhận chữ ký RIFF....WEBP

2

Đọc các chunk

Duyệt qua toàn bộ chunk RIFF, đọc FourCC và kích thước

3

Xóa chunk siêu dữ liệu

Bỏ qua chunk EXIF và XMP khi ghi file mới

4

Cập nhật cờ VP8X

Xóa các bit cờ EXIF/XMP trong chunk VP8X

5

Tính lại dung lượng file

Cập nhật header RIFF với tổng dung lượng mới

Được giữ lại

  • • Dữ liệu ảnh VP8/VP8L
  • • Kênh alpha ALPH
  • • Dữ liệu ảnh động ANIM/ANMF
  • • Hồ sơ màu ICCP (tùy chọn)

Bị xóa

  • • Siêu dữ liệu EXIF
  • • Siêu dữ liệu XMP

WebP đơn giản và WebP mở rộng

Nếu một file WebP không có chunk VP8X thì đó là WebP "đơn giản": chỉ là lớp vỏ RIFF bọc quanh một chunk VP8 hoặc VP8L duy nhất. File WebP đơn giản không thể chứa siêu dữ liệu, nên nếu bạn coi trọng quyền riêng tư thì đây là lựa chọn lý tưởng.

WebP đơn giản

Chỉ chứa chunk VP8 hoặc VP8L. Không thể có siêu dữ liệu.

RIFF + WEBP + VP8/VP8L

WebP mở rộng

Có chunk VP8X, cho phép siêu dữ liệu, kênh alpha và ảnh động.

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