Het WebP-formaat
Het moderne afbeeldingsformaat van Google
De RIFF-container
Google heeft voor WebP geen nieuwe container bedacht. Ze kozen voor RIFF, hetzelfde formaat dat sinds het begin van de jaren 90 WAV-audio en AVI-video vervoert. Heb je ooit een WAV-bestand geparsed, dan weet je al hoe WebP op containerniveau in elkaar zit.
Het formaat gebruikt geneste chunks met identifiers van vier tekens (FourCC-codes). Een eenvoudig en robuust ontwerp dat zich allang bewezen heeft.
Structuur van een WebP-bestand (RIFF-container)
De WebP-header
| Offset | Hex | ASCII | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | 52494646241A00005745425056503858 | RIFF$...WEBPVP8X | |||||||||||||||
| 0010 | 0A00000010000000FF0000FF00000000 | .............. | |||||||||||||||
Opbouw van een RIFF-chunk
Let op: de data van een chunk wordt zo nodig met een nulbyte aangevuld tot een even lengte.
Belangrijke offsets
- • Begin van de sub-chunks: 12 bytes (na RIFF + size + WEBP)
- • Header van een chunk: 8 bytes (4 bytes FourCC + 4 bytes size)
- • Offset van het size-veld: +4 vanaf het begin van de chunk (little-endian)
Chunks met beeldgegevens
WebP is eigenlijk drie formaten in één: lossy (VP8), lossless (VP8L) en extended (VP8X). Aan het type chunk zie je welke compressiemethode is gebruikt.
VP8:compressie met kwaliteitsverlies
Gebruikt de VP8-videocodec om te comprimeren. Een vergelijkbare verhouding tussen kwaliteit en grootte als JPEG. Eenvoudige WebP-bestanden bevatten alleen deze chunk.
VP8L:compressie zonder kwaliteitsverlies
Lossless compressie met predictie, kleurtransformatie en entropiecodering. Meestal 25-34% kleiner dan PNG.
VP8X:het uitgebreide formaat
Geeft aan dat er optionele functies aanwezig zijn: animatie, een alfakanaal, een ICC-profiel, EXIF of XMP. Verplicht zodra een van die functies wordt gebruikt.
ALPH:het alfakanaal
De gegevens van een apart alfakanaal. Kan los van de kleurgegevens worden gecomprimeerd, met of zonder kwaliteitsverlies.
ANIM/ANMF:animatie
ANIM bevat de algemene animatie-instellingen. ANMF-chunks bevatten de losse frames, met hun timing erbij.
Metadata-chunks
Anders dan eenvoudige WebP-bestanden, die alleen beeldgegevens bevatten, kunnen uitgebreide WebP-bestanden metadata meedragen. Het goede nieuws is dat die chunks netjes los staan van de beeldgegevens, waardoor ze eenvoudig te herkennen en te verwijderen zijn.
EXIF:EXIF-metadata
Bevat EXIF-gegevens in hetzelfde formaat als JPEG (een ruwe TIFF-structuur). Denk aan camera-info, GPS-coördinaten, datum en tijd en thumbnails. Het grootste privacyrisico.
XMP:XMP-metadata
Metadata op basis van XML. Kan de EXIF-gegevens dubbelen, aangevuld met bewerkingsgeschiedenis, softwaregegevens en eigen velden.
ICCP:ICC-kleurprofiel
Het ICC-kleurprofiel voor kleurbeheer. PicScrub laat het standaard staan, zodat de kleuren blijven kloppen.
De VP8X-flags
De VP8X-chunk werkt als een inhoudsopgave: hij vertelt decoders wat ze in het bestand kunnen verwachten. Als we metadata-chunks verwijderen, moeten we die flags dus ook bijwerken, anders gaat de decoder zoeken naar gegevens die er niet meer zijn.
De losse bits
Waarom die flags ertoe doen
Als PicScrub de EXIF- en XMP-chunks weghaalt, moet het ook de VP8X-flags bijwerken om aan te geven dat ze er niet meer zijn. Anders verwachten decoders gegevens die niet meer bestaan.
Hoe PicScrub WebP verwerkt
De RIFF-header controleren
Nagaan of de signature RIFF....WEBP klopt
De chunks parsen
Alle RIFF-chunks langslopen en de FourCC en de grootte lezen
Metadata-chunks verwijderen
De EXIF- en XMP-chunks overslaan bij het wegschrijven
De VP8X-flags bijwerken
De bits voor EXIF en XMP in de VP8X-chunk op nul zetten
De bestandsgrootte herberekenen
De RIFF-header bijwerken met de nieuwe totale bestandsgrootte
Blijft staan
- • De VP8/VP8L-beeldgegevens
- • Het ALPH-alfakanaal
- • De ANIM/ANMF-animatiegegevens
- • Het ICCP-kleurprofiel (optioneel)
Gaat weg
- • EXIF-metadata
- • XMP-metadata
Simple tegenover extended WebP
Heeft een WebP-bestand geen VP8X-chunk, dan is het een "simple" WebP: alleen de RIFF-verpakking om één VP8- of VP8L-chunk heen. In zulke bestanden is metadata simpelweg niet mogelijk, dus als je op je privacy let, zijn die ideaal.
Simple WebP
Bevat alleen een VP8- of VP8L-chunk. Metadata is niet mogelijk.
Extended WebP
Heeft een VP8X-chunk, die metadata, alfa en animatie mogelijk maakt.