Por qué los JPEG diminutos se ven distintos en Chrome

Fuentes: Why Tiny JPEGs Look Different in Chrome

Una diferencia de renderizado entre Chrome y Firefox al mostrar un icono pequeño llevó a descubrir una optimización poco conocida en la decodificación de JPEG. El artículo explica el problema y lo resuelve de forma didáctica, paso a paso.

El JPEG se comprime dividiendo la imagen en bloques de 8×8 píxeles y convirtiendo cada bloque al dominio de la frecuencia mediante la DCT (transformada discreta del coseno). Cada bloque almacena coeficientes que indican cuánto de cada patrón —desde un color plano hasta un damero de alta frecuencia— está presente. Al reducir una imagen a un tamaño muy pequeño, la información que se pierde no es aleatoria: desaparecen sobre todo los detalles de alta frecuencia, como las hojas de un árbol o la rugosidad de su corteza.

Aprovechando este principio, Chrome (a través de Skia y la librería libjpeg-turbo) aplica una técnica llamada escalado parcial por IDCT inversa: cuando la imagen destino es lo bastante pequeña, calcula la fracción con denominador 8 más cercana al factor de reducción deseado y decodifica únicamente los coeficientes de baja frecuencia, omitiendo los de alta. El resultado se parece más a un bloque sólido que a la imagen original con sus degradados y bordes suaves, de ahí la apariencia más "gruesa" del icono.

Este método ahorra memoria y tiempo de descompresión, ya que evita expandir el JPEG completo para luego reducirlo. La técnica funciona con cualquier fracción cuyo denominador sea múltiplo de 8 y también puede emplearse para ampliar imágenes.

La conclusión práctica: el JPEG está optimizado para fotografías, no para iconos o gráficos con bordes nítidos, para los que conviene usar formatos sin pérdida o vectoriales como SVG.