manakyu photo

写真を撮って並べるブログ

ブログに貼り付ける為の撮影情報をExiftoolを使って取り出しつつ整形する

やはり検索されることを考えるとカメラ名、レンズ名等が記事に出てくる方が望ましいと思います。

しかし手入力は面倒くさい!でもexiftoolsだけだとどう考えても全自動で取り出すのは無理!

仕方がないので別の手段を考えました。

f:id:manakyu:20151129144521j:plain

(NIKON D750,Nikon AF-S Micro NIKKOR 60mm f/2.8G ED, 1/50s, f/6.3, ISO 100)

(近所にて。写真に特に意味はありません)


とりあえず色々考えて何とか僕なりにひねり出した方法は「Powershellからexiftoolをキックして戻り値として得たexif情報をスクリプト内で整形してある程度まとまったテキストとして吐き出す」という形を取ることにします。

powershellなので多分Macの方は使えないです
そして恐らく相当面倒な手段を取っています。もっと簡単な手段がある人は鼻で笑いながらそちらを使いつつ僕にこっそり教えてください・・・

※この先めちゃめちゃ長いです。
最終形が知りたい方は以下のリンクから

完成形

 

出力のフォーマット

どんなのが綺麗かなと色々他のサイトとか見て考えましたが、最低限の情報をまとめるにあたり手近なところでphoto yodobashi(ヨドバシカメラのレビューサイト)の表記を参考にします

[PY] フォトヨドバシ NIKON AF-S NIKKOR 70-200mm F2.8G ED VR Ⅱ インプレッション | photo.yodobashi.com |

例えばこれは70-200 f2.8のページです。
撮影情報は写真に埋め込まれているんですがスタイルとしては

カメラ機種 , レンズ機種 , SS , 絞り , ISO , 撮影者

って感じですね。撮影者は全部ぼくなのでいりません。前の5項目を効率よく吐き出させたいと思います。

一つ面倒なのはRX100の時ですね。レンズ一体型なのでレンズ情報は出てきません。
これはもう割り切って消しちまいましょう。

5個の情報を引っ張り出してカンマ区切りで並べるだけです。
ここまでは実はexiftoolの中で出来ることがわかりました

更にもう一つ問題なのが、exif情報の中のレンズ情報は非常に限定的であると言う事です。
例えば「AF-S Nikkor 70-200mm F/2.8G ED VRII」という正式名に対してexifでは「70-200mm F/2.8」くらいしか出てきません。
なので自分の持っているレンズと比較して、正式なレンズ名を割り当ててやらなくてはいけません。

具体的なアプローチ

最初書き出した時はもうちょっと面倒かと思いましたが、実質やるべきことはレンズ名の部分の処理だけです。
まずはレンズ情報がどのように取り出されるかのサンプルを作るために、自分の持ってるレンズ全てについて過去に撮った写真からexif情報を取り出してどのように記述されるかを確かめます。


レンズ一覧が完成したらそれぞれの正式名称をネットなんかで適当に調べてきます。

exifの情報をキーとして正しいレンズ名を受け取り、文字列に置き換えると言う感じにします。

exiftoolの書式

-pオプションで所定のフォーマットを与えてやることでその通りの文面で出力します。
今回だと以下のようなフォーマットファイルになります。

($model, $Lensmodel, ${ShutterSpeed}s, f/$Aperture, ISO $EXIF:ISO)

これを.fmtという拡張子のファイルに保存し、以下のようにコマンドラインで指定します

exiftool -p ff.fmt aa.jpg

出力はこんな感じ

NIKON D750, 24.0-120.0 mm f/4.0, 1/400s, f/8.0, ISO 100

もう9割完成ですね。これでいいんじゃないかなって思っちゃうけど検索に引っかかるようにしたいのでレンズ名フルに入れていきます。

例えばこの場合の「24.0-120.0 mm f/4.0」の正式名称は 「AF-S NIKKOR 24-120mm f/4G ED VR」になります。
簡単に言えば「24.0-120.0 mm f/4.0」を「AF-S NIKKOR 24-120mm f/4G ED VR」に置換すればいいわけ。

もうちょっというと、exiftoolの出力のカンマ区切りで2項目目の文字列をキーに検索して正しい製品名を選択して置換する、と言う事をPowershellの中でやらせるってことですね。

Powershellの中で$Lensという変数に「24.0-120.0 mm f/4.0」を入れてきて

$lensinfo = switch -wildcard ($Lens)
{
"*24.0-120.0*" {"AF-S NIKKOR 24-120mm f/4G ED VR"}
"*70.0-200.0*" {"AF-S Nikkor 70-200mm F/2.8G ED VRII"}
default {""}
}

こんなイメージですね。wildcardオプションは全文書くのが面倒だったから。
これで$lensinfoの中にレンズ名がちゃんと入ります。

レンズが見つからない時は空白を返します。

最後に全体を$exifとしたときReplaceを使って

$exif.replace($lens, $lensinfo)

とすればレンズ部分だけ書き換わったものが最終的に出力されることになります。

ファイルの取得

さてじゃあこの一連のコマンドができたーってなった時に、そのスクリプトに対してどうやって処理するファイルを指示するかですが、ファイルを開くダイアログを出るように設定します。

コードは面倒なのでまるっとコピペです。
以下のページに説明がありますdialog.ps1の内容を借用します。

PowerShellでフォルダ/ファイル選択ボックスを利用する − @IT

修正するのはinitialdirectoryと、okが押された後の挙動の部分です。
okが押されたら、得られたファイル名をそのままexiftoolに渡します。

完成品

さてゴチャゴチャ話しましたが完成品はこれです。

#fmtfileの場所を指定してください
$fmtfile = "D:\exiftool\ff.fmt"


# System.Windows.Formsアセンブリを有効化
[void][System.Reflection.Assembly]::Load("System.Windows.Forms, Version=2.0.0.0, Culture=Neutral, PublicKeyToken=b77a5c561934e089")

# OpenFileDialogクラスをインスタンス化し、必要な情報を設定
$dialog = New-Object System.Windows.Forms.OpenFileDialog
$dialog.Filter = "画像ファイル(*.PNG;*.JPG;*.GIF)|*.PNG;*.JPG;*.JPEG;*.GIF"

#画像を保存してるフォルダを指定すると楽です
$dialog.InitialDirectory = "C:\"
$dialog.Title = "ファイルを選択してください"
# ダイアログを表示
if($dialog.ShowDialog() -eq "OK"){
#exiftoolを起動(フルパスで指定)
$exif = D:\exiftool\exiftool.exe -p $fmtfile $dialog.filename
#カンマ区切り2つ目の情報をlensに格納
$lens = $exif.split(",")[1]
#lensの情報を元に正しいレンズ名を取得
$lensinfo = switch -wildcard ($Lens)
{
#ここに出力のレンズ名と正しいレンズ名を同じ書式で記載。
"*24.0-120.0*" {"AF-S NIKKOR 24-120mm f/4G ED VR"}
"*70.0-200.0*" {"AF-S Nikkor 70-200mm F/2.8G ED VRII"}
default {""}
}
#レンズ名を置換し、クリップボードに貼り付け
$exif.replace($lens, $lensinfo) |clip
}
write-host "copy exif information to clipboard"

最終的に出力を特にせず、クリップボードにテキストを送っています。
実行が完了した後、ブログエディタ上の任意の位置でCTRL+Vを押すと以下の文字列が貼り付けられます。

(NIKON D750,AF-S NIKKOR 24-120mm f/4G ED VR, 1/400s, f/8.0, ISO 100)

ようやく理想形になりました。
若干起動に時間がかかるのが謎ですが。

何か所か謎にフルパス指定しないといけないところがあります。僕の宣言が悪いのかもしれませんがこれで動くのでもうこのまま行きます。

スクリプトの使い方

Windows7以降の場合
1.スクリプト文をコピーする
2.テキストエディタに貼り付けて「exifout.ps1」とか名前を付けて保存
3.エクスプローラーからexifout.ps1ファイルを右クリック>「Powershellで実行」を選択
3.1 もしくはテキストエディタに以下を貼り付け、「exifout.bat」と名前を付けて保存し、ダブルクリックで実行

powershell -NoProfile -ExecutionPolicy Unrestricted ./exifout.ps1

4.画像を選択するダイアログが出るので情報を取得したい写真を選択

5.Powershellのウィンドウが閉じたらクリップボードに情報が入ってるはずなのでブログエディタなどに貼り付ける

Vista以前はわかりません。色々足りないかもしれない。動作はWindows7と10で確認しています。

 

以上レポっす。次の記事から実際に写真に撮影情報を貼り付けていきます

参考までに数個前の記事の写真に同様に貼り付けてみたので御覧ください