コマンドラインでデジタル写真にメタデータを追加する

 デジタルメディアファイルの有用性は、メタデータをタグ付けすることでより高くなる。つまり、写真の説明をそれぞれの画像に埋め込んだり、外部データベースに保存したりできるのだ。 ExifTool は、写真、オーディオ、ビデオのメタデータをLinuxで管理する効果的なツールであり、柔軟性が高くて手軽に使える。ここでは、ExifToolを使ってJPEGファイル内のEXIFデータを処理する方法を紹介する。

 ExifToolの柔軟性の高さは、その構成に起因している。このツールは、EXIFデータを扱うためのマルチプラットフォームのPerlモジュール群と、それらをコマンドラインから利用するためのexiftoolという小さなプログラムで構成されている。exiftoolでは、パイプまたは(リモート)ファイルからのデータや画像の読み書きが問題なく行える。たとえば、ネットで見つけたJPEG画像をローカルにコメント付きで保存したければ、「wget -qO - http://some.website.com/picture.jpg | exiftool -Comment="African Sunset" > localcopy.jpg」といったコマンドが使える。

 EXIFタグの追加または修正を行うための基本構文はシンプルで、「exiftool」のあとに、書き込むタグの名前(前に“-”を付ける)と値の組を入力するだけでよい。デフォルトでは、ベース名に“_original”を付けたファイル名で元のファイルが保存される。オプションをいくつか組み合わせれば、ディレクトリツリー内で再帰的な操作を行うことも可能だ。

メタデータの保存先は写真の中か外か
 メタデータをデータベースで一元管理するのとそれぞれのファイル内に記録するのとでは、どちらがよいだろうか。前者の方法は、大量のデジタル画像をさまざまな方法で検索したい場合に効果的だ。一方、メタデータタグをできるだけ画像ファイルに記録するようにすれば、ファイルの移動が気軽に行える。メタデータは記録先の画像にずっと残るので、写真管理用のソフトウェアを変更したり、DVDに記録したり、友人にコピーを渡したりする場合でも、手作業で入力し直さずに済むからだ。だが幸いなことに、どちらか一方しか選べないわけではない。

 コマンドラインツールによる画像へのメタデータ埋め込みには、2つの大きな利点がある。1つはGUIツールよりもずっと高速な処理が期待できることで、特に、スキャナで取り込んだ写真(祖父の昔の写真とか)のような、メタデータのまったく付いていない大量のファイルを処理する場合にはその傾向が顕著に現れる。もう1つは、メタデータの修正がその場で簡単に行えることだ。海外旅行からの帰国後に、現地時間を正しく設定せずに写真を撮っていたり、慣れない小さな画面とキーボードを使って入力したホテルの名前が違っていたりするのに気付くことは珍しくない。適切なソフトウェアを使えば、コマンド1つで写真のタイムスタンプやコメントを修正することができる。

 必要なEXIFメタデータをすべて含むJPEGファイルが1枚あれば、他の画像のそれぞれについて同じメタデータを入力する手間が省ける。「-TagsFromFile」オプションを使って「exiftool -TagsFromFile tagged_picture.jpg untagged_picture.jpg」とすれば、最初に指定したファイルのすべてのタグを最後の引数として与えたファイルにコピーできるのだ。

 画像に記録されているすべてのEXIFタグは「-w」または「-htmlDump」オプションを使って、それぞれテキストファイルまたはHTMLファイルに書き出すことができる。また、すべてのメタデータをリレーショナルデータベースにエクスポートするには、「exiftool -t -S PICTURE_DIR | grep -v ^==== > picture_tags_values.txt」のようなコマンドを使うとよい。これは、PICTURES_DIR内のすべての画像の全EXIFタグを、1行1ファイル、タブ区切りの形式で「picture_tags_values.txt」ファイルに書き出すものだ。こうした形式であれば、「LOAD DATA INFILE」、「FIELDS TERMINATED BY」、および「LINES TERMINATED BY」オプションを使ってそのままMySQLデータベースに読み込むことができる。「Perl Monks」というサイトには、この方法でタブ区切りデータをMySQLにインポートするサンプルコマンド一式が記されたスレッドがある。

IPTC、XMP、EXIF
 よく使われる標準的な画像メタデータとして、IPTC、XMP、EXIFの3つがある。IPTC(国際新聞電気通信評議会[International Press Telecommunications Council]に由来)は、1970年代に通信社が写真をFAX送信する際に使っていた標準化記法をそのままデジタル化したものだ。キャプション、クレジット、著作権表示、撮影者、それに米国新聞発行者協会(ANPA:American Newspaper Publishers Association)のニュースカテゴリといった項目が含まれる。

 また、AdobeによるXMP(Extensible Metadata Platform)は、IPTCにXMLソフトウェアおよびセマンティックWebとの互換性を与えたものである。

 しかし、市場に出ているほとんどすべてのデジタルカメラは、EXIF(Exchangeable Image File Format)規格を使って、撮影時の技術的情報を数多くJPEG画像に埋め込んでいる。通常はタイムスタンプのほか、シャッター速度、ISO感度、焦点距離など多くのパラメータが含まれ、これらのデータを参照することで写真撮影の腕を磨くことも可能だ。最新のデジタルカメラの多くでは、EXIFを使ってユーザがラベルやコメントを追加できるようになっている。

 IPTCとXMPは業務用コンテンツにおけるインデキシングと法的な問題を解決するために作られたものであり、EXIFは撮影時のカメラ設定を残すためのものといえるだろう。ExifToolではこれら3種類のメタデータのすべてを扱えるが、実際にはたいていの個人用途であればEXIFで事足りる。それに、ほとんどのEXIFデータは、カメラ側が記録してくれるというのもありがたい。

 ExifTool以外に、exiv2Jheadでも、EXIF、IPTC、XMPの各メタデータを扱うことができる。

 ExifToolで特に興味深く強力な機能の1つが、「-if」オプションによる高度な条件付きタグ付けである。たとえば「exiftool -alldates+=1 -if '$CreateDate ge "2006:04:02"' MY_PICTURE_FOLDER」というコマンドを使えば、MY_PICTURE_FOLDER内の2006年4月2日以降に生成された画像についてのみ、記録されている日時のデータを1時間進めることができる。この「-alldates」オプションは、JPEGファイル内にあるすべてのタイムスタンプ(DateTimeOriginal、CreateDate、ModifyDate)を対象とするExifToolのエイリアスになっている。こうしたExifToolのコマンドオプションについては、マニュアルページに詳しく記されている。

 「-if」オプションは非常に汎用性が高く、唯一の制限はPerlの構文で記述しなければならない点である。必要であれば、1回のexiftool呼び出しで複数の「-if」条件式を連結して使うこともできる。ただし、タグ名を条件に含める場合は、Perlの変数と同じく前に“$”を付ける必要があるが、Perlの変数と違ってタグ名の大文字と小文字は区別されない。

 また、画像にgeotagを付けて、撮影場所の緯度と経度を記録することも可能だ。さらに、ExifToolで扱える対象はテキストのメタデータに留まらない。たとえば、「exiftool -b -JpgFromRaw -w _thumbnail.jpg some_raw_photograph.crw」とすれば、Canon形式のRAW画像(.crw)からJPEGサムネイルを抽出して「some_raw_photograph_thumbnail.jpg」に保存することができる。

 こうした機能を実用的にしたのがこちらのexiftoolスクリプトで、カレントディレクトリ内のすべてのRAW画像からJPEG画像を生成してくれる。作者によると、その変換結果は「SサイズのRAW画像並みであり、メモリカードの領域消費も抑えられる」という。同じ作者による別のスクリプトは、さらに一歩進んで、撮影日時や焦点距離といったデータも含めて元のRAW画像からJPEG画像にコピーしてくれる。一方、写真家のR. Pienaar氏は、ExifToolのPerlモジュールを使ってEXIFタグ付きの画像を写真ブログに追加している。

 最後にひとこと。ファイルにタグを付ける理由はいろいろあるが、画像に埋め込んだメタデータが困った事態を引き起こすこともある。恋人の両親のために写真をCD-ROMに焼いて渡したところ、その写真に二人で過ごした夜の出来事についてのメモが残っていたり、さらにはその写真がオンラインギャラリーで公開されたりする可能性があるからだ。だがExifToolがあれば心配はいらない。写真を配布する前に「exiftool -all= *.jpg」としておけば、すべてのメタデータを削除できる。

Marco Fiorettiは『The Family Guide to Digital Freedom』の著者。普段はLinux.comをはじめとするIT誌に寄稿している。

Linux.com 原文(2008年9月19日)