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

ExifTool : LightroomがSigmaレンズを認識しないから無理矢理書き換える

2014年07月22日 00:00

untitled

untitled

Pentax K-5, Sigma AF17-70mmF2.8-4OS HSM

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



今回、かなりマニアックなお話になり、特に記事後半はプログラミングが生業、もしくは趣味な方でないとまんずチンプンカンプンだろう。

Lightroomはカメラが吐き出した写真ファイルのEXIFデータ内に曖昧なレンズIDが振られていたらそれを「不明」と処理しちゃう。

DxO Optics ProでもCapture One ProでもSigmaのレンズはちゃんと認識するか、候補から選ぶ方式なのに、Lightroomだけは問答無用でレンズ名が「不明」、もしくは「Simga Lens」となってしまう。SigmaがふざけたIDを振っているのか、AdobeがSigmaレンズに興味がないのか、いずれにせよ今回はそれを解消するお話・・・。

また、これはLightroomで認識するのに無理があるから、文句は言えないものの、電子接点のない過去のフィルムカメラ用Kマウントレンズは「K or M Lens」としか表示されないのもその手のレンズを多用しているカメラマンは不満だろう。

手持ちのレンズで「不明」なのはSigma 17-70mmF2.8-4(旧型)だけであるが、SigmaのレンズはPentaxレンズと同じIDが使われていたりと、今後もSigmaのレンズを使っている場合、何らかの対応をしないとせっかく検索機能(フィルタリング)が優れているLightroomを使う意味がない。

そこで威力を発揮するのが「キーワード」。Lightroomは1枚の写真に対して、複数の任意のキーワードを盛り込める。だからそこに「Sigma AF17-70mmF2.8-4OS HSM」と書き込んじゃえば、キーワードからSigmaレンズを検索出来る。

フィルム時代のMレンズでもそう。「SMC P55mmF1.8」とキーワードを設定すりゃ(ユーザーが手入力する)、このレンズで撮影された写真全てを瞬時に表示してくれる。

レンズ名では「不明」とか「K or M Lens」になってしまうけど、キーワードタグからレンズを絞り込める。だから運用上、特に不満はないのだが・・・。とある際とにてメタデータとしてxmpファイル、もしくはjpg、dngファイルに直接、レンズ名を書き込めるなる情報を得た。

ほぼどんなカメラのEIXFデータを参照出来るコマンドライン上で動作するexiftool.exeに、Lightroom上で機能するGUIのプラグイン、これを駆使して不明レンズやK or Mレンズに具体名を記述出来ちゃうみたいだ。

うーん、盲点だったなぁ。exiftoolなるEIXF関連のプログラムがあるのは知っていたが、閲覧、表示しか出来ないと思い込んでいた。書き込みも出来、それが直接でなくxmpファイルに書き込めるなんて知りもしなかった。

exiftoolの存在を知ったのはこれを使えば自分のカメラのシャッターカウンターを見られるなる情報を得て。良く価格.comで話題になっているでしょう?。中古のカメラを買ってexiftoolで調べたらカウンターが3千しかなく、新品同様、ラッキーだった!、なんてネタ。

でもこれって浮かれちゃいけないんだよね。シャッターカウンターってあくまでもカメラを制御しているソフトウェアが数えているだけだから基盤を交換したり、なんらかの修理が入り、そのソフトウェアが初期化された瞬間にカウンターは0に戻る。

スポーツ観戦好きのカメラマンは一日で信じられない程のシャッターを切っているようで、そんなカメラマンが3年使ったカメラって一体どれくらい・・・。最近は販売店の3年長期保証が当たり前になっているから、売り飛ばす前にメーカーに修理を依頼し、ソフトウェアが初期化されていたら・・・。

10万回以上(野球、サッカー好きなら3年でこれくらい行くでしょう)シャッターを切っているのにexittoolでは数万、数千、下手したら数百だったりする。だからこんなもので一喜一憂しているなんて滑稽だ。勿論、カウンターを見て10万なんて記録されていたらいたでそれはそれで失敗した~とガックリしちゃうんだろうけど(笑)。

事実うちのK-5一号機は昨年11月に基盤を全交換しているから、その時点でカウンターは0に戻っている。だから使って4年目に突入しているが、カウンターはまだ1万2千だったりする。

中古を買ったら、その足でサービスを訪れ、シリアル番号で修理履歴を教えて貰うのが一番じゃなかろうか?。履歴がなければexiftoolで得たシャッタカウンターを信じて良いし、あればその数字はあてにならない。メーカーによっては修理内容を教えてくれるかもしれないし、修理時点のシャッターカウンターを記録しているかもしれない。

スポーツ撮影で使われるようなカメラ、つまり、連写が得意なカメラはなるべくなら中古で買わない方が良いし、もし中古でも長期保証を得られる販売店があったら、高くてもその保証に入るべきだ。


んで、やってみた!。

何かあったら怖いのでテスト用のフォルダを作成し、そこに数枚のPEFファイルを保存し、実行。なるほど、「不明」がちゃんと「Sigma AF17-70mmF2.8-4 DC Macro OS HSM」になったぜ!。レンズ名は何でも良く、面倒なら「Sigma 17-70mmF2.8-4」だけでも良い。要は本人が理解出来ればどんなネーミングでも良い。

※テストした結果、Windowsの文字コードがShift JISなので、2バイト文字、つまり日本語だと文字化けするので半角文字しか駄目で、「シグマの像面湾曲がひどい標準ズーム」なんてレンズ名は使えない(笑)。どうしても日本語にしたかったら、UTF-8の使えるコンソール、もしくはunixをWindwosで再現するcygwinを使うしかない(この辺の話は後日!)。

よし!、じゃぁ実践だ!!!・・・、しかぁ~し!!!。

幾つかのフォルダで「そんなFileねぇ!」と怒られる。読み込むxmpファイルが見つからないって言われるんだな。勿論、xmpファイルは存在している。なんじゃろ?、何がいけないんだ?。そんな時にMS-DOSや、Windows上からcygwin上でlinuxを動かしていた時代を思い出した。

もしかして、exiftool.exeって引数に日本語などの2バイト文字が入っていたら駄目なんか?。案の定、そうだった。exiftool.exeの引数に日本語パス名が入っていたんだ。要するにフォルダ名は撮影日+撮影地で命名しているから、いわゆる「0x5c問題」でこける。

ほとんどの日本語は大丈夫なのだが、特定の漢字で誤認識する。今回は「十」や「能」で引っかかり、フォルダ名に「十二社」とか「十条」、「飯能」なんて入っていたら誤認しちゃってそんなフォルダねぇよ!、と怒られちゃう。こんなのはかつて散々味わった。

英語(1バイト文字)しか考えていないプログラムだと駄目なんだよね。unicodeが無かった時代、日本語等の2バイト文字はコンピューター上では特殊な存在だった。

ならば元を直すしかないのか?。運良くすぐにexiftoolの本体ソースを見つけた。純粋なC++のクラスとして装備されているので、仕様を見る限り、難しくなさそうだ。これのラッパーを作りゃいいのね!。それを、はなっからShift JISなんて無視していてunicode(UTF-8)なcygwinのシェル上から起動させればいいんじゃね?。

C++で書かずとも、Perlで書かれたクラス(モジュールだっけか?)をそのまま使ってラッパースクリプトを用意するのが一番簡単なのかもしれない。さすがに思ってすぐにコードを書ける程天才じゃないので、この辺に関しては数日後!。

まぁLensTaggerからEixftoolを呼び出し、日本語を認識出来ない時はすぐにエラーで帰ってくるので、まずはエラーにならないフォルダでレンズ名を書き換え、エラーになったフォルダはカレントフォルダに移動して、手動でexiftoolを使う、その方がわざわざプログラミングするよりも時短な気もする。

Sigma 17-70mmが使われている写真を選択後、lightroomのプラグイン、LensTaggarを起動させ、そこに表示されるコマンドをエディターにコピー。欲しいのは選択されたファイル名だけ。あとはエディターでちょいちょいとバッチファイルでも作ってやって、エラーになるカレントフォルダでコマンドライン上で実行。これで問題はない。

当然、撮影日によってはSigma 17-70mmしか使っていない時もあるので、それは簡単。ワイルドカードで*.xmpを指定してやるだけで済む。またexiftool.exeそのものも引数に制限があるみたい。これはWindowsの制限なのかな?。だから例えば1つのフォルダに1000のファイルがあり、ワイルドカードが使えなかったら全てのEIXFを書き換えようと思ったら、結構面倒臭ぇ!。50枚毎にexiftoolを起動させ、それを20回やらねばならん。

LightroomのプラグインはLightroom Plugin SDKなるプログラミング環境を整えれば簡単に作れちゃうらしい。恐らくオブジェクト指向系の言語だろうから、単純な話、Lightroomで選択されている写真のファイル名だけを得られれば良く、1000枚選択してたら、引数制限でこけないようにexiftoolを1000回起動するようなバッチファイルを出力させる、そんな仕様にしちゃえば良い。

※そもそもLensTaggerと言うプラグインがVbScriptを使って引数を認識している部分で、選択したファイルが多過ぎるとエラーになるから(要するにWindowsの仕様?)、大量のファイルをどーこーするにはLenTaggerは使えない

そのLightroomのSDK解説ページを見たら、トホホ、英語だよ・・・。はぁ、日本語だったらやったるでぇ!、と思ったけど、これを趣味レベルでやるなんぞ時間がなく、物理的に無理。

まぁとにもかくにも上述の通り、エラーにならないフォルダはLightroom上のLensTaggarで変換し、エラーになるフォルダはカレントフォルダに移動して、コマンドラインでちょこちょこやっていく、先ずはこの方法で1ヶ月くらい作業しようと思う。

Sigma 17-70mmを使っているのはRAW、JPG合わせて5万枚。1ヶ月で何枚変更出来るか、それを見てからだなぁ。ソースファイルを解析したり、LightroomのSDKでどうにかするのは・・・。

しかし、21世紀の今も尚、海外製とは言え、日本語を誤認識しちゃうプログラムがあるなんてびっくりだ。しかもそれを指摘しているブログやホームページがないんだよねぇ。Exiftool.exeを使ってこうやってレンズ名を付け加える自体がマニアックな事なのかもしれないな。

やっぱり上述の通り、PerlでガリガリとExiftoolのラッパーを書くのが一番か?。はぁ、Perlねぇ、10年振りくらいで使う気がする・・・(笑)。

と・・・、ここで今日の記事は終わる筈だった。ところが、exiftool.exeの引数にifが使えるじゃないか!。要するに引数に「もしEXIFの内容がhogeならばfooせよ」が可能みたい。

なるほど、だったら楽勝じゃないか!。うちの旧型Sigma 17-70mmF2.8-4はLensIDに"8 13"が割り当てられている(現行は違うだろう)。だからLensIDが"8 13"だったらレンズ名をSigma 17-70mmにしなさいよ!、とコマンドラインで打ち込めば良いんだな。色々と試行錯誤した結果、以下を写真ファイルのあるフォルダ上で実行すれば果たして全て変換してくれた。

exiftool -Lens="SIGMA 17-70mm F2.8-4 DC MACRO OS HSM" -LensModel="SIGMA 17-70mm F2.8-4 DC MACRO OS HSM" -LensType="SIGMA 17-70mm F2.8-4 DC MACRO OS HSM" -m -overwrite_original -if "$XMP-Aux:LensID eq '8 14'" *.xmp

※1、PEFでなくxmpサイドカーを対象とするのは、オリジナルのRAWに何かあったら困るのと(まず問題はないだろうが、将来Lightroomの仕様が変化した時、不安だから)、Rawfileはサイズが大きいので読み込み、書き込みに時間がかかり、数枚ならまだしも、数万枚に変換を掛けるのだから、テキストファイルのxmpを対称にした方が時短に繋がる

※2、-ifの後、$LensIDだと駄目、上のように$XMP-Aux:LensID、もしくはAuxを省略して$XMP:LensIDじゃないと上手く行かない、どうやらXMP AuxタグはAdobeの独自で付加しているデータのようで、他にも「LensID」と言う名のタグがあるみたい

※3、バックアップを作る時は、-overwrite_originalではなく、-overwrite_original_in_placeとするようだ

これでわざわざLensTaggarを立ち上げる必要もなく、引数の数でこける事もなく、しかも以前からRAWデータのサイドカーとしてxmpファイルは利用していたので、コマンド実行後、Lightroomでxmpを読み直せば良いだけで、先程、今年の撮影した分を全て変換したが、30分も掛からなかった。これなら数日で作業が完了するだろう。

同じSigmaレンズのAPO70-300mmF4-5.6もLightroomではちゃんと認識してくれない。「不明」にはならないが単に「Sigma Lens」と表記されるだけ。LensIDを調べたら"3 255"なので、、、

exiftool -Lens="SIGMA APO 70-300mm F4-5.6 DG MACRO" -LensModel="SIGMA APO 70-300mm F4-5.6 DG MACRO" -LensType="SIGMA APO 70-300mm F4-5.6 DG MACRO" -m -overwrite_original -if "$XMP:LensID eq '3 255'" *.xmp

この方法の欠点は将来、LensIDの"8 14"や"3 255"が振られているレンズが新たに出てきちゃった場合。Simgaのレンズではありえないが、Pentax純正のレンズでこの数字が振られる可能性はある。事実、Sigmaのフィルム時代のAFレンズの中にはPentaxと同じLensIDが使われており、DxO Optics Proでも「幾つかプロファイルがあるけどどれ?」と問われたりもする。まぁ、その時はその時できっと他に対応法が見つかる筈だ。

いやいや、待てよ!?。さっき調べたらxmpファイルのLensIDタグにはちゃんとSigm 17-70mmの正式名称が記録されている。とするとわざわざ、XMP:LenIDを参照する必要がなく、またxmpファイルを編集するのならLensTypeは無視されるみたいだから、、、

exiftool -Lens="SIGMA 17-70mm F2.8-4 DC MACRO OS HSM" -LensModel="SIGMA 17-70mm F2.8-4 DC MACRO OS HSM" -m -overwrite_original -if "$LensID =~ /Sigma 17-70mm/" *.xmp

exiftool -Lens="SIGMA APO 70-300mm F4-5.6 DG MACRO" -LensModel="SIGMA APO 70-300mm F4-5.6 DG MACRO" -m -overwrite_original -if "$LensID =~ /Sigma.*70-300mm/" *.xmp

と、こんなに簡単な記述になった。実行してもこれで問題ない。入力文字数は減ってもこれを毎度パチパチするのは面倒なので、パスの通ったフォルダにバッチファイルとして書き出し、あとは写真が格納されている各フォルダに移動し、問答無用で実行しちゃえば楽チン。

そう考えると不思議だよね。Lightroomの出力するxmpファイルにはちゃんとSigmaレンズの名称が記録されている。またレンズプロファイルだって存在する。だったら何故、フィルタ表示させると17-70mmは「不明」、APO70-300mmhは「Sigma Lens」と表示されるのだろうか?。Dxo Optics Proのように選択させれば済む問題なのに・・・。

本日の写真、Sigma 17-70mmF2.8-4を購入後の正真正銘のファーストカット。東京近郊にお住まいで特に中古機材を多く買われる方ならこの場所、判ると思う。そう、東京は中野のフジヤカメラから徒歩数十秒にある、何だろう、パブレストラン、洋風居酒屋?、そんなお店の壁。

この写真を撮った数日前、念願のエフニッパチズームのTmaron 17-50mmF2.8をフジヤカメラで購入したものの、びっくりするくらいの前ピン。当時利用していたPentax K20Dのピント微調節はサービスセンターでしか出来なかったし、幾らPentaxの人が優しいとは言え、社外品のレンズ用に微調節してくれる筈も無く、泣く泣く返品し、替わりに手にしたのがこのSigmaの17-70mmだったんだな。

Exiftoolネタ、次回も続く・・・。


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



コメント

    コメントの投稿

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