私は(add_image_size
による)様々なカスタム画像サイズを使用しています、そして私はこのフィルタで私のJPEG圧縮を30%に設定しました:
function jpeg_quality_callback($arg) {
return (int)30;
}
add_filter('jpeg_quality', 'jpeg_quality_callback');
私が間違っていなければ、上記のコードは all を私のカスタム画像サイズの30%に圧縮します。さて、splash1
とsplash2
という2つのカスタム画像サイズに対して、圧縮率を80%に設定したいと思います。これはどのように可能ですか?
または、30%圧縮フィルタからそれらの画像サイズを除外します。
'jpeg_quality'
フィルターフック関数は、2つの引数を受け入れます。フィルターフック内からの関数である$jpeg_quality
および$function
は起動され、image_resize
またはwp_crop_image
のいずれかです。そのため、このフィルタフック関数からの画像サイズに従って.jpeg
画像の品質を選択的に設定する方法はありません。
ただし、添付ファイルをアップロードする過程で後のアクションフックにフックし、その時点でアップロードされたイメージの.jpeg
イメージ品質をニーズに合わせて調整することができます。次のように、最初のjpeg_quality
を最大に設定して元の画質を維持し、次にadded_post_meta
アクションフック(添付メタデータの挿入の最後に起動されます)にフックして、以下のようにします。
// 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);
}
}
}
}
上記のコードは新しくアップロードされた画像にのみ影響します。以前にアップロードした画像の品質を更新したい場合は、プラグインのregister_activation_hook
を利用できます。 wp-content/plugins
ディレクトリに新しいphpファイルを作成し、好きな名前を付けて(たとえばupdate-jpeg-quality.php
)、次のコードを追加します。
<?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);
}
}
}
?>
さあ、あなたのPluginsページにアクセスして、Update JPEG Quality
プラグインのactivate
を押してください。これは以前にアップロードされたすべての.jpeg
画像をループし、プラグインで指定した値と条件に従ってそれらの品質を調整します。その後、このプラグインを安全に無効にして削除できます。 本番サイトに適用する前に、まずテスト環境でテストしてください 。