1 points par levish 4 시간 전 | Aucun commentaire pour le moment. | Partager sur WhatsApp

Lorsqu’un backend reçoit des uploads d’images utilisateur, certains problèmes arrivent discrètement avec eux.

  • Les JPEG peuvent contenir des coordonnées GPS, le nom du modèle de l’appareil et l’heure de prise de vue dans les EXIF
  • Des métadonnées colorimétriques comme les profils ICC peuvent aussi être stockées et diffusées telles quelles
  • Si des JPEG, PNG, GIF et WebP arrivent mélangés, le pipeline de stockage/CDN/rendu devient plus complexe
  • Une mauvaise gestion de la seule orientation EXIF peut déjà conduire à enregistrer l’image avec une rotation de 90°

smol-image-processor est un microservice à rôle unique qui traite ces problèmes en une seule fois.

Fonctionnement

Si vous envoyez une image en multipart/form-data à POST /process, la réponse renvoie toujours du WebP.
Le service exploite directement le comportement de sortie par défaut de Sharp, qui supprime les métadonnées comme les EXIF source et les profils ICC. En revanche, l’orientation EXIF est d’abord appliquée aux pixels via .rotate() avant la suppression des métadonnées, ce qui permet de préserver l’orientation de l’image.

Il y a deux couches de protection.

  • Limite du nombre de pixels (MAX_PIXELS) : même si la taille du fichier est faible, Sharp bloque via limitInputPixels les images qui gonflent au décodage jusqu’à des centaines de millions de pixels (decompression bomb).
  • Limite du nombre de frames (MAX_PAGES) : cela évite les DoS qui épuisent mémoire et CPU avec des GIF/WebP animés contenant des centaines ou des milliers de frames.

Les GIF/WebP animés sont convertis en WebP animé, avec conservation du délai entre les frames et du nombre de boucles.
Le canal alpha des PNG est également conservé tel quel.

Les en-têtes de réponse contiennent la width, la height, la size, l’indication animated ou non, ainsi que le nombre de pages de l’image traitée, ce qui permet de les enregistrer directement en base sans étape séparée d’extraction de métadonnées.

Stack

  • Runtime : Bun, framework HTTP : Elysia
  • Traitement d’image : Sharp (wrapper de libvips)
  • Image Docker fournie (GHCR)

Démarrage rapide

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

Aucun commentaire pour le moment.

Aucun commentaire pour le moment.