Format WebP
Nowoczesny format obrazu od Google
Kontener RIFF
Google nie wymyślił dla WebP nowego kontenera. Sięgnął po RIFF, ten sam format, który od początku lat 90. nosi dźwięk WAV i wideo AVI. Jeśli zdarzyło ci się kiedyś parsować plik WAV, na poziomie kontenera znasz już WebP.
Format używa zagnieżdżonych chunków z czteroznakowymi identyfikatorami (nazywanymi kodami FourCC). To prosty i solidny projekt, który przetrwał próbę czasu.
Struktura pliku WebP (kontener RIFF)
Nagłówek WebP
| Offset | Hex | ASCII | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | 52494646241A00005745425056503858 | RIFF$...WEBPVP8X | |||||||||||||||
| 0010 | 0A00000010000000FF0000FF00000000 | .............. | |||||||||||||||
Budowa chunka RIFF
Uwaga: dane chunka są w razie potrzeby dopełniane bajtem zerowym do parzystej długości.
Najważniejsze offsety
- • Początek podchunków: 12 bajtów (po RIFF + rozmiar + WEBP)
- • Nagłówek chunka: 8 bajtów (4 bajty FourCC + 4 bajty rozmiaru)
- • Offset pola rozmiaru: +4 od początku chunka (little-endian)
Chunki z obrazem
WebP to tak naprawdę trzy formaty w jednym: stratny (VP8), bezstratny (VP8L) i rozszerzony (VP8X). Typ chunka mówi, której metody kompresji użyto.
VP8:kompresja stratna
Kompresja oparta na kodeku wideo VP8. Stosunek jakości do rozmiaru podobny jak w JPEG. Proste pliki WebP zawierają tylko ten chunk.
VP8L:kompresja bezstratna
Kompresja bezstratna z predykcją, transformacją kolorów i kodowaniem entropijnym. Zwykle daje pliki o 25-34% mniejsze niż PNG.
VP8X:format rozszerzony
Sygnalizuje obecność funkcji opcjonalnych: animacji, kanału alfa, profilu ICC, danych EXIF albo XMP. Wymagany, gdy którakolwiek z nich występuje.
ALPH:kanał alfa
Osobne dane kanału alfa. Mogą być skompresowane bezstratnie albo stratnie, niezależnie od danych kolorów.
ANIM/ANMF:animacja
ANIM zawiera globalne parametry animacji. Chunki ANMF zawierają poszczególne klatki wraz z informacją o czasie wyświetlania.
Chunki z metadanymi
W odróżnieniu od prostych plików WebP, które zawierają wyłącznie dane obrazu, pliki rozszerzone mogą nieść metadane. Dobra wiadomość jest taka, że te chunki są czysto oddzielone od danych obrazu, więc łatwo je rozpoznać i usunąć.
EXIF:metadane EXIF
Zawiera dane EXIF w tym samym formacie co JPEG (surowa struktura TIFF). Obejmuje dane aparatu, współrzędne GPS, datę i godzinę oraz miniatury. Główne zagrożenie dla prywatności.
XMP:metadane XMP
Metadane oparte na XML. Mogą powielać dane EXIF, a do tego dorzucać historię edycji, dane o oprogramowaniu i własne pola.
ICCP:profil koloru ICC
Profil koloru ICC do zarządzania kolorem. PicScrub domyślnie go zostawia, żeby kolory pozostały wierne.
Flagi VP8X
Chunk VP8X działa jak spis treści: mówi dekoderom, czego mają się spodziewać w pliku. Kiedy usuwamy chunki z metadanymi, musimy też zaktualizować te flagi, inaczej dekoder będzie szukał danych, których już nie ma.
Bity flag
Dlaczego flagi mają znaczenie
Kiedy PicScrub usuwa chunki EXIF/XMP, musi też zaktualizować flagi VP8X, żeby odzwierciedlały ich brak. Inaczej dekodery mogą oczekiwać danych, których już nie ma.
Jak PicScrub przetwarza pliki WebP
Sprawdzenie nagłówka RIFF
Weryfikacja sygnatury RIFF....WEBP
Analiza chunków
Przejście przez wszystkie chunki RIFF i odczyt FourCC oraz rozmiaru
Usunięcie chunków z metadanymi
Pominięcie chunków EXIF i XMP przy zapisie wyniku
Aktualizacja flag VP8X
Wyzerowanie bitów flag EXIF/XMP w chunku VP8X
Przeliczenie rozmiaru pliku
Wpisanie nowego całkowitego rozmiaru do nagłówka RIFF
Co zostaje
- • Dane obrazu VP8/VP8L
- • Kanał alfa ALPH
- • Dane animacji ANIM/ANMF
- • Profil koloru ICCP (opcjonalnie)
Co usuwamy
- • Metadane EXIF
- • Metadane XMP
WebP prosty kontra rozszerzony
Jeśli plik WebP nie ma chunka VP8X, jest to „prosty” WebP: sama otoczka RIFF wokół pojedynczego chunka VP8 albo VP8L. W prostych plikach WebP metadane są w ogóle niemożliwe, więc jeśli zależy ci na prywatności, są idealne.
Prosty WebP
Zawiera tylko chunk VP8 albo VP8L. Metadane niemożliwe.
Rozszerzony WebP
Ma chunk VP8X, który umożliwia metadane, kanał alfa i animację.