にほんブログ村 写真ブログ デジタル写真へ
にほんブログ村のランキングに参加中です

exiftool 使用例をもう一度

2017年07月07日 00:00

アフラックじゃないけど・・・

アフラックじゃないけど・・・


Lumix GX7, HOLGA 25mmF8


※ブログに視覚要素を加えるlightboxを導入しています。上記画像をクリックすると少し大きな画像をポップアップして見る事が出来、暗くなった部分をクリックするか、画像下部のCloseをクリックすると元に戻ります。



7月3日の記事の続き・・・。
多くの現像ソフトはEXIFタグの「Lens」、もしくは「LensModel」を参照してレンズ名を表示しているが、Lumixカメラはそれを使わずに「LensType」、「LensId」にしかレンズ名情報がなく、よって現像ソフトの違いによりレンズ名が表示されない時がある。

これはLumixカメラでなくとも、もし現像ソフトなどでレンズ名が表示されないカメラがあったらLumixと同じ仕様、もしくは古いEXIF仕様に基づいているだけなので、 7月3日の記事と同じ方法でexiftoolを利用し、Lens、LensModelにレンズ名を加えれば問題はない。

そして電子接点のないマウントアダプター経由で他社のレンズを装着していても同じ要領でレンズ名を表示出来るが、加えてレンズ焦点距離、35mm換算レンズ焦点距離も加えた方が良いだろうから「FocalLength」、「focallengthin35mmformat」に任意の値を追加する。

1つのフォルダ内で1本の他社レンズしか使ってなかったら事は簡単だ。「smc PENTAX-M50mmF1.4」を使っていたとしよう。現像ソフトには「SMCM50mmF1.4」と表示したい。そんな場合次の通り。


exiftool -lens='SMCM50mmF.4' -lensmodel='SMCM50mmF1.4' -focallength='50' -focallengthin35mmformat='100' -overwrite_original *.*



これで現像ソフトにてレンズ名が「SMCM50mmF1.4」とフォルダ内の全てのファイル(JPGでもRAWでも)で表示される。

しかし現実は1つのフォルダ内に様々なレンズが混在しているだろう。10ファイル、20ファイルくらいなら面倒とは感じないかもしれないが、それが100、200とあったら、この処理をファイル1つ1つで行うのか?。そりゃぁ無理だ、となるでしょう?。

そんな時に便利なのがLightroom。LightroomはJPG、RAWファイル関係なく自由にEXIF内に任意のキーワードを追加出来る。だからまずLighroom上でキーワードを追加し整理をするんだ。

Lightroomをお持ちでない方、恐らくここから先を読まずにページを閉じてしまうだろう。

しかし、どんな方法であれ自分がどんなレンズを使ったか理解出来ていれば一般的なファイラーを利用すれば同じような作業が可能になる。これは文末に示す。
ここでマウントアダプターを使って他社レンズを使った事がない方は「どうやって数本のレンズを写真だけで見極めるんだ?、撮影時に1コマ1コマ、メモ帳などにレンズ名を記載しているのか?」と思われるかもしれない。中にはデータマニアがいて、撮影した絞りを記録しているがいてそんな人は1コマずつどんなレンズを使っているかメモしているだろう。でも普通はそんな面倒はしない。

一番楽なのはそのレンズを装着した最初のコマで自分の指を写す。

「指1本はSMCM28mmF2.8」
「2本出していたらSMCM50mmF1.4」
「3本ならSMCM100mmF2.8」

などとルール付けておけば、あとはレンズに合わせて指を写すだけ。何本の指が立っているか、それが判れば良いのでピントが合っていなくても良いからだ。どこかのブログで「使いたいレンズを装着前にそのレンズを写す」なんて方がいらっしゃった。確かにこれが一番判りやすいが、サムネイルで見てそれってすぐに判らない。

FA28mmF2.8とFA50mmF1.4なんて外見はほとんど同じ。そんなレンズは世の中ゴロゴロある。またいちいちピント合わせなくちゃならないからかったるい。立てた指を写す場合、ピントが無限遠にでもなっていない限り、ピンボケしていてもすぐに判る。指を写すのが楽だって。

それをLightroomでチェックしながらキーワードにレンズ名を入れていけばLightroomはサムネイルを複数選択出来るのでたとえ5、6本のレンズを利用して1000枚撮影していてもその作業は10分以内で終えられるだろう。

ここで忘れちゃならないのはキーワードを登録してもそれはLightroom内で使われるだけ。だからキーワードを追加したファイルを選択している状態で(1000枚全てでその手のレンズを使っていたらJPGとRAW合わせて2000枚を全選択)メニューから「メタデータ、メタデータをファイルに保存(WindowsならCTRL+Sで保存出来る)」を行う必要がある。そうすればJPGファイルは上書きされ、RAWファイルはサイドカーファイルとしてxmpファイルが作られる。

これで準備完了。Lightroomで追加したキーワードはJPGはJPGファイル内の「Subject」と言うタグの中に保存される。RAWファイルなら同一名のxmpファイル内の同じくSubjectにある。


exiftool -subject *.xmp



上で確認しよう。中にはLightroomのキーワードを活用していて撮影ジャンルや撮影地を登録している人も多いだろう。そうなるとsubjectの中身は「千葉, 廃墟, SMCM50mmF1.4・・・」などとなっている。でも大丈夫。とにかく意図したレンズ名が記載されているか確認して頂きたい。

使用したレンズ(Lightroomのキーワードに追加したレンズ名)がSMCM28mmF2.8、SMCM50mmF1.4、SMCM100mmF2.8の3本だったとしよう。そしてレンズ名をそれぞれ「smc PENTAX-M 28mmF2.8」、「smc PENTAX-M 50mmF1.4」、「smc PENTAX-M 100mmF2.8」でLightroomなどに表示させたかったとする。


exiftool -lens='smc PENTAX-M 28mmF2.8' -lensmodel='smc PENTAX-M 28mmF2.8' -focallength='28' -focallengthin35mmformat='56' -if '$subject =~ /SMCM28mmF2.8/i' -overwrite_original *.JPG *.xmp




exiftool -lens='smc PENTAX-M 50mmF1.4' -lensmodel='smc PENTAX-M 50mmF1.4' -focallength='50' -focallengthin35mmformat='100' -if '$subject =~ /SMCM50mmF1.4/i' -overwrite_original *.JPG *.xmp




exiftool -lens='smc PENTAX-M 100mmF2.8' -lensmodel='smc PENTAX-M 100mmF2.8' -focallength='100' -focallengthin35mmformat='200' -if '$subject =~ /SMCM100mmF2.8/i' -overwrite_original *.JPG *.xmp



最後の引数、*.JPGと*.xmpはフォルダ内の拡張子がJPGとxmpファイルの全てでこの処理をしなさいと言う事。おおよその人はJPG格納フォルダとRAW格納フォルダは分けていると思うので通常は*.JPG、*.xmpのどちらを指定すれば良い。

またifに続く条件式をeqで結んじゃ駄目。と言うのも上述した通り、subjectの中にはLightroomで入力したキーワードが全て含まれるからだ。よって上のように正規表現で「キーワード(subject)にその文字列が含まれているかどうか」で判断する。

また正規表現の部分の最後の「i」、これを付ける事により大文字小文字を区別しない。よってLightroomで入力したキーワードが「smcm50mmF1.4、SMCM50MMf1.4、smcM50mmF1.4」等と「/SMCM50mmF1.4/i」は全て一致する。と言う事は「/smcm50mmf1.4/i」でも良い。

良くやらかすミスはexiftoolでの-ifの続く比較用の文字列とLightroomで入力したキーワード文字列が違っている場合。'smcm50mmF1.4'、'smc m50mmF1.4'、'smc m 50mm F1.4'、'smcm 50mmF1.4、'smcm 50 mm F1.4'、これらは異なる文字列として扱われるので注意が必要だ。

さて、上の3つは1つのフォルダ内の写真ファイルで3本のレンズを使用していた例。EXIF内容を書き換えてそれを上書き保存するので、画素数(JPGの大きさ)やパソコンの処理能力にもよるがうちの環境で100枚の処理で1分くらい。だから1000枚もあるとそれなりに待たされる。処理中はフリーズしたように見えるが、処理が終わるまで我慢、放置!。

フリーズしたか否かはあらかじめテストフォルダで10個のJPGファイルを用意しタイムを計測。100枚だったら10倍、1000枚だったら100倍すればおおよその処理時間が判る。それを大幅に超えていたらフリーズしていると考えれば良いだろう。

そして処理を終えたらLightroomを起動する。ここで最後の仕上げ。Lightroom上でメタデータを更新する必要があるので「フォルダの更新」、もしくはフォルダ内の全ファイルを選択した後、メニューから「メタデータ、メタデータをファイルから読み込み」を行う。


撮影中にちゃんと1コマずつ絞り値をメモしたから絞り値も表示させたい!、そんなデータマニアでもまずはLightroomのキーワードに絞り値を登録する事から始めれば1000枚のファイルがあっても1枚1枚ちまちまとexiftoolだけで作業するよりも遥かに楽だと思う。

この際、絞り値に「F2.8」なんてキーワードを登録したら駄目だ。上のSMCM28mmF2.8やSMCM100mmF2.8とダブってしまうから誤った処理をしてしまう。「Fnumber2.8」、「Fstop2.8」とかユニークな文字列で登録する事。


exiftool -fnumber=1.4 -if '$subject =~ /fnumber1.4/i' -overwrite_original *.JPG *.xmp
exiftool -fnumber=2.0 -if '$subject =~ /fnumber2/i' -overwrite_original *.JPG *.xmp
exiftool -fnumber=2.8 -if '$subject =~ /fnumber2.8/i' -overwrite_original *.JPG *.xmp
exiftool -fnumber=4.0 -if '$subject =~ /fnumber4/i' -overwrite_original *.JPG *.xmp



正規表現でレンズのF値を正しく認識させるには・・・。

正規表現は「.(ドット)」は「改行文字を除いた任意の1文字」にマッチする特殊文字として扱われる。よって正規表現の「F1.4」にマッチするのは「F1.4」の他に「F114、F154、F1a4、F1,4(カンマ)」などが出てきちゃう。「F1.4」だけにマッチする正規表現は「F1\.4」としなくちゃならない。「.(ドット)の前に\を置く事でドットをドットをみなすのだ。

よって、、、

-if '$subject =~ /fnumber1\.4/i'
-if '$subject =~ /fnumber2\.8/i'

などとしなくちゃならない。但し、わざわざLightroomのキーワードにF154とかF2a8なんて書く筈もなく本記事では面倒なので「F1.4、F2.8」のままとしている。
そして私はこうやって撮影の度にキーボードをパチパチするのが面倒だった。これらを(Lightroom上での作業は別にして)全自動でやって欲しい!。そこで出てくるのがPerlとPerl用のexiftoolモジュールだ。これを使ってスクリプト(プログラム)を書く事でどんなデジタルカメラで撮影された写真であろうが、レンズが10本あろうが100本あろうが、写真ファイルが千枚あろうが1万枚あろうが一発でレンズ名や焦点距離データを追加出来ちゃう(勿論枚数に応じて処理時間は掛かる、1万枚処理したら数時間)。

前々回の記事の冒頭でリンクしている記事中にもそんなスクリプトを少し紹介している。現在はアルゴリズムを改良し、さらに進化させ、フォルダ内のファイルが同一メーカーのものなら(つまり複数メーカーのカメラで撮影した写真が混在していない限り)、JPG、RAWファイル、xmpファイルを認識し、それぞれに処理を与える、まさに一発で全てのファイルを更新出来るようなスクリプトを作った。

今回、そのスクリプトは紹介しない。あまりにもマニアック過ぎるのとこの手のスクリプトを動かすにはPerl本体とPerl用Exiftoolモジュールその他諸々、UNIXライクな環境を整える必要があるからだ(私は少々古く、今も尚cygwinで構築している)。

Perl?、UNIX?、それ何?、そのような方はそれらを構築するまでに100%躓くと思うし、UNIXを使い慣れている方なら簡単にそんなスクリプトを書けるからだ。

それと私個人はJPG、xmpファイルだけでなくRAWファイルにもレンズ情報を入れたい時もあるのでそうなるとどうしてもPerlが必要になるのだが、普通はJPGとxmpファイルだけを更新すればおおよその現像ソフトでJPG、RAW共にレンズ名が表示され、上のようにexiftoolを利用するだけで何の問題もない。

Lightroomでキーワードを登録するとそれはxmpファイルに記録され、RAWファイルには記録されない。

そしてexiftoolは読み込んだ1つのファイル毎に処理を行い、同時の2つのファイルを云々と言った作業は出来ない。例えば、今読み込んでいる0001.xmpのsubjectにレンズ名があったら0001.ORF(OlympusのRAWファイル)にもレンズ名を書き込め、そんな処理は無理(な筈・・・)。

従ってperlを使ってスクリプトを書くしか術はない。perlも基本は読み込んでいるファイルに対しての作業なのだが、高級言語と同等の機能を持っており、0001.xmpのEXIFデータを読み込んでそれを0001.ORFに書き出す、そんな事が可能となる。

LightroomでxmpファイルだけでなくオリジナルのRAWファイルにもアクセスし情報を書き込むようなタグがあればそれを一時利用すれば良いのだが(使い終わったら元に戻せば良い)、Lightroomは非破壊編集だからEXIFデータさえもアクセスさせないと思う。
加えてRAWファイルは容量が大きいので読んで書いての作業を繰り返すとかなり時間が掛かる。2400万画素でも数百枚、数千枚単位となるとかなりの時間を必要とする。当然5000万画素クラスだとだとパソコンやディスクの処理能力が相当に高くないと・・・。

何故RAWファイルにもレンズ名や焦点距離を書き込む必要があるかと言うと・・・。

そもそもの始まりはPentaxカメラにて。Pentaxのカメラは電子接点のないレンズを装着する際、手振れ補正用に焦点距離を入力する。その値がFocalLengthにそのまま書き込まれる。

問題は焦点距離入力を忘れていたり、間違って入力していた時。これが結構あるんだ!。レンズを取っ替え引っ換えしているとおおよそどこかでやらかす。28mmレンズで撮影したのにEXIF内のFocalLengthが50になっていたりがざらにある。問題はExifToolを利用してxmpファイルにFocalLength、FocalLengthIn35mmFormatを修正してもオリジナルRAWファイルのデータが優先される事。

そうなるとRAWファイル側のFocalLength、FocalLengthIn35mmFormatの値を変更するしか術はない。勿論、値を削除してしまう方法もあるが、やる事は同じなのでだったら正しい値に書き換えた方が良いでしょう。

だから「通常」はRAWファイル内のEXIFの値を更新する必要は全くない。xmpファイルで十分。実際Pentaxの以外のカメラはその手のレンズを使ってもEXIFには記載されないのでわざわざRAWファイルを書き換える必要はない。よって無理にPerlやPerl用のExiftoolモジュールを学ばずとも、レンズ情報を登録するくらいなら上のようにExiftoolだけを使っていても面倒はない筈だ。

Lightroomをお持ちでない方へ・・・。

ファイル名やサムネイルそのものを複数選択出来、ファイル名一括変換処理が可能な画像ビューワー、ファイラーがあるのなら事は容易に進む。

例を挙げよう。

電子接点の無い他社の28mm、50mm、100mmの3本を使っていたとする。勿論どの写真でどのレンズを使ったかをメモや上述した方法で理解しているとする。

なぁに単純だ。28mmレンズを利用しているファイルを複数選択したら、そのファイル名の先頭に「28mm」とでも加えてリネームする。同じく50mm、100mmもファイルを選択後、「50mm」「100mm」を先頭に追加する。元がP1010001.JPGなら28mmP1010001.JPGとか50mmP1010002.JPG、100mmP1010003.JPGになる。あとはexiftoolで・・・。


exiftool -lens='smc PENTAX-M 28mmF2.8' -lensmodel='smc PENTAX-M 28mmF2.8' -focallength='28' -focallengthin35mmformat='56' 28mm*.JPG

exiftool -lens='smc PENTAX-M 50mmF1.4' -lensmodel='smc PENTAX-M 50mmF1.4' -focallength='50' -focallengthin35mmformat='100' 50mm*.JPG
exiftool -lens='smc PENTAX-M 100mmF2.8' -lensmodel='smc PENTAX-M 100mmF2.8' -focallength='100' -focallengthin35mmformat='200' 100mm*.JPG


その後、「28mm、50mm、100mm」で始まるファイル名を再び画像ビューワー、ファイラーにてファイル名一括変換機能を用いもとのファイル名に戻してやれば良い。

私が画像ビューワーにFastStoneのImage Viewerを利用している。

FastStone Image Viewer - Powerful and Intuitive Photo Viewer, Editor

日本語パッチは以下のサイトでダウンロード出来る。

TiltStr::不定期版: FastStone


にほんブログ村 写真ブログ デジタル写真へ
にほんブログ村のランキングに参加中です



コメント

  1. RigelNightBug | URL | GzSZFFvQ

    指ですか、…成程!

    軟弱者なので、動画モードで音声を入れたり、別のカメラで設定値等を写したり、アダプター使用のレンズ本数は少ないので、WBバランスカードに記入したものを用意したり…(w。

    音声は、スタジオに居た頃にも、メモを取りながら、その内容を口述して、自腹で購入した(笑)、未だ当時はそれなり以上の価格だったマイクロカセットで録音していました。

  2. BigDaddy | URL | -

    > RigelNightBug さん

    3本だったらかなりボケても判りやすいグーチョキパーが良いでしょうし、2本しか使わなかったり、最短撮影距離の長い望遠レンズなんかを持っていく場合は手よりも足を写すと良いかと思います。右足は100mm、左足は200mmとか決めて。

    設定値、オールドレンズなら重要な値は絞りだと思うのですが、これも予めファーストカットの絞りを決めちゃうと良いのではないでしょうか?。私は手持ちのオールドレンズはF2.8以上の明るいレンズなので最近は常に最初のコマをF2.8で撮影し、あとはEXIFのシャッタースピードとISO感度を見て他のコマの絞り値を推測して書き入れています。

    まぁ雲の流れの速い場所での撮影ではその推測に誤りがある時もありましょうが、おおよそ間違いなかったら良いかなと思っています。

    フィルム時代、データマニアがいて、マイクロカセットで絞りとシャッタースピードを後述記録している人は周囲に何人かいましたね。特にフィルム時代晩年、フィルムからデジタル化し、それをホームページなどで公開している人なんてちゃんとしたデータを残したかったらしく1コマ撮影してはぼそぼそとカセットのマイクに吹き込んでいたのを何度も見ていました。

コメントの投稿

(コメント編集・削除に必要)
(管理者にだけ表示を許可する)