slimg - CLI d’optimisation d’images en Rust (54 Go → 8 Go)
(github.com/clroot)Pourquoi l’avoir créé ?
J’utilisais beaucoup l’outil Squoosh de Google, mais la version CLI renvoyait des erreurs à l’exécution, et même si la version web était utilisable... avec l’abandon typique de Google, j’ai fini par décider de le créer moi-même. J’ai cherché des alternatives, mais je n’ai rien trouvé qui me convienne.
Qu’est-ce que slimg ?
C’est un CLI d’optimisation d’images écrit en Rust. Il prend en charge la conversion entre JPEG, WebP, PNG, AVIF et QOI, ainsi que le redimensionnement et l’optimisation de la qualité. Il utilise des codecs récents comme MozJPEG, OxiPNG et ravif.
Résultats en usage réel :
J’ai optimisé en lot 54 Go de photos personnelles, et la taille est tombée à 8 Go. (réduction de 85 %) La qualité est à un niveau où la différence est presque imperceptible à l’œil nu.
# Traitement par lot d’un répertoire (parallèle)
slimg convert ./photos --format webp --quality 85 --recursive
# Redimensionnement + conversion
slimg resize photo.jpg --width 800 --format avif --quality 70
Caractéristiques techniques :
- Traitement parallèle sur tous les cœurs CPU avec Rayon
- Écrasement sûr via fichier temporaire → atomic rename
- Séparation entre la bibliothèque (
slimg-core) et le CLI (réutilisable) - Performances natives grâce aux bindings de codecs C
Installation :
brew install clroot/tap/slimg
# https://github.com/clroot/slimg/releases
GitHub: https://github.com/clroot/slimg
7 commentaires
Les bindings Kotlin de slimg ont été ajoutés. Le traitement d’images peut ainsi être effectué facilement côté serveur/backend.
J’ai moi aussi créé avec un LLM un outil qui supprime l’arrière-plan de fichiers générés en png puis les convertit en svg, afin de réduire leur taille tout en préservant la qualité. Je l’ai développé en rust, et la conversion en svg fonctionnait très bien, mais pour réduire davantage la taille des svg, je n’ai pas eu d’autre choix que d’utiliser un programme appelé svgo. svgo est excellent pour supprimer le code inutile dans les svg, mais cela semble être un domaine qui nécessite des connaissances métier, donc je m’appuyais sur svgo.
En revanche, je n’avais pas pensé à utiliser des codecs récents comme MozJPEG, OxiPNG ou ravif. J’ai moi aussi envie d’essayer. Merci pour l’inspiration.
J’utilisais jusqu’à présent SalOne22/rimage, donc il va falloir voir ce que celui-ci vaut. Le fait qu’il propose des bindings Python semble déjà être un avantage.
Des bindings Python ont également été ajoutés à slimg.
J’utilise moi aussi un outil que j’ai développé en Rust pour convertir en lot des images regroupées dans des fichiers d’archive, donc je vais essayer de remplacer les appels internes par ce dépôt.
Y a-t-il une raison particulière pour laquelle le décodage AVIF ne serait possible que sur macOS ?
Avec la version 0.1.3, le décodage AVIF est désormais possible aussi sous Windows et Linux.
Cela est dû au fait que les versions des bibliothèques gérant l’AVIF ne sont pas compatibles dans l’environnement GitHub Actions utilisé pour le build. L’environnement de build sera bientôt corrigé afin d’ajouter la prise en charge de l’AVIF sur les machines Linux également.