PicScrub logoPicScrub
Terug naar de formaten

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)

RIFF
Size
WEBP
VP8X
EXIF/XMP
VP8/VP8L
RIFF
4 bytes
Signature van de container
Size
4 bytes
Bestandsgrootte - 8
WEBP
4 bytes
Identifier van het formaat
VP8X
18 bytes
Flags voor extra functies
EXIF/XMP
100 bytes
Chunks met metadata
VP8/VP8L
Variabele lengte
Beeldgegevens

De WebP-header

RIFF-signature
Bestandsgrootte - 8
WEBP-identifier
Chunktype VP8X
Grootte van VP8X (10)
VP8X-flags
Grootte van het canvas
OffsetHexASCII
0000
52494646241A00005745425056503858
RIFF$...WEBPVP8X
0010
0A00000010000000FF0000FF00000000
..............

Opbouw van een RIFF-chunk

FourCCSizeData
4 bytes4 bytes (LE)Variabel

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

Bit 0Gereserveerd (moet 0 zijn)
Bit 1Vlag voor animatie
Bit 2XMP-metadata aanwezig
Bit 3EXIF-metadata aanwezig
Bit 4Alfakanaal aanwezig
Bit 5ICC-profiel aanwezig

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

1

De RIFF-header controleren

Nagaan of de signature RIFF....WEBP klopt

2

De chunks parsen

Alle RIFF-chunks langslopen en de FourCC en de grootte lezen

3

Metadata-chunks verwijderen

De EXIF- en XMP-chunks overslaan bij het wegschrijven

4

De VP8X-flags bijwerken

De bits voor EXIF en XMP in de VP8X-chunk op nul zetten

5

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.

RIFF + WEBP + VP8/VP8L

Extended WebP

Heeft een VP8X-chunk, die metadata, alfa en animatie mogelijk maakt.

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