PHPでEXIFデータを操作する方法(取得、書き込み、削除)

こんにちは。フリーランス・コンサルタント&エンジニアの 九保すこひ です。

さてさて、突然ですが皆さんは美味しい料理を食べにいったときやキレイな景色を見た時お手持ちのスマホで写真をとったりすることはあるでしょうか。

最近では写真をインスタグラムなどにアップロードする人も多いので、よく街なかでも見かける光景ですよね。

ただ、ご存知の方も多いとは思いますが、スマートフォンの設定によってはその写真には様々なデータが埋め込まれていて、気をつけないと投稿した写真からGPSデータがわかってしまい、自宅の場所が特定されてしまったりするので注意が必要です。

そして、今回の話題はこの画像に埋め込まれたデータ「EXIF」PHPで操作する方法です。

ぜひ皆さんのお役に立てると嬉しいです😊✨

開発環境: PHP 7.2、Ubuntu 18.04

exiftoolをインストールする

PHPからEXIFデータを操作するにはImagemagickを使う方法もありますが、よりシンプルに実装ができるので、今回はexiftoolと呼ばれるコマンドラインでEXIFを操作できるパッケージをインストールして使います。

以下のコマンドを実行してください。(その他の場合は、ちなみに:パッケージからexiftoolをインストールするをご覧ください)

sudo apt install exiftool

インストールが完了したら、PHPから呼び出すために絶対パスを取得しておきましょう。さらに以下のコマンドを実行してください。

which exiftool

※ 私の環境では/usr/bin/exiftoolでしたので以降はこのパスを使って説明をしていきます。

EXIFデータを操作する

まず前提として、画像には実行権限がついている必要があります。

全ての情報を取得する

exiftoolは以下のようなフォーマットで各データを1行ずつ表示してくれます。

タグ : 値

そのため、:でデータを切り分けてキーと値を格納していきます。

$path = 'test.jpg';
exec('/usr/bin/exiftool '. $path, $output);
$metadata = [];

if(count($output) > 0) {

    foreach($output as $item) {

        $items = explode(':', $item);
        $item_key = trim($items[0]);
        $item_value = trim($items[1]);
        $metadata[$item_key] = $item_value;

    }

}

print_r($metadata);

特定のデータだけを取得する

exiftoolは、-bをつけると値だけを取得できるようになります。
そのため、特定のデータだけを取得する場合は以下のようになります。

※ オプション値に直接タグ名(空白なし)をつけてください。
※ なおEXIFのタグ一覧はこちらのページをご覧ください。

画像の横幅を取得する

$path = 'test.jpg';
exec('/usr/bin/exiftool -b -imagewidth '. $path, $output);
echo $output[0];

EXIFバージョンを取得する

$path = 'test.jpg';
exec('/usr/bin/exiftool -b -exifversion '. $path, $output);
echo $output[0];

EXIFの全データを削除する

EXIFデータを全て削除するには以下のように-all=をつけてください。

$path = 'test.jpg';
exec('/usr/bin/exiftool -all= '. $path);

EXIFデータを書き込む

EXIFデータを書き込むには以下のように-タグ名=****という形式でオプション値をつけて実行してください。

この例は、「Artist」を「Sukohi Kuhoh」にする方法です。

$path = 'test.jpg';
exec('/usr/bin/exiftool -Artist="Sukohi Kuhoh" '. $path);

なお、上記の場合は念のため元画像がtest.jpg_originalという名前でバックアップされますが、不要な場合は-overwrite_originalをつけるといいでしょう。

$path = 'test.jpg';
exec('/usr/bin/exiftool -Artist="Sukohi Kuhoh" -overwrite_original '. $path);

ちなみに:パッケージからexiftoolをインストールする

CentOSなどにexiftoolをインストールする場合は以下の方法を試してみてください。

まず以下のコマンドでperlをインストールします。(すでにインストールしている場合は飛ばしてください)

sudo yum install perl-devel

そして、フォルダに移動してパッケージをダウンロードします。(最新版は本家サイトで確認してください)

wget https://www.sno.phy.queensu.ca/~phil/exiftool/Image-ExifTool-11.65.tar.gz

ダウンロードしたら展開しましょう。

tar xvzf Image-ExifTool-11.65.tar.gz

すると(この場合は)Image-ExifTool-11.65というフォルダができるので、中に移動します。

cd Image-ExifTool-11.65

後は、makeしてインストールです。

sudo perl Makefile.PL
sudo make
sudo make test
sudo make install

インストールが完了したら念のため以下のコマンドで上手くいっているか確認しておきましょう。(Ubuntuバージョンとは少し違っているようです)

exiftool -ver
開発のご依頼お待ちしております
開発のご依頼はこちらから: お問い合わせ
どうぞよろしくお願いいたします! by 九保すこひ

おわりに

ということで今回は写真データEXIFPHPから操作する方法をご紹介しました。

なお、実はですが前回記事 ネットカフェ向けにコミックをどこまで読んだか記録するLINEボットをつくった の流れを受けて「写真を送信するとEXIFを抜き出して返信するボット」を作って試してみたのですが、さすがそこは有名アプリのLINEです。個人情報が流出しないようにアップロードされた画像からEXIFをクリアしてから送信していました。

なので、今回は少し短いですがこれで終了です。

ぜひ皆さんのサイトから個人情報が流出しないように対策をしてみてはいかがでしょうか。

ではでは〜!

「さすがLINE!」

このエントリーをはてなブックマークに追加       follow us in feedly