PicScrub logoPicScrub
Wróć do formatów

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)

RIFF
Size
WEBP
VP8X
EXIF/XMP
VP8/VP8L
RIFF
4 B
Sygnatura kontenera
Size
4 B
Rozmiar pliku - 8
WEBP
4 B
Identyfikator formatu
VP8X
18 B
Flagi funkcji rozszerzonych
EXIF/XMP
100 B
Chunki z metadanymi
VP8/VP8L
Zmienna długość
Dane obrazu

Nagłówek WebP

Sygnatura RIFF
Rozmiar pliku - 8
Identyfikator WEBP
Typ chunka VP8X
Rozmiar VP8X (10)
Flagi VP8X
Rozmiar płótna
OffsetHexASCII
0000
52494646241A00005745425056503858
RIFF$...WEBPVP8X
0010
0A00000010000000FF0000FF00000000
..............

Budowa chunka RIFF

FourCCRozmiarDane
4 bajty4 bajty (LE)Zmienna

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

Bit 0Zarezerwowany (musi być 0)
Bit 1Flaga animacji
Bit 2Obecne metadane XMP
Bit 3Obecne metadane EXIF
Bit 4Obecny kanał alfa
Bit 5Obecny profil ICC

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

1

Sprawdzenie nagłówka RIFF

Weryfikacja sygnatury RIFF....WEBP

2

Analiza chunków

Przejście przez wszystkie chunki RIFF i odczyt FourCC oraz rozmiaru

3

Usunięcie chunków z metadanymi

Pominięcie chunków EXIF i XMP przy zapisie wyniku

4

Aktualizacja flag VP8X

Wyzerowanie bitów flag EXIF/XMP w chunku VP8X

5

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.

RIFF + WEBP + VP8/VP8L

Rozszerzony WebP

Ma chunk VP8X, który umożliwia metadane, kanał alfa i animację.

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