web-dev-qa-db-ger.com

Wie stelle ich die JPEG-Bildkomprimierung für bestimmte Thumbnail-Größen ein?

Diese Frage wurde bei JPEG-Komprimierung für bestimmte benutzerdefinierte Bildgrößen einstellen gestellt und von Ahmad M sehr gut beantwortet

Ich würde diesen Thread natürlich kommentieren, aber ich habe keinen 50-Punkte-Ruf ...

Der Code, den ich verwende, ist so ziemlich derselbe wie in Ahmeds Antwort, aber das Problem, vor dem ich immer noch stehe, ist, wenn ich in meinem Thema eine bestimmte Größe für Miniaturansichten verwende. Zum Beispiel habe ich auf meiner Startseite ein Raster mit kleineren Kästchen und sie haben 260px breite Bilder. Wenn das hochgeladene Bild ursprünglich kleiner ist als das Bild, dessen Größe durch die Funktion von Ahmed geändert werden würde, wird es natürlich nicht die Größe ändern (und sollte es auch nicht), sondern komprimiert das Bild auch nicht.

Beispiel:

Wenn ich ein 1200x800-Bild hochlade und es auf meiner Startseite verwende, wird es verkleinert (520px breit, 260px * 2 für Retina-Displays) und die Qualität wird komprimiert. Nett! Wenn ich jedoch ein Bild hochlade, das bereits 500 Pixel breit ist (weniger als 520 Pixel), wird die Größe nicht geändert, aber auch nicht komprimiert. Sehr schnell hat meine Kundenwebsite viele Bilder mit großer Dateigröße und lädt langsam.

Wie kann ich diese Funktion ändern, um die Bilder immer auf die gewünschte Qualität zu komprimieren, unabhängig von ihren ursprünglichen Abmessungen?

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

Eine Lösung, die ich gefunden habe, bestand darin, das Originalbild in das $sizes-Array aufzunehmen. So wird das hochgeladene Bild nach allen Konvertierungen in andere Größen auch in die gleiche Größe und in eine andere vorgegebene Qualität konvertiert.

Beachten Sie, dass dadurch das Originalbild verloren geht. Wenn Sie nach dem erstmaligen Hochladen des Bildes eine andere Größe hinzufügen, wirkt sich dies auf die Qualität der folgenden Konvertierungen aus.

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 );

    }

}

Wenn Sie die Konvertierung erneut ausführen möchten, um die Qualität der Bilder auf den Websites Ihres Kunden zu ändern, können Sie das Plugin Thumbnails neu generieren verwenden.

1
vmassuchetto