Débusquer un bug silencieux d'Imagick pour vraiment compresser en AVIF
Cas interne, déshumanisé : un paramètre de qualité ignoré sans erreur ni avertissement, sur notre propre pipeline de traitement d'images.
- Date
- Mars 2026
- Portée
- pipeline de traitement d'images websource.fr
- Format cible
- AVIF
- Cause racine
- paramètre de qualité ignoré par l'API PHP Imagick
- Correctif
- encodage via l'utilitaire ligne de commande `convert -quality`

Contexte & enjeux
L'AVIF permet un gain de poids important par rapport au JPEG ou au WebP à qualité équivalente, mais ce gain dépend entièrement du bon réglage de la compression au moment de la génération. Notre pipeline d'upload et de traitement d'images en PHP s'appuyait sur l'API objet Imagick pour convertir les images vers ce format, y compris en passant explicitement un paramètre de qualité.
Problème rencontré
Les images générées étaient bien au format AVIF, mais leur poids restait anormalement proche du fichier source - symptôme d'une compression qui ne s'appliquait pas réellement. En creusant, le paramètre de qualité transmis via l'API PHP Imagick était silencieusement ignoré par l'encodeur AVIF sur la version d'ImageMagick installée en production, sans erreur ni avertissement renvoyé par PHP. Le pire type de bug : invisible côté code, sans exception à intercepter, détectable uniquement en comparant le poids réel des fichiers générés.
Objectifs
- Obtenir une compression AVIF effective et mesurable.
- Ne plus dépendre d'un comportement non documenté de l'extension PHP.
- Conserver le reste du pipeline inchangé (redimensionnement, nommage versionné compatible avec le cache immuable du CDN).
Solution technique mise en place
Contournement du bug en confiant l'encodage au binaire `convert` d'ImageMagick appelé en ligne de commande depuis PHP (`convert source -quality XX destination.avif`), qui respecte correctement le paramètre de qualité contrairement à l'API objet PHP. Le reste du pipeline - redimensionnement, nommage versionné des fichiers pour rester compatible avec un cache CDN configuré en immuable - reste inchangé.
Qualité et vérification
- Comparaison systématique du poids de fichier avant/après génération, plutôt que de faire confiance à la seule absence d'erreur.
- Bascule progressive validée sur un échantillon avant généralisation à l'ensemble du pipeline.
Les résultats
Poids moyen d'une image AVIF générée
Avantquasi identique au fichier source
Aprèsréduction nette après correctif
Détection du bug
Avantaucune alerte, comportement silencieux
Aprèscomparaison de poids systématique après génération
Méthode de génération
AvantAPI objet PHP Imagick
Aprèsappel en ligne de commande `convert -quality`
Fiabilité du réglage de qualité
Avantdépendante d'un comportement non documenté
Aprèsvérifiée et reproductible
Services & expertises mobilisés
- Audit de pipeline de traitement et de compression d'images.
- Diagnostic de bugs silencieux dans une extension PHP tierce (pas d'exception, pas de log).
- Mise en place d'une génération AVIF fiable et mesurable.
- Compatibilité avec un cache CDN immuable (nommage versionné des assets).