Una pregunta “al azar” destapó una capacidad de hace 30 años
El 17 de julio, el conocido investigador de seguridad lcamtuf (Michał Zalewski) publicó en Mastodon una idea a voleo:
“progressive JPEGs send the low-frequency data first, then progressively refine. I bet you could do it backwards — make a ‘regressive JPEG’ that starts looking fine and slowly becomes something terrible.”
Esta publicación no generó una gran discusión en la comunidad técnica —pero alguien la vio, y además se puso a ello.
Dos días después, el desarrollador Maurycy publicó en la comunidad técnica Lobsters su resultado: no solo se puede hacer una “imagen regresiva”, sino que un solo archivo JPEG puede animarse como un GIF. El hilo llegó a △95 puntos y se convirtió en el contenido más votado del día.

▲ Fuente: maurycyz.com. Un mismo archivo JPEG, cargado en distintas etapas, muestra gatos distintos: el navegador cree que todavía está “aclarándose”, pero en realidad el contenido se ha sustituido.
El estándar JPEG nació en 1992 y ya lleva 34 años. Desde las cámaras digitales hasta los álbumes de fotos del móvil y las imágenes web, cada día se ven, transmiten y guardan miles de millones de JPEG en el mundo. Y justo el mes pasado, alguien descubrió que el estándar escondía una capacidad que nadie había usado nunca: hacer animación.
Primero borroso, luego nítido: un diseño genial
Para entender el hallazgo, primero hay que explicar un diseño de los años 90.
Quien navegó en internet en sus inicios recordará que, con conexión lenta, al abrir una imagen grande el cuadro se iba dibujando línea por línea de arriba abajo. Eso se llama “JPEG de línea base” (baseline): los datos van en orden, y el navegador muestra lo que ha recibido.
Más tarde el estándar JPEG añadió una opción llamada “JPEG progresivo” (progressive). Su modo de operar es completamente distinto: primero envía el “contorno” de la imagen y luego va añadiendo detalle gradualmente.
Pongamos una analogía cotidiana:
Tu amigo está en el monte con mala señal y quiere enviarte una foto de grupo. Con el método antiguo, solo verías la foto dibujándose de arriba abajo, cuadro a cuadro. Pero con el “progresivo”, tu amigo puede enviar primero una miniatura borrosa a 1/16 —de un vistazo reconoces que es el grupo—. Luego envía los datos de detalle: expresiones, texturas de la ropa, hojas de fondo, poco a poco más nítidas.
La implementación técnica de esto consiste en dividir los datos de la imagen en varios “lotes” (en el estándar se llaman scan). Cada lote lleva una etiqueta que indica qué rango de precisión cubre. El primer lote solo contiene la información más gruesa; los siguientes añaden detalle de mayor frecuencia.
La clave está en que: el estándar exige que cada lote declare qué rango cubre, pero nunca ha dicho que los datos de los lotes siguientes tengan que describir la misma imagen que los anteriores.
Como un albarán de mensajería que no pone “debe recibirlo la misma persona”
La idea original de lcamtuf era la “JPEG regresiva”: el primer lote trae una imagen bonita, y los lotes siguientes la van cubriendo con algo feo. Por ejemplo, una foto de comida que a mitad de carga se convierte en comida podrida.
Pero Maurycy descubrió que se podía llegar más lejos.
Como los lotes posteriores pueden cubrir lo que ya se había renderizado, ¿por qué no meter varias imágenes distintas en el mismo archivo? El procedimiento es sorprendentemente simple:
Se encadenan los “segmentos de datos” de varios JPEG del mismo tamaño, se eliminan las cabeceras de marcador sobrantes en medio, y el navegador los renderiza como las distintas “capas de precisión” de una misma imagen.
Una analogía:
Envías a la empresa de mensajería una serie de paquetes, y en el albarán de cada uno pone “dirección de entrega: casa de Li, contenido: foto”. El repartidor los entrega uno tras otro, y cada vez actualiza la “foto” en casa de Li. Pero la segunda foto que recibe Li es completamente distinta de la primera: el sistema de mensajería solo comprueba que la categoría “foto” sea correcta, no que sea la misma foto.
Lo mismo pasa con el navegador. Comprueba que la etiqueta de cada lote (rango de precisión, canal de color) cumpla el estándar JPEG, pero nunca verifica “si esta imagen es el mismo contenido que la anterior”. Fielmente superpone los nuevos datos sobre el cuadro viejo, y entonces —
lo que ves cambia.
De “sustituir la imagen” a “reproducir un vídeo”
La primera versión tenía una limitación: un JPEG progresivo normal contiene unos 10 lotes (scan). La mayoría de decodificadores de navegador, tras recibir unos 10 lotes, consideran “esta imagen ya debería estar cargada” y se niegan a seguir recibiendo. Eso significa que solo caben ocho o nueve fotogramas, insuficiente para animar.
Maurycy siguió optimizando. Descubrió que podía hacer un “lote mínimo”: cada fotograma usa una sola exploración DC (solo la información de color más básica, sin detalle). Así el tamaño de una imagen queda en 1/16 de nitidez respecto a la versión completa, pero basta como un fotograma de animación.
Con este método, Chrome puede renderizar unas 90 fotogramas antes de rendirse, y Firefox aguanta más. 90 fotogramas bastan para un vídeo corto.

▲ Fuente: maurycyz.com. Un archivo JPEG estático que, aprovechando la característica de cobertura de los lotes progresivos, reproduce fotograma a fotograma la animación de un gato negro acercándose a la cámara. Es un archivo totalmente conforme al estándar JPEG, que cualquier navegador puede abrir.
¿Para qué sirve esto?
Sinceramente —para nada.
Este hack tiene un defecto fatal: no se puede controlar la velocidad de reproducción. Porque los “fotogramas por segundo” dependen enteramente de la velocidad de la red: si descarga rápido, va rápido; si lento, va lento. No tiene el mecanismo de control de tiempo que sí tienen GIF o los formatos de vídeo.
Además, la mayoría del software de visualización de imágenes deja de mostrar la imagen cuando la considera “cargada” y no la reproduce en bucle. Para ver el efecto de animación hay que cargarla gradualmente con red lenta, o usar una forma de exhibición especial.
Pero eso no importa.
Lo verdaderamente interesante es el hallazgo en sí: un estándar internacional escrito hace 30 años, leído, implementado y usado por incontables ingenieros durante 30 años, y nadie se había fijado en que podía animar —hasta que alguien lo preguntó de pasada.
El estándar ignorado, y el triunfo de la curiosidad técnica
A mí este relato me tiene un encanto especial.
El estándar JPEG —publicado por la Organización Internacional de Normalización (ISO), miles de páginas de documentación técnica, implementado por todo el software de imágenes del planeta— está ahí, inmóvil, desde hace 34 años. Cada línea de su especificación es pública; cualquiera puede leerla.
El mecanismo de “cobertura de exploración” del JPEG progresivo estaba escrito en el estándar desde el principio. lcamtuf no descubrió una vulnerabilidad nueva; solo hizo una pregunta que el estándar nunca dijo “que no se puede”: si los datos del escaneo posterior son distintos de los anteriores, ¿qué pasa?
El estándar no responde a eso —porque nunca se le ocurrió que alguien lo haría.
Y Maurycy ni siquiera escribió un programa complejo. Su código es un pequeño archivo C, cuyo trabajo es esencialmente “juntar las partes del medio de varias imágenes y quitarles las marcas de cabeza y cola”. La verdadera dificultad estaba en pensar que se podía hacer.
El mundo técnico discute demasiado sobre “mejores prácticas”, “optimización de rendimiento”, “diseño de arquitectura”. De vez en cuando aparece una historia así —alguien desentierra un documento viejo de 30 años, señala una línea y dice “aquí no dice que esté prohibido”— que recuerda la esencia misma del espíritu hacker.
Para cerrar
Si te interesa probarlo tú mismo, Maurycy ha publicado en su blog todo el código y las imágenes de ejemplo. Un archivo JPEG de pocos cientos de KB, abierto en el navegador, “revive” poco a poco durante la carga.
Claro, no es un avance tecnológico disruptivo. No reemplazará a GIF ni cambiará el panorama de los formatos de imagen. Pero es el tipo de descubrimiento que arranca una sonrisa —como encontrar bajo el suelo de una casa vieja una puerta secreta que nadie había abierto; detrás no hay tesoro, pero el momento de abrirla ya es, en sí mismo, una alegría.
Enlaces de referencia:
- Lobsters discussion: Regressive JPEGs
- lcamtuf original Mastodon question
- Maurycy tech blog: Regressive JPEGs