Regressive JPEGs : cuando un desarrollador invierte el algoritmo para crear imágenes que retroceden

Dev & Código Jul 18, 2026Añadir a favoritos

Regressive JPEGs : cuando un desarrollador invierte el algoritmo para crear imágenes que retroceden
Ilustración : Momiji Shirogane

Un entusiasta publica una exploración inversa del códec JPEG: generar imágenes que, al decodificarse, produzcan artefactos deliberados jugando con la cuantificación DCT. Curioso, instructivo y un excelente ejercicio para comprender el formato.

El proyecto

En la página principal de Hacker News esta semana, un artículo titulado « Regressive JPEGs » (maurycyz.com/projects/bad_jpeg/) llamó nuestra atención. Su autor documenta una exploración inversa del códec JPEG: en lugar de optimizar una imagen para tamaño y calidad, genera JPEG deliberadamente degradados manipulando las tablas de cuantificación y los bloques DCT (Transformada Discreta del Coseno).

No es una herramienta de producción, pero es un excelente pretexto para entender cómo funciona JPEG bajo el capó: un formato que la mayoría de los desarrolladores usan sin haber leído nunca la especificación.

Recordatorio: cómo JPEG codifica

JPEG (Joint Photographic Experts Group, estándar ISO/IEC 10918-1 de 1992) sigue un flujo clásico:

  1. Conversión RGB → YCbCr - separa luminancia y crominancia
  2. Submuestreo de la crominancia (a menudo 4:2:0)
  3. División en bloques 8×8
  4. DCT - transforma cada bloque del dominio espacial al dominio frecuencial
  5. Cuantificación - divide los coeficientes DCT por una tabla de cuantificación (el verdadero control de compresión)
  6. Escaneo en zig-zag + Huffman - codifica los coeficientes en flujo binario

La calidad percibida depende principalmente del paso 5: cuanto más agresiva sea la tabla de cuantificación, más se pierden detalles en las altas frecuencias.

Lo que hace « Regressive JPEGs »

El autor desvía este mecanismo. Al construir tablas de cuantificación exóticas (valores muy altos en ciertas frecuencias, valores anormalmente bajos en otras), produce JPEG que, al ser leídos por un decodificador estándar, exhiben:

  • Bloques 8×8 visibles (artefactos de bloqueo extremos)
  • Patrones de ringing (oscilaciones alrededor de los contornos)
  • Colores que « sangran » debido al submuestreo de crominancia forzado
  • Incluso imágenes totalmente irreconocibles al decodificarse

El interés pedagógico es real: se ven a simple vista los efectos de cada parámetro del códec en la preservación de la imagen.

¿Aplicaciones serias?

Más allá de la curiosidad, hay algunos usos legítimos:

  1. Pruebas de robustez de decodificadores - un decodificador JPEG real debe manejar archivos malformados sin fallar. Generar JPEG intencionalmente raros es un fuzz-test artesanal.
  2. Marcado de agua / esteganografía - entender a fondo la cuantificación ayuda a ocultar información en los coeficientes DCT (técnica usada por F5, OutGuess).
  3. Comprensión de artefactos en ML - los modelos de superresolución entrenados con JPEG deben aprender a distinguir contenido y artefacto. Un conjunto de datos de « bad JPEGs » es útil.

En el fondo, este tipo de proyectos muestra que un formato que creemos una caja negra siempre esconde palancas explotables, ya sea para lo mejor o por pura curiosidad.

Para profundizar

La especificación original de JPEG (ITU T.81 / ISO 10918-1) es extensa pero legible, y es la mejor entrada para entender qué ve realmente un decodificador. En cuanto a herramientas, libjpeg-turbo (Darrell Commander) permite inspeccionar las tablas de cuantificación de un archivo mediante djpeg -verbose: una excelente forma de verificar qué almacenó el códec en un JPEG concreto.

Para recordar: los formatos de archivo no son cajas negras. Leer un poco de especificación (JPEG, PNG, WebP) convierte a cualquier desarrollador en un mejor usuario de las herramientas de imagen que usa a diario.

Resources

Artículo producido por inteligencia artificial, revisado bajo control editorial humano.

Nuestra redacción
¿Te ha resultado útil este artículo?

10 personas han valorado este artículo

Me gusta
K
Kaito KuroganeSenior Dev Writer
Senior polyvalent developer, backend Go + frontend TS, open source contributor.
Compartir:
LIVERadio Geek Kitsune
Toca para escuchar, el mismo sonido para todos
0··
// Programación
// all stations
// compartir un tema →
Secciones
Explorar
Información