1 puntos por levish 4 시간 전 | Aún no hay comentarios. | Compartir por WhatsApp

Al recibir cargas de imágenes de usuarios en el backend, hay problemas que llegan silenciosamente.

  • Los JPEG pueden incluir coordenadas GPS, nombre del modelo del dispositivo y hora de captura en EXIF
  • Los metadatos de color, como los perfiles ICC, también pueden almacenarse y distribuirse tal cual
  • Si entran mezclados JPEG, PNG, GIF y WebP, el pipeline de almacenamiento/CDN/renderizado se vuelve más complejo
  • Si solo se maneja mal la orientación EXIF, la imagen puede guardarse girada 90°

smol-image-processor es un microservicio de función única que resuelve estos problemas en bloque.

Cómo funciona

Si subes una imagen a POST /process con multipart/form-data, la respuesta siempre
será WebP. Aprovecha tal cual el comportamiento de salida predeterminado de Sharp, que
descarta metadatos como el EXIF de origen y los perfiles ICC. Eso sí, la orientación EXIF
se aplica primero a los píxeles con .rotate() antes de eliminar los metadatos, para que
se conserve la orientación correcta de la imagen.

Hay dos capas de defensa.

  • Límite de cantidad de píxeles (MAX_PIXELS): incluso si el archivo es pequeño, bloquea con limitInputPixels de Sharp las imágenes que al decodificarse se expanden a cientos de millones de píxeles (decompression bomb).
  • Límite de cantidad de frames (MAX_PAGES): evita un DoS que agote memoria y CPU con GIF/WebP animados de cientos o miles de frames.

Los GIF/WebP animados se convierten a WebP animado y se conservan el retraso entre frames y el número de repeticiones del bucle. El canal alfa de PNG también se mantiene intacto.

Los encabezados de respuesta incluyen width, height, size, si es animated y la cantidad de páginas de la imagen procesada, por lo que puede guardarse directamente en la base de datos sin una etapa adicional de extracción de metadatos.

Stack

  • Runtime: Bun, framework HTTP: Elysia
  • Procesamiento de imágenes: Sharp (wrapper de libvips)
  • Imagen Docker disponible (GHCR)

Inicio rápido

docker run --rm -p 6701:6701 ghcr.io/levish0/smol-image-processor
curl -F file=@photo.jpg http://localhost:6701/process -o clean.webp

https://github.com/levish0/smol-image-processor

Aún no hay comentarios.

Aún no hay comentarios.