smol-image-processor – microservicio que normaliza a WebP tras eliminar EXIF/metadatos (Bun/Elysia)
(github.com/levish0)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
limitInputPixelsde 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
Aún no hay comentarios.