先日、価格.com掲示板で、DSC-RX100M6でクリエイティブスタイルやピクチャーエフェクトを設定して撮影した写真のEXIF情報を確認する方法を質問して、ExifToolというのを教えてもらった。
Windowsのコマンドプロンプトで使うツールだが、画像ファイルをドラッグ&ドロップでも結果を得られる。
以下のサイトから、「Windows Executable」をダウンロードして、解凍する。
解凍するとexiftool(-k).exeというファイルが現れる。コマンドプロンプトで使う場合は、これをexiftool.exeにリネームして使う。
※ exiftoolは、最初1回目の実行では結果表示まで10秒近く時間がかかるので辛抱強く待つ。
コマンドプロンプトでjpegファイルを指定して実行すると、EXIF情報の一覧が表示される。
exiftool.exe xxx.jpg
exiftoolに適当なオプションを指定すると、必要な情報のみを簡潔に得ることができる。
例えば、以下のようなオプションを指定すると
exiftool.exe -creativestyle -makernotes:contrast -makernotes:saturation -makernotes:sharpness -makernotes:pictureeffect xxx.jpg
次のような結果が得られる。
Creative Style : Standard Contrast : -2 Saturation : 0 Sharpness : +3 Picture Effect : Off
今回、その結果を使って、画像ファイル名にEXIF情報を付け足して、ファイル名だけ見れば、どういう設定で撮った写真かがわかるスクリプト(JScript)を作ってみた。
たくさんの写真を撮った場合、その中からクリエイティブスタイルやピクチャーエフェクトを設定した写真を探すのは面倒である。exiftoolとこのスクリプトを使えば、ファイル名を見るだけで簡単に該当の写真を探し出せる。
※ このスクリプトは、exiftoolを上記オプションで実行した結果にのみ対応しているので、汎用的には利用できない。
スクリプト(JScript)は、この記事の一番下に載せている。これをテキストファイルにコピー&ペーストして、拡張子「jse」のファイルにする。ファイル名は任意だが、とりあえずexif2ren.jseとする。これを、任意のフォルダに入れて置く。そのフォルダに「data.txt」というファイルも作っておく。
以下手順。
exiftool(-k).exeをexiftool.exeにリネームして、C:\Windowsに入れる。入れたexiftool.exeのショートカットを作成してデスクトップに置く。
ショートカットのプロパティを開いて、リンク先を次のように設定する。
C:\Windows\exiftool.exe -k -creativestyle -makernotes:contrast -makernotes:saturation -makernotes:sharpness -makernotes:pictureeffect
このショートカットアイコンに、画像ファイルを複数まとめてドラッグ&ドロップすると、コマンドプロンプトに似たウインドウが開いて、まとめて結果が表示される。
※ 一度にウインドウに表示できる行数に制限がある模様。1度にドラッグ&ドロップする画像ファイルは40個以内にした方が良い。
このウインドウに表示された結果テキストをCtrl-A、Ctrl-Cでコピーし、exif2ren.jseと同じフォルダにあるdata.txtを開いてペーストし保存する。
exif2ren.jseアイコンをダブルクリックして実行すると、out.txtというファイルが作成される。
作成されたout.txtの中身を開くと、以下の「out.txt サンプル」のように、renameコマンドが書かれている。
Contrast、Saturation、Sharpnessの補正がある場合、頭文字+補正値で表現する。ただ、Saturation、SharpnessはどちらもSで始まるので、それぞれ、tとpにした。c-2 t+2 p+2のように表現。
renameコマンドに問題が無いかを確認した上で、コマンドプロンプトへ、renameコマンドをコピー&ペーストで実行する。
※ このスクリプトを使う場合は、自己責任でお願いいたします。また、事前に画像ファイルのバックアップを取った上で利用願います。
【data.txt サンプル:exiftoolの結果】
======== C:/Temp/test/data/a001.JPG Creative Style : Standard Contrast : 0 Saturation : 0 Sharpness : 0 Picture Effect : Off ======== C:/Temp/test/data/a003.JPG Creative Style : Standard Contrast : 0 Saturation : 0 Sharpness : 0 Picture Effect : Miniature (auto) ======== C:/Temp/test/data/a004.JPG Creative Style : Standard Contrast : 0 Saturation : 0 Sharpness : 0 Picture Effect : HDR Painting ======== C:/Temp/test/data/a008.JPG Creative Style : Vivid Contrast : 0 Saturation : 0 Sharpness : 0 Picture Effect : Off ======== C:/Temp/test/data/a010.JPG Creative Style : Standard Contrast : -2 Saturation : +2 Sharpness : +2 Picture Effect : Off ======== C:/Temp/test/data/a011.JPG Creative Style : Standard Contrast : -2 Saturation : 0 Sharpness : +3 Picture Effect : Off 6 image files read -- press RETURN --
【out.txt サンプル】
rename C:\Temp\test\data\a003.JPG a003_Miniature_auto.JPG rename C:\Temp\test\data\a004.JPG a004_HDRPainting.JPG rename C:\Temp\test\data\a008.JPG a008_Vivid.JPG rename C:\Temp\test\data\a010.JPG a010_c-2_t+2_p+2.JPG rename C:\Temp\test\data\a011.JPG a011_c-2_p+3.JPG
【スクリプトコード:exif2ren.jse】
※ 2018/12/21修正:B&Wなど&が入った場合の処理を追加。
var fs = WScript.CreateObject("Scripting.FileSystemObject"); var ts = fs.OpenTextFile("data.txt"); var str = ts.ReadAll(); str = str.replace(/\n /g, '\n\n--------'); str = str.replace(/\n/g, '').replace(/\r/g, ''); str = str.replace(/: /g, ''); str = str.replace(/-- press RETURN --/g, ''); str = str.replace(/--/g, '\n\n'); str = str.replace(/ /g, ''); str = str.replace(/CreativeStyle/g, ' _'); str = str.replace(/PictureEffect/g, '_'); str = str.replace(/Contrast/g, '_c'); str = str.replace(/Saturation/g, '_t'); str = str.replace(/Sharpness/g, '_p'); str = str.replace(/\(/g, '_').replace(/\)/g, ''); str = str.replace(/_Standard/g, ''); str = str.replace(/_Off/g, '');
str = str.replace(/&/g, ''); str = str.replace(/_c0/g, '').replace(/_t0/g, '').replace(/_p0/g, ''); str = str.replace(/========/g, '\nrename '); var line_ary = str.split(/\n/); var out = ''; for (var i=0; i<line_ary.length; i++) { var buf = line_ary[i].split(/\.| /); if (buf[3]) { fn_ary = buf[1].split('\/'); out += buf[0] + ' ' + buf[1] + '.' + buf[2] + ' ' + fn_ary[fn_ary.length-1] + buf[3] + '.' + buf[2] + '\n'; } } out = out.replace(/\//g, '\\'); var fso = WScript.CreateObject("Scripting.FileSystemObject"); var outfile = fso.CreateTextFile("out.txt", true, true); outfile.Write(out);