この質問は 特定のカスタムイメージサイズに合わせて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);
}
}
}
}
私が見つけた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サイトで画像の品質を変更するために変換を再実行する場合は、 サムネイルの再生成 プラグインを試すことができます。