デジタル写真の管理に役立つ自動処理ツール

 旅行から帰って来てデジタルカメラの写真をファイルサーバにコピーする際に、ファイル名を変更したり、(画質を落とさずに)回転させて縦横の向きを見やすく変えたりしたいことがある。さらに、画像ファイルにコメントを埋め込んで、どんな画像ビューアでもそうしたメタデータの読み取りや共有ができるようにしたいこともある。この記事では、そんなときに役立つコマンドラインツールをいくつか紹介する。

 JPEG圧縮は画像の“劣化”を伴う(情報の一部が失われる)が、ここで紹介するツールを使えば、JPEG画像データの再圧縮を必要とせずに90度単位で画像を回転させることができる。つまり、いったん圧縮を解除し、回転させ、再び劣化を伴う圧縮を実行するという、情報の損失を無意味に増やす手順を踏まなくても、回転画像を保存できるのだ。デジタルカメラで撮影されたJPEG画像の多くには、サムネイル画像が埋め込まれているが、こうしたツールは通常、元の画像と一緒にサムネイルの回転処理まで行ってくれる。

 なお、こうしたツールの回転機能は、縦横の向きに関する情報が画像のメタデータ内に正しく設定されているという前提で動作する。多くのデジタルカメラでは、撮影時に向きの情報をEXIFタグに書き込むことができる。使っているカメラをチェックして、こうした機能があるか、またそのためのメタデータが正しく設定されているかを確かめておくこと。今回のテストに使ったCanon製Powershot G7では、縦横の情報を記録するために“Auto Rotate”(縦横自動回転)の設定をオンにする必要があった。

exiftool

 PerlのImage::ExifToolライブラリには、画像/音声/動画ファイルのメタデータを読み書きできるexiftoolが含まれている。特に、画像のメタデータをコマンドラインから操作するのに便利なツールだ。

 exiftoolのマニュアルページには、Image::ExifToolライブラリ(つまりexiftool)がサポートしている膨大な数のファイル形式(JPEG、RAWなど)とメタデータの規格(EXIF、GPS、XMPなど)が記されている。

 exiftoolは、実行方法にかなりの柔軟性がある。使用するオプションによって、与えられた画像ファイルを上書きして更新することも、フィルタとして動作して、指定の場所から読み込んだ画像を処理してその結果を標準出力またはターゲットディレクトリに書き込むこともできる。後者のフィルタモードでexiftoolを実行するには、処理の対象となるファイルまたはディレクトリの名前を最後の引数として指定する。この引数をハイフンにすれば、標準入力からデータを読み込むこともできる。フィルタモードの場合、結果は標準出力に書き出されるが、「-w」オプションを使うことで出力画像をファイルに保存できる。

 exiftoolの一般的な使い方は、入力画像を指定して何らかのメタデータ操作を行い、その結果を標準出力に書き出すか(フィルタモード)、あるいは元のファイルの拡張子を“.jpg_original”に変えてバックアップを取ったうえで結果を元のファイルに上書きするか(更新モード)のどちらかである。バックアップは自前で取っていてexiftoolの実行に不安な要素がなければ、「-overwrite_original」オプションを使って、バックアップファイルを作らずに画像を上書きすればよい。

 以下に示す最初の例は、image.jpgファイルに埋め込まれたサムネイルを取り出している。2番目の例は、同じファイルのCommentタグの設定を行っている。ただし、このコマンドの実行後も元の画像はimage.jpg_originalという名前で残っている。さらに、コメントの付いていない元のファイルを削除したあと、最後のコマンドでコメントの変更を行っているが、このときは「-overwrite_original」オプションが指定されているため、image.jpg_originalファイルは作成されない。

$ exiftool -b -ThumbnailImage image.jpg > thumbnail.jpg
$ exiftool -Comment='This is a new comment' image.jpg
$ rm -f image.jpg_original
$ exiftool -Comment='This is a second comment' -overwrite_original image.jpg

renrot

 renrotの名前は、前半3文字が“rename”(名前変更)、後半3文字が“rotate”(回転)を表していて、それぞれがこのツールの主な用途になっている。なお、縦横回転の機能はJPEG画像でのみ使える。そのほか、撮影日時に基づいて写真をディレクトリに振り分ける機能や、埋め込まれているコメントを編集する機能も備えている。

 renrotのパッケージは、Fedora 9とUbuntu Intrepidのリポジトリに収録されているが、openSUSE 11用のものはない。ただ、openSUSEの場合は「rpmbuild -tb renrot-1.1.tar.gz」というコマンドでRPMファイルを作成できるはずだ。私の64ビット版Fedora 9マシンでは、バージョン1.1のソースからビルドを行った。renrotのインストールには、Perl 5.6.0以降のほか、Image::ExifTool、Getopt::Long、jpegtran、それにオプションの依存関係としてImage::Magickの各Perlモジュールが必要になる。

 引数を何も指定せずにrenrotを実行すると、「少なくとも処理する画像ファイルの拡張子の指定が必要」というエラーメッセージが出て終了する。ファイル名と拡張子では大文字と小文字が区別されるため、「JPG」と「jpg」の双方の拡張子が混在している場合は、renrotを2回実行するか、それが嫌ならファイル名を変更して拡張子をすべて大文字か小文字のどちらかに統一する必要がある。renrotではファイルの拡張子の指定に「--extension」パラメータが使えて、ツール自体で画像ファイルの名前を変更できるのだから、たとえば「--iextension」のようなパラメータによって、拡張子の大文字/小文字の区別の要否を指定できてもよさそうなものだが、そういう引数は存在しない。

 以下に、renrotの使用例を示す。1行目の実行は失敗しているが、2行目では拡張子が「.jpg」でカレントディレクトリ内にあるすべてのファイルの名前変更と縦横回転が行われている。画像の回転時には、ファイル名の末尾に「_orig」を追加した名前で元の画像が保存される。なおrenrotには、処理後に元のファイルのバックアップを残さないようにするオプションはない。

$ renrot -v
FATAL: Extension of files is required!
$ renrot --extension jpg -v
DEBUG[1]: main::renRotProcess(): Trim string: '-trim'
DEBUG[1]: main::renRotProcess(): Initializing tags...
RENAMING / ROTATING
===================
Processing file: (1 of 19) 00001.jpg...
Renamed: 00001.jpg -> 20080921171446.jpg

Processing file: (2 of 19) 00002.jpg...
Renamed: 00002.jpg -> 20080921171452.jpg
...
$ ls -lh
-rw-r----- 1 ben ben 4.0M 2008-09-21 17:14 20080921171446.jpg
-rw-r----- 1 ben ben 4.4M 2008-09-21 17:14 20080921171452.jpg
...

 「--work-directory」パラメータを使えば、カレントディレクトリからではなく、指定したディレクトリから入力画像を読み込める。ディレクトリを再帰的にたどって画像を処理することはできないが、その類のことが簡単に行えるように、複数のファイルを明示的に指定して処理できる「--sub-fileset」パラメータが用意されている。このパラメータを使えば、renrotで読み込む画像のファイル名を1件1行で記したファイルを指定できるのだ。以下の例では、findコマンドと併用することで、処理する画像ファイルの名前を標準入力からrenrotに再帰的に与えている。findコマンドのパラメータをもっと使いこなせば、処理する画像をこと細かに指定できるだろう。

$ find . -mindepth 1 | renrot --sub-fileset -

 デフォルトでは、撮影日時(年月日と時分秒)に基づいてファイル名の変更が行われ、その後ろに元の拡張子が付けられる。「--name-template」パラメータを使えば、変更後のファイル名の書式を指定できる。ファイル名の書式には、撮影日時の情報のほか、露出時間やホワイトバランスといったタグの情報も使える。そうした情報の指定には、パーセント文字によるプレースホルダ(露出時間の%Eなど)を用いる。なお、画像の回転だけを行う場合は「--no-rename」を使えばよい。

 撮影日時に基づいて写真をディレクトリに振り分けることもできる。デフォルトでは、“Images”というプレフィックスのあとに年月日をセパレータなしでつなげた文字列を追加した名前で、ディレクトリが作成される。このプレフィックスは「--aggr-directory」パラメータで変更できる。また、「--aggr-template」パラメータには、ファイルの名前変更のときと同じフラグが使える。

 renrotでは、タグやコメントを画像のEXIFデータとして入れることも可能だ。そういうときには「--no-rename」を用いる。たとえば、一連の写真に対してタグの設定だけを行うには、次のようにする。

$ echo 20081102170950.JPG | \
  renrot --no-rename \
  --tag 'UserComment: foobar' \
  --sub-fileset -

 コマンドラインパラメータとして使えるrenrotのオプションのほとんどは、グローバルな設定ファイル「/etc/renrot/renrot.conf」やユーザごとの設定ファイル「~/.renrot」にも記述できる。

 埋め込みサムネイルを新たに作成することもできるが、既存の埋め込みサムネイルがあれば、別のツールを使って先にそちらを削除しておく必要がある。以下に示すコマンドは、すでにrenrotで一度処理したデジタル写真のコピーを作成するものだ。まずexiftoolでサムネイル画像を削除したうえで、元のファイルを退避させる。続いて、renrotで写真のファイル名を変更すると共に「--generate-thumb」によって新しいサムネイルを写真に追加する。元のサムネイルは3,548バイトで、新たに作成されたものは8,081バイトと、サイズは2倍以上になっているがその分画質も上がっている。デジタル写真自体のサイズが4MBだったことを思えば、わずか数KBの増加でサムネイルの画質が向上するのだから問題はないだろう。renrot.confファイルを調べたところ、作成するサムネイルの寸法を設定するオプションはあったが、画質を落としてファイルサイズを削るためのJPEG圧縮レベル設定のオプションは見当たらなかった。

$ cp -a 20081102170950.JPG 20081102170950-nothumb.JPG
$ exiftool -tagsFromFile 20081102170950-nothumb.JPG  -ThumbnailImage= -m 20081102170950-nothumb.JPG
$ mv 20081102170950.JPG 20081102170950-original.JPG

$ renrot --no-rotate --generate-thumb 20081102170950-nothumb.JPG
RENAMING / ROTATING
===================
Processing file: (1 of 1) 20081102170950-nothumb.JPG...
Renamed: 20081102170950-nothumb.JPG -> 20081102170950.JPG

DigicaMerge

 DigicaMergeは、デジタル写真のファイル名変更に重きを置いたツールだ。撮影したカメラ別に分かれた複数の写真用ディレクトリを、ファイル名の重複があっても上書きによって写真を失うことなく、1つにまとめる(マージする)のに使える。

 DigicaMergeには、openSUSE、Fedora、Ubuntu用のいずれのパッケージも存在しない。ここでは、64ビット版Fedora 9マシンでDigicaMergeのバージョン2.00をソースからビルドする。DigicaMergeを利用するには、pyexifをインストールしておく必要がある。Fedora 9のリポジトリにはpyexifのパッケージが見つからず、pyexif用のsetup.pyもない。そこで次のように、まずpyexifのインストールを行い、そのあとにDigicaMergeをインストールする。

$ cd /tmp
$ tar xzvf /.../pyexif-0.9.tar.gz
# su -l
# cd /tmp/pyexif/lib
# cp exif.py /usr/lib64/python2.5/
# chmod 444 /usr/lib64/python2.5/exif.py

$ tar xzvf /.../digicamerge-2.00.tar.gz
$ cd ./digicamerge-*/
$ sudo python setup.py install

 DigicaMergeの実行時には、マージの対象となる複数のディレクトリ名と、その結果を格納するターゲットディレクトリを指定する。通常、各画像ファイルは元のディレクトリからターゲットディレクトリへと移動されるが、「--copy」を指定すれば元のファイルを残したままコピーできる。また「--nodupes」オプションを指定すると、重複するファイルがターゲットディレクトリから除かれる。マージの対象となるファイルの種類の指定には、「--pattern」パラメータを使う。このパラメータの既定値は「*.jpg」である。

 「--touch」を使えば、ターゲットディレクトリ内の画像の更新日時を変更して、撮影日時を示すEXIFデータに一致させることができる。

 写真のファイル名変更は、「--scheme」パラメータに従って行われる。このスキームには、写真の作成日時に関する多数の便利な変数やほかのEXIFタグから得られる情報が使える。選択した変数には、値の書式も指定する必要がある。書式設定の文字列は、Pythonにおける文字列の書式にならって与える。ほとんどの変数は文字列だが、count0とcount1だけは例外で、これらの値は使うたびに1つずつインクリメントされる。count0とcount1の唯一の違いは、前者が0から始まるのに対し、後者は1から始まる点である。

 以下のコマンドは、src1、foo、barの各ディレクトリ内にあるすべての画像をmyPicturesディレクトリに移動し、それぞれのファイル名が“<カメラ機種>-<解像度(幅x高さ)>-<番号>.jpg”になるように名前を変更する。

$ digicamerge --touch \
  --scheme "%(Model)s-%(ExifImageWidth)sx%(ExifImageHeight)s-%(count1)04i.jpg" \
  src1 foo bar myPictures

 以下は、撮影日時の情報を新しいファイル名に利用した例である。ファイルシステムのパス区切りとの混同を避けるために、日付の月と日の区切りにはバックスラッシュを用いている。

$ digicamerge --pattern "*JPG" --touch \
    --scheme "%(Model)s-%(year)s\\%(month)s\\%(day)s--%(hour)s:%(minute)s:%(second)s-%(count1)04i.jpg" \
    samples-with-auto-rotate output

samples-with-auto-rotate/IMG_9815.JPG moved to output/Canon PowerShot G7-2008\11\02--17:12:07-0001.jpg
samples-with-auto-rotate/IMG_9816.JPG moved to output/Canon PowerShot G7-2008\11\02--17:12:11-0002.jpg

 DigicaMergeでは、ターゲットディレクトリへの写真の移動またはコピーが済んだあとに各写真に対して後処理のコマンドを実行できる。「--scheme」オプションで使えるすべての情報は、コマンドをDigicaMergeで実行する際に環境変数として参照できるため、写真の向きが特定の値に設定されていれば画像の縦横回転のような操作が行える。

まとめ

 今回、主としてrenrotとDigicaMergeを取り上げたのは、ファイル名の変更と画像の回転によってファイルシステム上のレイアウト整理に使えるからだ。これらのほかにも、デジタル画像ファイルの名前変更と自動加工に役立つツールはたくさんある。コマンドラインツールとしてはrenamepicsやPECoMaTo、GUIツールとしてはMediaSortやfotoalbumが挙げられる。

 デジタルカメラで作成された埋め込みサムネイルは、サイズが大きい割に画質が低い場合がある。カメラでは、写真やサムネイルをできるだけ短時間で圧縮する必要があるからだ。もっと高い処理能力を持つデスクトップマシンでは、旅行で撮影した写真のサムネイル作成にかかる時間を気にする必要はない。デジタルカメラによる埋め込みサムネイルを削除してデスクトップマシンで作り直せば、ファイルサイズのわずかな増加でもっと質の高いサムネイルが得られるだろう。

 renrotには画像を劣化させない縦横回転の機能があるため、EXIFタグによる向きの情報が無視される画像ビューアを使っている場合は、縦横の表示の向きを手作業で変えるといった面倒な手間をrenrotによって省くことができる。外部コマンドの実行機能を備えたDigicaMergeを使って画像を回転させることも可能だが、そうしたコマンドの利用法については各自で調べる必要がある。写真のファイル名変更と回転の両方を行うなら、renrotを利用するほうが手っとり早いだろう。

Ben Martinは10年以上前からファイルシステムに携わっている。博士号を持ち、現在はlibferris、各種ファイルシステム、検索ソリューションを中心としたコンサルティング業務に従事。

Linux.com 原文(2008年11月10日)