みなさん、写真撮ってますか?
474回ではUbuntu上での写真の管理現像アプリとしてdarktableを紹介しました。この記事ではdarktableの様々な機能を紹介しましたが、その中にコレクションという写真の検索、絞り込み機能がありました。
フィルムロールに登録された写真を、さらに細かい条件によってフィルタできます。このフィルタを「コレクション」と呼びます。具体的には「撮影日」「撮影者」「使ったレンズ」「焦点距離」「絞り」「ISO感度」といったパラメータで絞り込めます。たとえば「PENTAX K-1で今日撮影した写真のうち、ISO感度が3200で絞りがF2.8のもの」といった条件を指定できます。
なぜこのようなことが可能なのかと言えば、デジタルカメラで撮影した写真には画像情報の他に、撮影時の様々な情報がメタデータとして記録されているからです。今回はこうした写真のメタデータをコマンドラインから操作するツールと、その応用例を紹介します。
Exifデータとは?
こうしたメタデータはExif(エグジフ)データと呼ばれています。ExifはExchangeable image file formatの略で、写真用メタデータを画像ファイル(JPEGやTIFF)に埋め込むための規格です。Exifには撮影したカメラのメーカー、モデル、使用したレンズといった機材の情報をはじめ、撮影日時、シャッタースピード、絞り値、フラッシュ使用の有無といった撮影時の設定など、非常に多くの情報が含まれています。
写真の管理アプリといえばAdobe Lightroomが有名ですが、Lightroomもこうした情報をデータベースに格納することで、写真の検索や絞り込みを実現しています[1]。
Exifデータを調べるには
実際に写真に記録されたExifデータを見てみましょう。一番簡単な方法は「ファイル」(※2)を使う方法です。JPEGファイルを右クリックしてプロパティを開き、「画像」タブをクリックしてください。
「画像ビューアー」では、もう少し詳しい情報を閲覧できます。JPEGファイルをダブルクリックして画像ビューアーで開いたら、ウィンドウ右上のハンバーガーメニューからプロパティを開いてください。「メタデータ」タブでは先ほどとほぼ同様の情報しか表示されませんが、「詳細」タブでは画像に埋め込まれているExif情報をより詳しく表示できます。
このような画像を閲覧するアプリで、付随する情報を表示できるのは言ってみれば当然です。しかし我々としては、コマンドラインからExif情報を取得し、数値や文字列としてプログラムの中で再利用したいですよね。
画像のデータを表示するコマンドと言えば、ImageMagickに含まれているidentifyコマンドが有名です。画像のフォーマット、サイズ、色数といった基本的なデータを一行で表示するidentifyコマンドですが、「-verbose」オプションをつけて実行するとより詳細な情報を表示できます。
-verboseオプションをつけると非常に大量の情報が表示されます。そのままでは使いにくいため、自分にとって必要なタグだけを抜き出しましょう。パイプでgrepコマンドに繋いでもよいのですが、identifyコマンドはformatオプションを指定することで、表示されるタグを絞り込むことができます。たとえばExifデータからカメラのメーカー(exif:Make)とモデル(exif:Model)を表示するには以下のようにします。
このように、Exifデータを参照するだけならばImageMagickでも十分です。しかしImageMagickではExifデータの削除や編集がやりにくいため[3]、exiftoolというExifの操作に特化したツールを利用するのがおすすめです。
exiftoolを使う
「libimage-exiftool-perl」パッケージをインストールしてください。このパッケージはその名の通りExifデータを読み書きするためのPerlライブラリなのですが、コマンドラインインターフェイスとして「/usr/bin/exiftool」というPerlスクリプトが同梱されているため、Perlの知識がなくてもシェルからExifを操作するコマンドとして利用できます。
基本的な使い方はidentifyコマンドと同じで、引数にファイルを渡すだけです。以下のようにタグ名と値がコロン区切りで表示されます。
identifyコマンドと同様、デフォルトでは表示される項目が多すぎて使いづらいでしょう。exiftoolではハイフンに続いて表示させたいExifタグ名を指定して、項目をフィルタします。これは複数同時に指定できます。
exiftoolはデフォルトで、人間にとって読みやすい形式に変換した上で値を出力します。「-n」オプションをつけると、この変換を抑制します。
「-b」オプションを指定すると、タグ名を省略したバイナリ形式で出力できます。タグ名とこのオプションを指定することで、純粋な値のみを抜き出せるため、スクリプト内では主にこの形式を利用することになるでしょう。たとえば以下のスクリプトは、Exifデータから緯度と軽度の値を抜き出し、Google Mapsに引数として渡すことで、撮影地にピンを立てて表示する例です[4]。位置情報を記録したスマホの写真などで試してみてください[5]。
筆者はexiftoolを写真の整理に利用しています。Exifには「DateTimeOriginal」という撮影日時を記録するタグが存在しますので、これを頼りに「撮影年-月-日」というフォルダを作り、ファイルを「撮影年-月-日-時-分-秒-オリジナルファイル名」という名前にリネームしています[6]。
わざわざExifを見なくても、ファイルのタイムスタンプでいいじゃないかと思う方もおられると思います。しかしファイルのタイムスタンプが、常に撮影日時を指している保証はありません。たとえば撮影時にはRAWデータのみを記録し、後日カメラ内でJPEGに現像を行った場合、JPEGファイルのタイムスタンプはファイルが生成された日時になってしまいます。このようなケースでもExifデータを参照すれば、間違いなく撮影日を特定することができるのです。
Exifデータを書き込むには
exiftoolでは、Exifデータを書き込むこともできます。例として撮影者を表示する「Artist」タグと、著作権者を表示する「Copyright」タグを書き込んでみましょう。設定したいタグと値をイコールで結んで指定します。この際、変更前のファイルは「元ファイル名_original」という名前で自動的にバックアップが作成されます。
このように、Exifデータは簡単に編集が可能です。撮影時のシャッタースピードなどのデータは編集できませんが、撮影日などは容易に改竄が可能です。ネットにアップされている写真のExifデータは、過信しないほうがよいでしょう。
Exifデータを削除するには
SNSの普及により、写真の公開とプライバシーについては、多くの人が意識するようになってきたと思います。第三者の顔にボカシを入れる作業などは、みなさん違和感なく行っているのではいなでしょうか。しかし、写真の見た目にボカシを入れても、Exifデータではプライバシーが丸見え、というケースもあります。前述のGPSデータなどは最たるもので、自宅の位置が一発でバレてしまう可能性もあります。
Exifデータは編集するだけでなく、そのタグをまるごと消すこともできます。センシティブな情報は、ネットにアップする写真からは消しておくべきでしょう[7]。前述のExifデータの書き込み時に、イコールの後の値を空白にすることで、そのタグを削除できます。たとえばArtistタグを削除するには以下のようにします。
写真から位置に関する情報を消してみましょう。GPSではじまる名前のタグを上述の手順でひとつずつ削除してもよいのですが、以下のコマンドを実行すると一括で削除できます。
Exif情報は本格的なデジタル一眼レフに限らず、スマホで撮影した写真にも当然埋め込まれています。ぜひお手持ちのスマホで撮影した写真で試してみてください。