Aller au contenu
Images et médias

Empêcher WordPress de compresser vos images à 82 %

WordPress ré-encode chaque JPEG qu'il génère à une qualité de 82 sur une échelle de 0 à 100. Ce réglage par défaut se trouve dans WP_Image_Editor::get_default_quality() et s'applique à

Publié

WordPress ré-encode chaque JPEG qu’il génère à une qualité de 82 sur une échelle de 0 à 100. Ce réglage par défaut se trouve dans WP_Image_Editor::get_default_quality() et s’applique à chaque déclinaison que WordPress découpe à partir de votre fichier d’origine — thumbnail, medium, medium_large, large, ainsi que toutes les tailles supplémentaires enregistrées par votre thème. Pour des photographies, 82 est un compromis raisonnable entre poids du fichier et artefacts. Pour des captures d’écran, des captures d’interface, des graphiques, des logos et tout ce qui comporte du texte net ou des aplats de couleur, 82 est visiblement destructeur : vous obtenez du bruit de moustique qui grouille autour de chaque lettre et un effet de bandes sur les dégradés lisses.

Pour changer cette valeur, ajoutez un filtre et lancez un regenerate thumbnails. Pour corriger spécifiquement les captures d’écran, la meilleure solution consiste généralement à ne pas fournir de JPEG à WordPress en premier lieu.

D’où vient réellement le chiffre 82

WordPress a abaissé sa qualité JPEG par défaut de 90 à 82 dès la version 4.5 (2016), à titre d’optimisation du poids des pages. Cette valeur est renvoyée par get_default_quality() dans wp-includes/class-wp-image-editor.php et elle est lue à chaque fois que l’éditeur actif — WP_Image_Editor_Imagick si votre hébergeur dispose d’Imagick, sinon WP_Image_Editor_GD — écrit un fichier redimensionné.

Le détail important : 82 est appliqué à chaque déclinaison, et non une seule fois. Téléversez une image, et WordPress la fait passer plusieurs fois dans l’encodeur, en re-quantifiant à qualité 82 à chaque passage. Le fichier d’origine téléversé reste, lui, intact à condition d’être en dessous du seuil de grande image (2560 px sur le côté le plus long). S’il dépasse ce seuil, WordPress produit un fichier ré-encodé -scaled.jpg à qualité 82 et sert celui-ci comme taille « full ». Autrement dit, « mon image en pleine résolution est nickel mais la version affichée sur la page est baveuse » vient presque toujours d’un srcset qui sélectionne une sous-taille en qualité 82 ou le fichier -scaled.

Comment changer la qualité

Il n’y a qu’un seul filtre à accrocher. wp_editor_set_quality est le filtre moderne et canonique : il se déclenche pour le JPEG et le WebP et reçoit le type MIME, ce qui vous permet de faire un branchement :

add_filter( 'wp_editor_set_quality', function ( $quality, $mime_type ) {
    if ( 'image/jpeg' === $mime_type ) {
        return 92; // up from 82
    }
    return $quality;
}, 10, 2 );

Placez ceci dans un petit mu-plugin (wp-content/mu-plugins/) ou dans un plugin propre au site. functions.php fonctionne aussi, mais vous perdez le réglage dès que vous changez de thème.

On vous recommandera également l’ancien filtre jpeg_quality. Il se déclenche toujours (WordPress l’applique juste après wp_editor_set_quality, uniquement pour le JPEG), mais il n’y a aucune raison d’accrocher les deux — wp_editor_set_quality couvre tout ce que faisait l’ancien, et plus encore.

Ce que tout le monde oublie : ce filtre n’affecte que les images encodées après son activation. Chaque miniature déjà présente dans wp-content/uploads a été écrite à 82 et le restera. Régénérez-les :

wp media regenerate --yes

Si vous n’utilisez pas WP-CLI, le plugin Regenerate Thumbnails fait la même chose depuis l’administration.

Avant de vous fixer sur un chiffre, mieux vaut voir ce qu’une qualité donnée fait réellement à votre image plutôt que de deviner. Notre outil de qualité JPEG pour WordPress ré-encode un échantillon dans le navigateur à chaque niveau de qualité, pour que vous puissiez observer les artefacts apparaître — il rend la différence entre 82, 90 et 100 évidente sur une capture d’écran, ce qu’un simple chiffre dans un fichier de configuration ne fera jamais.

La meilleure solution pour les captures d’écran et les visuels en aplat

Augmenter le chiffre JPEG traite le symptôme. Le vrai problème avec les captures d’écran, c’est que le JPEG est le mauvais codec pour elles. La compression DCT du JPEG est optimisée pour les dégradés photographiques ; elle s’effondre sur les arêtes franches noir-sur-blanc du texte et des éléments d’interface, ce qui explique précisément pourquoi la qualité 82 est bien pire sur une capture d’écran que sur une photo de plage.

Téléversez plutôt un PNG. WordPress conserve les sous-tailles d’un PNG en PNG, et le PNG est sans perte — le filtre de qualité n’y touche pas, donc aucun artefact à aucune taille, seulement un rééchantillonnage propre. Pour une capture d’écran, un PNG bien optimisé est souvent plus léger qu’un JPEG de haute qualité de la même image, car les aplats de couleur se compressent bien en PNG et très mal en JPEG.

Si vous voulez des fichiers plus légers propres à un format avec perte, sans les dégâts du JPEG sur les arêtes, le WebP est le juste milieu — mais vous en contrôlez toujours la qualité via le même filtre wp_editor_set_quality présenté ci-dessus, en branchant sur image/webp.

Ce qu’il ne faut pas faire

Ne réglez pas la qualité à 100 globalement. C’est la réponse la plus votée sur la moitié des fils de forums, et c’est une erreur. Le JPEG en qualité 100 n’est pas sans perte — il quantifie toujours — mais il gonfle énormément chaque photographie de votre site sans aucun gain visible, ce qui dégrade le LCP et les Core Web Vitals. Augmentez le chiffre pour le format qui en a besoin, ou changez de format pour les visuels ; ne supprimez pas la compression sur tout le site.

Ne modifiez pas class-wp-image-editor.php. Changer la valeur de retour de get_default_quality() dans le cœur fonctionne jusqu’à ce que le prochain wp core update l’écrase silencieusement. Utilisez le filtre.

Ne désactivez pas les tailles d’image pour « éviter la compression ». Désactiver la génération des miniatures n’empêche pas le ré-encodage — cela casse le srcset responsive, si bien que les navigateurs téléchargent votre image en taille réelle sur les téléphones. Problème différent, résultat pire.

Ne partez pas du principe que re-téléverser corrige les images existantes. Si vous mettez le filtre en place mais sautez l’étape de régénération, chaque ancienne déclinaison est toujours en qualité 82. Le filtre n’agit que sur l’avenir.

Ne blâmez pas le fichier -scaled si vos images font moins de 2560 px — ce chemin ne s’exécute jamais pour elles. Si vous êtes concerné et que vous voulez que l’original intact soit servi, c’est un réglage distinct ; voir désactiver les images scaled.

Toujours bloqué ?

Si une taille précise reste incorrecte après la régénération, vérifiez quel fichier la page sert réellement — ouvrez l’image dans un nouvel onglet et regardez si le nom de fichier se termine par un suffixe de dimensions (-1024x768.jpg) ou par -scaled.jpg. L’inspecteur des tailles d’image affiche chaque déclinaison que WordPress génère à partir d’un seul téléversement, pour que vous puissiez voir exactement quelle taille votre srcset fournit au navigateur et arrêter de déboguer le mauvais fichier.