Formato WebP
El formato de imagen moderno de Google
El contenedor RIFF
Google no se inventó un contenedor nuevo para WebP. Optó por RIFF, el mismo formato que lleva transportando audio WAV y vídeo AVI desde principios de los 90. Si alguna vez has analizado un archivo WAV, ya sabes cómo funciona WebP a nivel de contenedor.
El formato usa chunks anidados con identificadores de cuatro caracteres (los códigos FourCC). Es un diseño sencillo y robusto que ha aguantado bien el paso del tiempo.
Estructura de un archivo WebP (contenedor RIFF)
Cabecera WebP
| Offset | Hex | ASCII | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | 52494646241A00005745425056503858 | RIFF$...WEBPVP8X | |||||||||||||||
| 0010 | 0A00000010000000FF0000FF00000000 | .............. | |||||||||||||||
Estructura de un chunk RIFF
Nota: los datos del chunk se rellenan hasta una longitud par con un byte nulo cuando hace falta.
Offsets clave
- • Inicio de los sub-chunks: 12 bytes (tras RIFF + tamaño + WEBP)
- • Cabecera del chunk: 8 bytes (FourCC de 4 bytes + tamaño de 4 bytes)
- • Posición del campo de tamaño: +4 desde el inicio del chunk (little-endian)
Chunks de imagen
WebP son en realidad tres formatos en uno: con pérdida (VP8), sin pérdida (VP8L) y extendido (VP8X). El tipo de chunk indica qué método de compresión se ha usado.
VP8:Compresión con pérdida
Usa el códec de vídeo VP8 para comprimir. Relación calidad/tamaño parecida a la de JPEG. Los archivos WebP simples solo contienen este chunk.
VP8L:Compresión sin pérdida
Compresión sin pérdida con predicción, transformación de color y codificación entrópica. Suele ocupar entre un 25 % y un 34 % menos que PNG.
VP8X:Formato extendido
Indica que el archivo usa funciones opcionales: animación, canal alfa, perfil ICC, EXIF o XMP. Es obligatorio cuando existe alguna de ellas.
ALPH:Canal alfa
Datos del canal alfa por separado. Se pueden comprimir con o sin pérdida, de forma independiente de los datos de color.
ANIM/ANMF:Animación
ANIM contiene los parámetros globales de la animación. Los chunks ANMF contienen cada fotograma con su información de tiempo.
Chunks de metadatos
A diferencia de los archivos WebP simples, que solo contienen los datos de la imagen, los WebP extendidos pueden llevar metadatos. La buena noticia es que esos chunks están claramente separados de los datos de la imagen, así que son fáciles de identificar y de eliminar.
EXIF:Metadatos EXIF
Contiene datos EXIF en el mismo formato que JPEG (estructura TIFF en bruto). Incluye la información de la cámara, las coordenadas GPS, la fecha y hora, y las miniaturas. El principal problema de privacidad.
XMP:Metadatos XMP
Metadatos basados en XML. Pueden duplicar los datos EXIF y añadir el historial de edición, información del software y campos personalizados.
ICCP:Perfil de color ICC
Perfil de color ICC para la gestión del color. PicScrub lo conserva por defecto para mantener la fidelidad del color.
Los indicadores de VP8X
El chunk VP8X funciona como un índice: le dice al descodificador qué puede esperar del archivo. Cuando eliminamos chunks de metadatos, también tenemos que actualizar estos indicadores; si no, el descodificador buscará datos que ya no están ahí.
Bits de los indicadores
Por qué importan los indicadores
Cuando PicScrub elimina los chunks EXIF/XMP, también tiene que actualizar los indicadores VP8X para reflejar que ya no están. Si no, los descodificadores pueden esperar datos que no existen.
Cómo procesa PicScrub los WebP
Validar la cabecera RIFF
Comprobar la firma RIFF....WEBP
Analizar los chunks
Recorrer todos los chunks RIFF leyendo su FourCC y su tamaño
Eliminar los chunks de metadatos
Saltar los chunks EXIF y XMP al escribir el resultado
Actualizar los indicadores VP8X
Poner a cero los bits de EXIF/XMP del chunk VP8X
Recalcular el tamaño del archivo
Actualizar la cabecera RIFF con el nuevo tamaño total
Se conserva
- • Datos de imagen VP8/VP8L
- • Canal alfa ALPH
- • Datos de animación ANIM/ANMF
- • Perfil de color ICCP (opcional)
Se elimina
- • Metadatos EXIF
- • Metadatos XMP
WebP simple frente a WebP extendido
Si un archivo WebP no tiene chunk VP8X, es un WebP "simple": solo la envoltura RIFF alrededor de un único chunk VP8 o VP8L. En un WebP simple no caben metadatos, así que, si te preocupa la privacidad, son la opción ideal.
WebP simple
Solo contiene un chunk VP8 o VP8L. No admite metadatos.
WebP extendido
Tiene un chunk VP8X que habilita metadatos, canal alfa y animación.