web-dev-qa-db-ja.com

特定のサムネイルサイズのJPEG画像圧縮を設定するにはどうすればいいですか?

この質問は 特定のカスタムイメージサイズに合わせてJPEG圧縮を設定する およびAhmad Mによって非常によく回答されました

もちろんそのスレッドにコメントしたいのですが、50ポイントの評判はありませんが….

私が使っているコードはAhmedの答えとほとんど同じですが、私がまだ直面している問題は私が私のテーマで特定のサムネイルサイズを使っているかどうかです。例えば、私は私のフロントページに小さな箱の格子を持っていて、それらは260px幅の画像を持っています。アップロードされた画像が元々Ahmedの関数によって画像がリサイズされるものよりも小さい場合、もちろんリサイズされることはありませんが、画像は圧縮されません。

例:

1200 x 800の画像をアップロードして自分のフロントページで使用すると、サイズが小さくなり(幅520ピクセル、網膜ディスプレイの場合は260ピクセル* 2)、品質が圧縮されます。いいね!しかし、500px幅(520px未満)の画像をアップロードしても、サイズは変更されませんが、圧縮されることはありません。私のクライアントのWebサイトには、非常にすばやく大きなファイルサイズの画像がたくさんあり、読み込みが遅くなります。

元のサイズに関係なく、画像を常に任意の画質に圧縮するように、この機能を変更するにはどうすればよいですか。

コード:

    //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

私が見つけた1つの解決策は、$sizes配列に元の画像を含めることでした。このように、他のサイズへのすべての変換の後に、アップロードされた画像もその同じサイズと他の特定の品質に変換されます。

これを行うと元の画像が失われ、画像が最初にアップロードされた後に他のサイズを追加すると、次の変換の品質が影響を受けることになります。

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

    }

}

また、クライアントのWebサイトで画像の品質を変更するために変換を再実行する場合は、 サムネイルの再生成 プラグインを試すことができます。

1
vmassuchetto