web-dev-qa-db-fra.com

Définir la compression JPEG pour les tailles d'image personnalisées spécifiques

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%.

8
Amanda Duke

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 .

9
Ahmad M