web-dev-qa-db-fra.com

Comment définir la compression d'image jpg pour les tailles de vignettes spécifiques?

Cette question a été posée sur Configurez la compression JPEG pour des tailles d'image personnalisées spécifiques et a répondu très gentiment à Ahmad M

Bien sûr, je voudrais commenter ce sujet, mais je n'ai pas une réputation de 50 points ...

Le code que j'utilise est à peu près le même que dans la réponse d'Ahmed, mais le problème auquel je suis confronté est si j'utilise une taille de vignette spécifique dans mon thème. Par exemple, j'ai une grille de petites boîtes dans ma page d'accueil et elles ont des images de 260 pixels de large. Si l'image téléchargée est à l'origine plus petite que ce que l'image aurait redimensionné par la fonction par Ahmed, elle ne sera bien sûr pas redimensionnée (elle ne devrait pas l'être), mais ne compresse pas non plus l'image.

Exemple:

Si je télécharge une image 1200x800 et l’utilise dans ma page d’accueil, elle sera redimensionnée à une taille plus petite (520 pixels de large, ce qui correspond à 260 pixels x 2 pour les écrans Retina) et la qualité est compressée. Agréable! Mais si je télécharge une image qui a déjà une largeur de 500 pixels (moins de 520 pixels), elle ne sera pas redimensionnée, mais elle ne sera pas compressée non plus. Très rapidement, le site Web de mes clients contient de nombreuses images avec une taille de fichier importante et se charge lentement.

Comment modifier cette fonction pour toujours compresser les images dans la qualité souhaitée des miniatures, quelles que soient leurs dimensions d'origine?

Code:

    //featured-image support
    add_theme_support( 'post-thumbnails' ); 

    add_image_size( 'newsbox-thumb', 520, 9999 ); // masonry news box-images =260px (520 retina) and unlimited height
    add_image_size( 'fprelease-thumb', 112, 9999 ); // fprelese feed logo, 56px (112px retina)


    // https://wordpress.stackexchange.com/questions/74103/set-jpeg-compression-for-specific-custom-image-sizes
    // 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 == 'newsbox-thumb') {
                    // set the jpeg quality for 'newsbox-thumb' size
                    imagejpeg($resource, $image, 60);
                } elseif ($size == 'fprelease-thumb') {
                    // set the jpeg quality for the 'fprelease-thumb' size
                    imagejpeg($resource, $image, 85);
                } else {
                    // set the jpeg quality for the rest of sizes
                    imagejpeg($resource, $image, 80);
                }

                // or you can skip a paticular image size
                // and set the quality for the rest:
                // if ($size == 'splash') continue;

                imagedestroy($resource);
            }
        }
    }
}
2
Ketri

Une solution que j'ai trouvée consistait à inclure l'image d'origine dans le tableau $sizes. Comme cela, après toutes les conversions vers d'autres tailles, l'image téléchargée sera également convertie dans sa même taille et dans une autre qualité donnée.

Veuillez noter qu'en faisant cela, vous perdrez l'image d'origine et si vous ajoutez une autre taille après le premier téléchargement de l'image, la qualité des conversions suivantes sera affectée.

add_theme_support( 'post-thumbnails' ); 
add_image_size( 'newsbox-thumb', 520, 9999 ); // masonry news box-images =260px (520 retina) and unlimited height
add_image_size( 'fprelease-thumb', 112, 9999 ); // fprelese feed logo, 56px (112px retina)


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' )
        return false;

    if ( ! $post = get_post( $attach_id ) )
        return false;

    if ( 'image/jpeg' != $post->post_mime_type )
        return false;

    $original = array(
        'original' => array(
            'file' => $attach_meta['file'],
            'width' => $attach_meta['width'],
            'height' => $attach_meta['height']
        )
    );
    $sizes = !empty( $attach_meta['sizes'] ) && is_array( $attach_meta['sizes'] )
        ? $attach_meta['sizes']
        : array();
    $sizes = array_merge( $sizes, $original );

    $pathinfo = pathinfo( $attach_meta['file'] );
    $uploads = wp_upload_dir();
    $dir = $uploads['basedir'] . '/' . $pathinfo['dirname'];

    foreach ( $sizes as $size => $value ) {

        $image = 'original' == $size
            ? $uploads['basedir'] . '/' . $value['file']
            : $dir . '/' . $value['file'];
        $resource = imagecreatefromjpeg( $image );

        if ( $size == 'original' )
            $q = 70; // quality for the original image
        elseif ( $size == 'newsbox-thumb' )
            $q = 60;
        elseif ( $size == 'fprelease-thumb' )
            $q = 85;
        else
            $q = 80;

        imagejpeg( $resource, $image, $q );
        imagedestroy( $resource );

    }

}

Et si vous souhaitez relancer la conversion pour modifier la qualité des images sur les sites Web de vos clients, vous pouvez essayer le plug-in Regenerate Thumbnails .

1
vmassuchetto