web-dev-qa-db-ja.com

元の画像を圧縮した後に画像のEXIF情報を保存しますか?

テストの後、私は画像アップロード後のWord Pressが元の画像の中型およびサムネイルサイズの画像を作成することに気付いた EXIF/IPTC情報なしで

私はそれがGd画像ライブラリが私のホストで使われているためであることに気づきました、そしてそれがGdライブラリがデフォルトで働く方法であるので、すべての画像情報を取り除きます。

調査後、Gdライブラリの代わりにImageMagickとImagick PHP拡張子を使用すると、生成されたサイズ変更された画像ファイルにEXIF情報が(ImageMagickのデフォルト設定で)保持されることがわかりました。


アップデート1

ImageMagickとImagick PHP拡張が私のホストにインストールされました。現在、生成されたすべての画像はEXIF/IPTC情報を保持しています(元の画像、中程度の画像、サムネイル画像、すべてEXIF/IPTCデータ付き)。

私は訪問者がサイトに高解像度の画像をアップロードすることを許可します、そして、ほとんどの場合訪問者はアップロードの前に画像を最適化/圧縮しません、そして時々画像ファイルサイズはかなり大きいです。

たとえば、12MPの画像は10 MBになることがありますが、85%のJPEG圧縮の後、ファイルサイズは2〜3倍小さくなります。

私はこの機能をfunctions.php(私のテーマフォルダ)に追加して、アップロード中に元の画像を圧縮し、ディスクスペースを節約し、それと一緒にページ上の高解像度画像のロードをスピードアップします。

// Image compression on upload, compress original image
function wt_handle_upload_callback( $data ) {
    $image_quality = 85; // 85% compression
    $file_path = $data['file'];
    $image = false;

    switch ( $data['type'] ) {
        case 'image/jpeg': {
            $image = imagecreatefromjpeg( $file_path );
            imagejpeg( $image, $file_path, $image_quality );
            break;          
        }

        case 'image/png': {
            $image = imagecreatefrompng( $file_path );
            imagepng( $image, $file_path, $image_quality );
            break;          
        }

        case 'image/gif': {         
            // Nothing to do
            break;
        }
    }

    return $data;
}
add_filter( 'wp_handle_upload', 'wt_handle_upload_callback' );

うまく機能し、元の画像は圧縮されていますが、この機能はすべての画像のEXIF/IPTCデータを削除します(少なくとも元の画像はEXITしておく必要があります)。上記の機能がなければ、元の画像とすべてのサイズ変更された画像は(ImageMagickがインストールされているため)EXIF/IPTCデータを使用していますが、元の画像はそれよりも理解されません。

EXIFを保つために上記の機能を修正、調整するには?

アップデート2

WP 4.5はいくつかの画像処理の改良と、また画像のEXIFデータを保存するためのオプションで再利用されています(私の場合はImageMagicがホスト上で使用されている場合)。 WP 4.5では、生成されたサイズ変更された画像(中およびサムネイル)のEXIFを保持または削除するために使用できる新しいフィルタ "image_strip_meta"が導入されました。

元の画像を圧縮するための上記の関数(元の画像およびすべてのリサイズされた画像のバージョンからすべてのEXIFデータを削除する)を使用する場合、このフィルタを使用して元の画像にEXIFを保存できますか?

または、アップロード直後に元の画像を圧縮してEXIFを元の画像に保存するためのその他の方法はありますか。

1
Advanced SEO

問題は、あなたが WordPress Image API(WP_Image_Editor class) からの関数ではなく、 Gd library からの関数を使って画像を操作しているということです。だから、WordPressのものはあなたのコードによって生成された画像には適用されません。

WordPressのImage APIはImageMagickを利用できる場合はそれを使用し、それ以外の場合はGdライブラリを使用します。

EXIFデータを保存するには

  1. Gdライブラリを使用する場合は、 EXIF拡張 を指定してPHPをインストールし、 --enable-exif flag でPHPを設定する必要があります。
  2. ImageMagickが利用可能な場合、WordPressはそれを使用し、 EXIFおよびその他のメタデータは保持されます を使用します。また、あなたはimage_strip_metaフィルタにアクセスすることができます(Gdライブラリが使用されている場合は利用できません)。

ImageMagickがインストールされているので、Gdライブラリの代わりにそれを使用することができます。あるいは、WordPress APIを使用してください。

add_filter( 'wp_handle_upload', 'wt_handle_upload_callback' );
function wt_handle_upload_callback( $data ) {

    // get instance of WP_Image_Editor class
    $image = wp_get_image_editor( $data['file'] );

    if( ! is_wp_error( $image ) ) {
        $image->set_quality( 85 );
        $image->save( $data['file'], $data['type'] );
    }

    return $data;
}

私は上記のコードをテストしていませんそして私はあなたがそれを必要としないと思います。これをすべて行う唯一の目的が画像を圧縮することである場合、その画像はすでにWordPressによって82%の品質に圧縮されていることを知っておく必要があります( 90 before WP 4.5 )。圧縮品質を変更する必要がある場合は、単に jpeg_quality filter を使用してください。

add_filter( 'jpeg_quality', 'cyb_set_jpeg_quality' );
function cyb_set_jpeg_quality() {
    return 85;
}
2
cybmeta