晴歩雨描

晴れた日は外に出て歩き、雨の日は部屋で絵を描く

ソニーのデジカメ写真のEXIFから、クリエイティブスタイル、ピクチャーエフェクト情報を抜き出して、画像ファイル名にEXIF情報を付け足す。(ExifTool/JScript)

先日、価格.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

f:id:art2nd:20181129091706j:plain

このショートカットアイコンに、画像ファイルを複数まとめてドラッグ&ドロップすると、コマンドプロンプトに似たウインドウが開いて、まとめて結果が表示される。

※ 一度にウインドウに表示できる行数に制限がある模様。1度にドラッグ&ドロップする画像ファイルは40個以内にした方が良い。

f:id:art2nd:20181129091633j:plain

このウインドウに表示された結果テキストを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);

↓ 後日、パナソニック用のスクリプトを作成。