特定のカスタム画像サイズにJPEG圧縮を設定する


8

さまざまなカスタム画像サイズ(によるadd_image_size)を使用しており、このフィルターを使用してJPEG圧縮を30%に設定しました。

function jpeg_quality_callback($arg) {
   return (int)30;
}
add_filter('jpeg_quality', 'jpeg_quality_callback');

私が間違っていない場合、上記のコードはすべてのカスタム画像サイズを30%で圧縮します。では、splash1およびという名前の2つのカスタム画像サイズについてsplash2、圧縮率を80%に設定します。これはどのようにして可能ですか?

または、これらの画像サイズを30%圧縮フィルターから除外します。

回答:


9

'jpeg_quality'フィルターフック関数は2つの引数を受け入れます$jpeg_qualityし、$function解雇されたフィルターフック内から関数があるとのいずれかになりますimage_resizewp_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);
        }
    }
}
?>

次に、プラグインページにアクセスしてプラグインをヒットactivateUpdate JPEG Qualityます。これにより、以前にアップロードしたすべての.jpeg画像がループされ、プラグインで指定した値と条件に従って品質が調整されます。その後、このプラグインを安全に非アクティブ化して削除できます。本番サイトに適用する前に、まずテスト環境でテストしてください


これは非常に興味深い回答です。「splash1」と「splash2」の両方をIFステートメントに追加するにはどうすればよいですか?:if($ size == 'splash')...
Amanda Duke

1
@AmandaDuke:でifステートメントを拡張できelseifます。私のアップデートをご覧ください。
Ahmad M

2
@Ahmadコードにバグがあります。画像をアップロードするときに、最小カスタム画像サイズのサイズよりも小さい場合、次のエラーが表示されますInvalid argument supplied for foreach()。したがって、基本的に、カスタムイメージが作成されていない場合、エラーが表示されます。この問題を解決する方法を知っていますか?
アマンダデューク

1
@AmandaDukeそれを指摘してくれてありがとう。このエラー$attach_meta['sizes']は、配列であることが予期されているために発生しますが、この場合はそうではありません。私たちは、カスタムイメージのサイズを持っていけない場合は、ほとんどのケースでは、これはのみ発生することができなければならない我々は、デフォルトの画像サイズを指定しないでください>メディア設定-設定。安全を確保し、配列があることを確認するために、foreachループに渡す前にチェックを追加できますif (is_array($attach_meta['sizes']))。更新されたコードをご覧ください。
Ahmad M

1
@AmandaDuke:コードの両方のブロックが更新されました。最初のブロックは前にありました:if ( $post->post_mime_type == 'image/jpeg' )そして今それはif ( $post->post_mime_type == 'image/jpeg' && is_array($attach_meta['sizes']) )
Ahmad M
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.