九保すこひ@フリーランスエンジニア|累計300万PVのブログ運営中
さてさて、突然ですが皆さんは美味しい料理を食べにいったときやキレイな景色を見た時お手持ちのスマホで写真をとったりすることはあるでしょうか。
最近では写真をインスタグラムなどにアップロードする人も多いので、よく街なかでも見かける光景ですよね。
ただ、ご存知の方も多いとは思いますが、スマートフォンの設定によってはその写真には様々なデータが埋め込まれていて、気をつけないと投稿した写真から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
おわりに
ということで今回は写真データEXIF
をPHP
から操作する方法をご紹介しました。
なお、実はですが前回記事 ネットカフェ向けにコミックをどこまで読んだか記録するLINEボットをつくった の流れを受けて「写真を送信するとEXIFを抜き出して返信するボット」を作って試してみたのですが、さすがそこは有名アプリのLINE
です。個人情報が流出しないようにアップロードされた画像からEXIF
をクリアしてから送信していました。
なので、今回は少し短いですがこれで終了です。
ぜひ皆さんのサイトから個人情報が流出しないように対策をしてみてはいかがでしょうか。
ではでは〜!
「さすがLINE!」