WebP: Formato Moderno de Imagen Web de Google
WebP es el formato de imagen royalty-free y de código abierto de Google diseñado para reemplazar JPEG, PNG y GIF en la web. Introducido en 2010, WebP logra archivos 25–35% más pequeños que JPEG con calidad visual equivalente, y 26% más pequeños que PNG en modo sin pérdida. WebP ahora es soportado por el 97% de navegadores globalmente (Chrome, Edge, Firefox 65+, Safari 16+, Opera), convirtiéndolo en el estándar de facto para entrega web optimizada.
Contenedor WebP: Arquitectura RIFF
WebP está construido sobre el contenedor RIFF (Resource Interchange File Format)—la misma arquitectura que el audio WAV:
RIFF
├── VP8 (datos de imagen con pérdida — marcador de chunk de 4 bytes)
├── VP8L (datos de imagen sin pérdida — encabezado obligatorio)
├── VP8X (formato extendido — animación, alfa, metadatos XMP)
├── ANIM (secuencia de animación — contador de fotogramas, duración)
├── EXIF (metadatos)
├── ICCP (perfil de color ICC)
└── XMP (metadatos extensibles)
Estructura de archivo (WebP mínimo con VP8):
52 49 46 46 ('RIFF')
XX XX XX XX (tamaño de archivo - 8)
57 45 42 50 ('WEBP')
56 50 38 20 ('VP8 ' chunk)
XX XX XX XX (tamaño de datos VP8)
[flujo de bits VP8…]
Ventajas del contenedor RIFF:
- Chunked: los analizadores pueden saltar chunks desconocidos (compatible hacia adelante)
- Campos de tamaño de 32 bits (máximo 4 GB)
- Estructura anidada permite múltiples códecs en un archivo
- Relleno alineado (cada chunk rellenado a límite de byte par)
Compresión Lossy: Códec VP8
VP8 (desarrollado por On2 Technologies, ahora Google) codifica imágenes con pérdida mediante:
- Macroblocks (16×16): particionados en sub-bloques 4×4 u 8×8 para codificación de transformada
- Modos de predicción: predicción intra (espacial), vectores de movimiento (predicción temporal), 4 modos directionales intra (vertical, horizontal, diagonal izquierdo/derecho) vs. bloques fijos 8×8 de JPEG
- Transformada: DCT entero (similar a JPEG, pero 4×4 DCT en sub-bloques para control más fino de detalles)
- Cuantización: 64 índices de cuantización (vs. 8 bits por coeficiente en JPEG), ajuste de QP adaptativo por macroblock
- Codificación de entropía: range coder (codificación aritmética adaptativa por contexto, ~5% mejor que Huffman)
- Filtros de post-procesamiento: deblocking, deringing (elimina artefactos de bloque en bordes)
- Control de bitrate: CRF (Constant Rate Factor) escala 0–51 (0 = sin pérdida, 51 = peor calidad)
Comparativa de calidad VP8 (destino 100 KB):
JPEG (Q=75): 1.2 MB → 100 KB (12% pérdida visual aceptable)
VP8 (CRF=20): 1.2 MB → 60 KB (calidad visual equivalente a JPEG-Q85, 33% más pequeño)
HEIC (Q=75): 1.2 MB → 55 KB (similar a WebP, solo ecosistema Apple)
Compresión Sin Pérdida: VP8L
VP8L entrega compresión sin pérdida con calidad PNG pero 30–50% mejor ratio que PNG:
- Transformada de predicción: 13 predictores por píxel (izquierda, arriba, diagonal, promedio, gradiente, etc.) reduciendo entropía
- Color cache: cache de 256 entradas de píxeles recientes (explota localidad)
- Códigos Huffman: adaptativos por imagen con códigos separados para canales R/G/B/Alfa
- Transformada: aplica transformada de color 4×4 (mezcla de canales RGB para reducción de entropía)
- Cálculo de entropía: estima costo de bits por opción de predictor, selecciona óptimo
- Ratio de compresión: PNG típicamente 300 KB → WebP-L 220 KB (27% reducción) para fotos típicas
Retención de calidad VP8L: bit-perfect sin pérdida (sin degradación de píxeles vs. PNG).
Animación y Transparencia
Canal alfa (RGBA):
Chunk VP8X: bits [3] = bandera alfa
Si está establecido, imagen contiene plano alfa de 4 canales:
├── Predictor alfa (similar a predicción VP8L)
├── Plano alfa codificado con Huffman
└── Compuesto con capa base lossy VP8
Habilita transparencia suave sin archivo alfa separado.
Animación (WebP animado):
Chunk VP8X: bits [1] = bandera de animación
Chunk ANIM:
├── Contador de bucle (0 = infinito)
├── Denominador de sincronización (100 = unidades de centisegundo)
Chunks de fotograma ANMF (repetidos):
├── Duración del fotograma (en unidades de sincronización)
├── Desplazamiento de fotograma X/Y
├── Ancho/alto del fotograma
├── Datos de imagen VP8/VP8L
Soporta fotogramas ilimitados (reemplazo de GIF), cada uno con duración específica del fotograma.
Soporte de Navegadores y Estrategia de Fallback
| Navegador | WebP (lossy) | WebP (lossless) | WebP (alfa) | WebP (anim) |
|---|---|---|---|---|
| Chrome 23+ | ✅ | ✅ | ✅ | ✅ |
| Edge 18+ | ✅ | ✅ | ✅ | ✅ |
| Firefox 65+ | ✅ | ✅ | ✅ | ✅ |
| Safari 16+ | ✅ | ✅ | ✅ | ✅ |
| Opera 12.1+ | ✅ | ✅ | ✅ | ✅ |
| IE 11 | ❌ | ❌ | ❌ | ❌ |
Soporte heredado:
<picture>
<source srcset="hero.webp" type="image/webp">
<img src="hero.jpg" alt="Hero">
</picture>
Para navegadores más antiguos (IE, Safari <16), fallback a JPEG.
Conversión y Codificación
FFmpeg (crf 20–30 lossy):
ffmpeg -i photo.jpg -c:v libwebp -q 80 photo.webp
ffmpeg -i photo.jpg -c:v libwebp -lossless 1 photo-lossless.webp
ffmpeg -i animation.gif -c:v libwebp -loop 0 animation.webp
ImageMagick (magick):
convert photo.jpg -quality 80 photo.webp
convert -coalesce animation.gif animation.webp
cwebp CLI (Google):
cwebp -q 80 photo.jpg -o photo.webp
cwebp -lossless photo.jpg -o photo-lossless.webp
Python (Pillow con libwebp):
from PIL import Image
img = Image.open('photo.jpg')
img.save('photo.webp', 'WEBP', quality=80)
img.save('photo-lossless.webp', 'WEBP', lossless=True)
Node.js (sharp):
const sharp = require('sharp');
sharp('photo.jpg')
.webp({ quality: 80 })
.toFile('photo.webp');
WebP vs. Competidores
| Métrica | WebP | JPEG | PNG | AVIF | HEIC |
|---|---|---|---|---|---|
| Compresión lossy (foto) | 60 KB | 100 KB | — | 50 KB | 55 KB |
| Compresión lossless (foto) | 220 KB | — | 300 KB | 180 KB | — |
| Transparencia | ✅ | ❌ | ✅ | ✅ | ❌ |
| Animación | ✅ | ❌ | ✅ | ❌ | ❌ |
| Soporte de navegadores | 97% | 100% | 100% | 82% | 25% (solo Apple) |
| Velocidad de codificación | Rápida | Rápida | Media | Lenta | Media |
| Sin patentes | ✅ | ⚠️ (heredado) | ✅ | ✅ | ❌ (Apple) |
WebP es la mejor opción de propósito general para entrega web moderna. AVIF ofrece compresión ligeramente mejor pero con codificación más lenta y soporte de navegadores reducido. HEIC es exclusivo de Apple e infrecuente en web.
Flujo de trabajo de optimización práctica
- Fuente: JPEG/PNG original
- Convertir a WebP lossy (CRF 20–22): ~30% reducción, pérdida imperceptible
- Convertir a WebP lossless: Para capturas de pantalla, gráficos (fallback opcional)
- Fallback: JPEG original para IE, navegadores heredados
- Lazy loading: carga de imagen diferida vía
loading="lazy" - Imágenes responsivas:
srcsetcon WebP + fallback
Ejemplo de elemento picture responsivo:
<picture>
<source srcset="hero-480w.webp 480w, hero-1200w.webp 1200w"
sizes="(max-width: 600px) 480px, 1200px"
type="image/webp">
<source srcset="hero-480w.jpg 480w, hero-1200w.jpg 1200w"
sizes="(max-width: 600px) 480px, 1200px">
<img src="hero-1200w.jpg" alt="Imagen del héroe">
</picture>
La adopción de WebP continúa creciendo. Para cualquier nuevo proyecto web, WebP (lossy) debe ser el formato primario con fallbacks JPEG/PNG.
Conversiones relacionadas
Lo más habitual al trabajar con imágenes son estas direcciones de conversión: