Por qué me obsesiona optimizar imágenes

Trabajo con proyectos digitales desde hace años y una cosa se repite en casi todos: las imágenes mal optimizadas matan la velocidad y la conversión. Yo quiero que mis productos se vean bien y carguen rápido. No es solo estética: es experiencia de usuario, SEO y reducción de costes de hosting. En este artículo comparto mi flujo, herramientas y decisiones prácticas para reducir el peso sin sacrificar la calidad.

Principios básicos que aplico siempre

  • Priorizar propósito: ¿esa imagen es hero, producto, ícono o fondo? Cada caso tiene requisitos distintos de resolución y formato.
  • Optimizar antes de subir: trabajo las imágenes en local o en pipeline, no dependo de subir pesados y esperar a que el CDN las reduzca.
  • Servir formatos modernos: siempre que sea posible uso WebP o AVIF para navegadores compatibles y dejo JPEG/PNG como fallback.
  • Responsive y adaptativo: nunca subo una única versión de gran tamaño; implemento srcset y tamaños para diferentes pantallas.
  • Lazy loading y prioridad: pinto primero lo que se ve y perezoso el resto.

Elegir el formato correcto

El formato marca la mayor parte de la diferencia entre calidad y peso. Aquí resumo mi criterio:

Formato Cuándo usarlo Ventaja
JPEG Fotos con muchos tonos Compatibilidad máxima, buena compresión con pérdida
PNG Gráficos con transparencia o pocos colores Sin pérdida, transparencia
WebP Fotos y gráficos en navegadores modernos Peso ~25-40% menor que JPEG manteniendo calidad
AVIF Proyectos que buscan máximo ahorro Mejor compresión que WebP, aún menos soporte en ciertos entornos
SVG Íconos, logotipos y gráficos vectoriales Escalable y muy ligero si está optimizado

Mi regla práctica: generar WebP y AVIF en el pipeline y servir JPEG/PNG como fallback para navegadores antiguos. En sitios estáticos uso picture o srcset para ofrecer múltiples versiones.

Compresión: pérdida vs sin pérdida

¿Pérdida o sin pérdida? Depende. Para fotografías casi siempre uso compresión con pérdida porque el ahorro de peso es enorme y la diferencia visual suele ser mínima si ajustas la calidad. Para iconos y gráficos con texto uso compresión sin pérdida o SVG.

Algunos parámetros que suelo usar como referencia:

  • JPEG: calidad entre 60–80% según la imagen.
  • WebP: quality 60–80 o usar opciones de compresión automática.
  • AVIF: calidad similar a WebP pero con parámetros más agresivos cuando la compatibilidad está controlada.
  • PNG: aplicar PNG-quantización si es posible para reducir colores.

Herramientas que uso

En mi flujo incorporo herramientas manuales y automatizadas. Algunas favoritas:

  • Squoosh — excelente para pruebas rápidas y ver diferencias visuales entre formatos.
  • ImageOptim (macOS) / Trimage (Linux) — para optimizar imágenes locales en lote.
  • TinyPNG — útil para compresión rápida con muy buenos resultados en PNG/JPEG.
  • Imagemin — para automatizar en builds; plugins para WebP/AVIF.
  • Cloudinary o Imgix — servicios que hacen transformación y optimización on-the-fly, muy útiles para catálogos grandes.

Responsive images: srcset y sizes

Una de las mejores inversiones en tiempo es configurar correctamente srcset y sizes. Así el navegador descarga la versión óptima según el ancho de la pantalla y la densidad de píxeles.

Ejemplo simplificado que siempre uso:

<img src="imagen-800.jpg" srcset="imagen-400.jpg 400w, imagen-800.jpg 800w, imagen-1200.jpg 1200w" sizes="(max-width: 600px) 100vw, 50vw" alt="Descripción">

Esto reduce descargas innecesarias en móviles y evita servir un 1200px a una pantalla pequeña.

Retina y densidades de pantalla

Para imágenes rasterizadas en interfaces que deben verse nítidas en pantallas retina suelo proveer versiones @1x y @2x (o incluso @3x para casos puntuales). Con srcset también puedes declarar versiones por densidad:

<img src="logo.png" srcset="logo.png 1x, [email protected] 2x" alt="Logo">

Sin embargo, para iconos y gráficos vectoriales prefiero SVG: son nítidos sin duplicar peso.

Lazy loading y prioridad de carga

Aplico lazy loading en imágenes que no están en el viewport inicial usando el atributo loading="lazy" o librerías como lozad.js si necesito soporte adicional. Para imágenes above-the-fold las cargo normalmente y a veces uso un placeholder ligero (blur-up) para mejorar la percepción de velocidad.

Automatización en el pipeline

En proyectos con despliegues continuos integro optimización en el build:

  • Generar múltiples tamaños y formatos con scripts (Imagemin, Sharp).
  • Subir versiones optimizadas a un CDN (Cloudflare, Fastly, S3 + CloudFront).
  • Usar transformaciones bajo demanda (Cloudinary, Imgix) cuando el catálogo es grande y cambian los requisitos.

Esto evita errores humanos y garantiza coherencia entre entornos.

SEO y accesibilidad

Optimizar no es solo peso: también es semántica. Siempre añado atributos alt descriptivos y, cuando es relevante, atributos width y height en las imágenes para evitar reflow (layout shift). Google valora el CLS bajo y imágenes que no hacen saltos de diseño.

Metadatos, perfiles de color y privacidad

Antes de subir, elimino metadatos EXIF que no sean necesarios (salvo cuando uso información técnica para galerías). También convierto imágenes a sRGB para evitar diferencias de color entre navegadores. Esto reduce peso y protege información sensible.

Casos prácticos y ejemplos reales

En un e-commerce reduje el peso medio de imágenes de producto de 600 KB a 120 KB usando AVIF con fallback WebP/JPEG, generando tres tamaños por imagen y sirviendo desde Cloudinary. Resultado: mejora de 40% en First Contentful Paint y aumento del 8% en conversiones organicas. No es magia: fue aplicar los principios descritos.

Errores frecuentes que evito

  • Subir imágenes exportadas directamente desde la cámara sin procesarlas.
  • Usar PNG para fotografías por defecto.
  • No ofrecer fallbacks para navegadores antiguos.
  • No medir antes y después: siempre hago pruebas con Lighthouse o WebPageTest.

Si quieres, puedo compartir un pequeño script de ejemplo para generar WebP y AVIF con Sharp o una configuración de Imagemin para tu proyecto. Dime qué stack usas y lo adaptamos.