WordPressのEWWWプラグインではEXIF情報が消えない場合が!その画像にはGPS情報が残っているかも?

2020年6月13日日記と雑記

スマホやデジカメで撮った写真にはいろいろな情報が入っています。

それはEXIF情報と言って、日時・機種名・撮影した場所(位置情報)などがあります。

とくに問題なのは位置情報。これは個人ブログならできれば消しておきたい情報ですね。

WordPressプラグインでEXIF情報を削除するならEWWW Image Optimizer

…と、グーグルで検索すると真っ先に出てきます。

実際、ブログ主もいくつかの画像処理プラグインを比較してみましたが、確かにEWWW Image Optimizerが一番使い勝手が良かったです。

EWWWのメタデータ削除機能
EWWWのメタデータ削除機能

EWWWを入れておけば安心❗

そう思っていた時期もありました…。

しかし❗

EWWW Image OptimizerではEXIF情報が消えないパターンが存在するのです❗❗

これは強くみなさんに【警告】しておきたいので、あえて記事にしました。

なお、以下の記述はすべて無料版のEWWW Image Optimizerが対象となります。

EXIF情報が削除されないのはこんな時

それでは、どういう場合にEXIF情報が残ってしまうのでしょうか?

それは、すでに最適化を施している画像をアップロードした場合です。

すでに最適化されたJPEG画像ファイルは「最適化不要」と判断されてスキップされてしまうのです。

無料版のEWWW Image Optimizerの場合、画像劣化を伴う処理を行わないため圧縮率は低めです。

そのため、他のJPEG最適化ツールにかけたファイルはほぼこの現象が起きると考えてください。

また、サイズが小さい画像(100×100等)の場合にも発生しやすいようです。

EWWWの変換結果一覧表
EWWWの変換結果一覧表

メディアライブラリの「画像最適化」欄から見ることのできる変換結果一覧表(上記画像)で「節約なし」となっている場合、EXIF削除は行われていません。

とくに「Full(オリジナル画像)」が「節約なし」になっていたら完全にアウトです。

Instagramアプリの画像にご注意

ブログ主の場合は【Instagramアプリがスマホ内に保存した画像】で問題が起きました。

これは最適化をかけているにもかかわらず位置情報を残しているというある種特殊な画像です。

そのためEWWW Image Optimizerの画像処理をスキップしてアップロードされてしまうのです。

インスタグラム用の画像は綺麗に補正されているのでWordPressにも流用しよう…と気軽にアップしてしまうと発生する問題というわけですね。

この問題への一般的な対処方法

画像効果やトリミングなどを行う画像処理アプリがこの問題を起こす可能性があります。

よって「スマホの標準カメラやデジカメで撮影したばかりの素の画像のみを利用する」というのが最も簡単な対処法だと思います。

そもそもデジカメやスマホを位置情報を記録しない設定にしておくというのも賢い対策かと思います。

この問題への特殊な対処方法

いずれも特殊な処理をfunction.phpに記述する方法です。

この対処は自己責任でお願いします。なにか問題が起きてもブログ主は責任は持てません❗

処理パターンA

EWWW Image Optimizer内蔵のjpegtranを使うパターンです。

本来のjpegtran処理の前にあらかじめEXIF情報削除のみのjpegtran処理を走らせるというものです。

これには画像変換が2度走ってしまうという問題がありますが、おそらくどんな環境でも利用できるでしょう。

// EWWW: Force exif removing.
add_action('ewww_image_optimizer_pre_optimization', function ($file, $type, $original_image) {
    if ($type !== 'image/jpeg' or !$original_image) {
        return;
    }

    if (
        !function_exists('ewww_image_optimizer_path_check')
        or
        !function_exists('ewww_image_optimizer_find_nix_binary')
        or
        !function_exists('ewww_image_optimizer_escapeshellarg')
    ) {
        trigger_error("[ewww_image_optimizer_pre_optimization] Expected function is none.", E_USER_WARNING);
    }

    $tools = ewww_image_optimizer_path_check();
    $nice = ewww_image_optimizer_find_nix_binary('nice', 'n');

    if (!isset($tools['JPEGTRAN'])) {
        trigger_error("[ewww_image_optimizer_pre_optimization] JPEGTRAN is none.", E_USER_WARNING);
    }

    exec("$nice " . $tools['JPEGTRAN'] . " -copy none -outfile " . ewww_image_optimizer_escapeshellarg($file) . ' ' . ewww_image_optimizer_escapeshellarg($file));
}, 10, 3);

処理パターンB

別途ExifToolを使ってEXIF情報のみを削除するパターンです。

あらかじめサーバ内にexiftoolをインストールしておく必要があります。

これだと画像に対する副作用がないので、ブログ主はこちらを採用しています。

// EWWW: Force exif removing.
add_action('ewww_image_optimizer_pre_optimization', function ($file, $type, $original_image) {
    if ($type !== 'image/jpeg' or !$original_image) {
        return;
    }

    $EXIF_TOOL = '/path/to/exiftool';
    exec("$EXIF_TOOL -overwrite_original -all= " . escapeshellarg($file));
}, 10, 3);

過去の画像にEXIF情報が残っているかどうか調べる方法

すでにアップロードされた画像にEXIF情報が残っているかを調べる簡単な方法はありません。

以下の方法は危険を伴います。これも自己責任でお願いします。

この作業にはWP Data Accessのようなデータベースを直接閲覧することのできるプラグインを使います。

「wp_ewwwio_images」テーブルが「最適化の履歴」の情報です。

これの「results」カラムの内容が「節約なし」になっているレコードが対象。

このレコードを削除することで再度の最適化処理を実行することができます。

対策処理を入れていなければ同じ結果になるだけですが…。

削除作業はEWWW Image Optimizerの「最適化の履歴」画面から行うのが安全でしょう。

サーバの中に入れる技術者の方ならfindやidentifyコマンドでサクッと探してしまうのが早いと思います。

この問題が発生する原理

これは技術者向けの内部的な話なので、読み飛ばしていただいても結構です。

EXIF情報が関係するのはJPEGだけですので、ここではその話に絞って記述します。

WordPressに画像をアップロードすると、EWWW Image Optimizerは以下のような動きをします。

  1. 「最適化の履歴」になければ処理を続ける。
  2. jpegtranツールで画像処理する(このときEXIF情報も除去される)。
  3. 処理した結果画像サイズが減れば画像を上書き保存する。
  4. 「最適化の履歴」に保存する。

問題は「3. 処理した結果画像サイズが減れば保存する」で発生します。

画像サイズが減らなかった場合、上書き保存処理が行われないため、EXIF情報も除去されないわけです。

終わりに

EXIF情報を削除するにはEWWW Image Optimizerを入れておけば万事OKだと思っていました。

なので、サーバ内のファイルをなんとなく検索していたときに位置情報が残っていたのにはびびりました…😅

同カテゴリにはSmushという画像最適化プラグインもあるのですが、これはそもそもオリジナル画像を処理しない仕様なので対策しようがありません。

同様にShortPixel Image Optimizerプラグインも試してみたのですが、無料だと制限が多くて厳しそう。

やはり、EWWWがよく使われる理由もよくわかりますので、この問題は対処しておきたいところです。

なお、軽く探した感じでは「純粋にEXIF情報のみを削除するプラグイン」というのは見つかりませんでした。

みなさんもご安全にWordPressで個人ブログライフをお過ごしください✨