J'utilise différentes tailles d'image personnalisées (par add_image_size
) et j'ai réglé ma compression JPEG à 30% avec ce filtre:
function jpeg_quality_callback($arg) {
return (int)30;
}
add_filter('jpeg_quality', 'jpeg_quality_callback');
Si je ne me trompe pas, le code ci-dessus comprime tout de mes tailles d'image personnalisées à 30%. Désormais, pour deux de mes tailles d'image personnalisées nommées splash1
et splash2
, je souhaite définir la compression à 80%. Comment est-ce possible?
Sinon, excluez ces tailles d'image du filtre de compression à 30%.
Les fonctions de hook de filtre 'jpeg_quality'
acceptent deux arguments: $jpeg_quality
et $function
, qui est la fonction à partir du hook de filtre, est déclenché et peut être image_resize
ou wp_crop_image
. Il n’ya donc aucun moyen de définir de manière sélective la qualité des images .jpeg
en fonction de la taille de l’image à partir de cette fonction de filtre croisé.
Toutefois, vous pouvez toujours vous connecter à un point d’action ultérieur lors du processus de téléchargement des pièces jointes et ajuster la qualité de l’image .jpeg
des images téléchargées à ce stade en fonction de leur taille spécifique en fonction de vos besoins. Réglez d'abord jpeg_quality
au maximum pour préserver la qualité de l'image d'origine, puis raccordez-le au crochet d'action added_post_meta
(déclenché à la fin de l'insertion de métadonnées de pièce jointe`) pour ajuster la qualité, comme suit:
// set the quality to maximum
add_filter('jpeg_quality', create_function('$quality', 'return 100;'));
add_action('added_post_meta', 'ad_update_jpeg_quality', 10, 4);
function ad_update_jpeg_quality($meta_id, $attach_id, $meta_key, $attach_meta) {
if ($meta_key == '_wp_attachment_metadata') {
$post = get_post($attach_id);
if ($post->post_mime_type == 'image/jpeg' && is_array($attach_meta['sizes'])) {
$pathinfo = pathinfo($attach_meta['file']);
$uploads = wp_upload_dir();
$dir = $uploads['basedir'] . '/' . $pathinfo['dirname'];
foreach ($attach_meta['sizes'] as $size => $value) {
$image = $dir . '/' . $value['file'];
$resource = imagecreatefromjpeg($image);
if ($size == 'spalsh') {
// set the jpeg quality for 'spalsh' size
imagejpeg($resource, $image, 100);
} elseif ($size == 'spalsh1') {
// set the jpeg quality for the 'splash1' size
imagejpeg($resource, $image, 30);
} else {
// set the jpeg quality for the rest of sizes
imagejpeg($resource, $image, 10);
}
// or you can skip a paticular image size
// and set the quality for the rest:
// if ($size == 'splash') continue;
imagedestroy($resource);
}
}
}
}
Le code ci-dessus n'affectera que les images nouvellement téléchargées. Si vous souhaitez mettre à jour la qualité des images précédemment téléchargées, vous pouvez utiliser register_activation_hook
des plugins. Créez un nouveau fichier php dans le répertoire wp-content/plugins
et nommez-le comme bon vous semble (update-jpeg-quality.php
par exemple) et ajoutez-y le code suivant:
<?php
/*
Plugin Name: Update JPEG Quality
Plugin URI: http://wordpress.stackexchange.com/questions/74103/set-jpeg-compression-for-specific-custom-image-sizes
Description: This plugin will change the jpeg image quality according to its size.
Author: Ahmad M
Version: 1.0
Author URI: http://wordpress.stackexchange.com/users/12961/ahmad-m
*/
register_activation_hook(__FILE__, 'ad_modify_jpeg_quality');
function ad_modify_jpeg_quality() {
$attachments = get_posts(array(
'numberposts' => -1,
'post_type' => 'attachment',
'post_mime_type' => 'image/jpeg'
));
if (empty($attachments)) return;
$uploads = wp_upload_dir();
foreach ($attachments as $attachment) {
$attach_meta = wp_get_attachment_metadata($attachment->ID);
if (!is_array($attach_meta['sizes'])) break;
$pathinfo = pathinfo($attach_meta['file']);
$dir = $uploads['basedir'] . '/' . $pathinfo['dirname'];
foreach ($attach_meta['sizes'] as $size => $value) {
$image = $dir . '/' . $value['file'];
$resource = imagecreatefromjpeg($image);
if ($size == 'spalsh') {
// set the jpeg quality for 'spalsh' size
imagejpeg($resource, $image, 100);
} elseif ($size == 'spalsh1') {
// set the jpeg quality for the 'splash1' size
imagejpeg($resource, $image, 30);
} else {
// set the jpeg quality for the rest of sizes
imagejpeg($resource, $image, 10);
}
imagedestroy($resource);
}
}
}
?>
Maintenant, visitez votre page Plugins et cliquez sur activate
du plugin Update JPEG Quality
. Cela va parcourir toutes vos images .jpeg
précédemment téléchargées et ajuster leur qualité en fonction des valeurs et des conditions spécifiées dans le plug-in. Ensuite, vous pouvez désactiver et supprimer ce plugin en toute sécurité. Veuillez tester l’environnement de test avant d’appliquer sur le site de production .