MacでExifをコピーする

 ブログに写真を掲載するにあたり写真のExifを簡単に掲載できないかと探したところ、以下のページを見つけた。

Exifの必要な部分だけコピーする - ザリガニが見ていた…。
http://d.hatena.ne.jp/zariganitosh/20130322/copy_summary_exif

 早速上記の記事よりExiftoolをインストール。AppleScriptは書き方がわからないので丸コピで試してみた。
 が、以下の問題が発生した。

・「do shell script "exiftool"」が動いてくれない。上のリンクは2013年の記事のため、OSバージョンアップに伴いAppleScriptの仕様が変わった?
・SD1 Merrillの写真ではExifからレンズ名が取得できず、殆どのレンズがUnknown(****)という表記になる。
・レンズ交換式とコンデジでは求める出力が違う。

 これらの問題を色々調べたりこねくり回したりして以下のようになった。
 ちなみに一個目の問題はこのpdfを見て解決した。

 なお、記事執筆時点での環境はMac OS X 10.11 El CapitanにExiftool 10.04を利用している。

--ここから

set the clipboard to summary_exif(unix_path())
the clipboard

on summary_exif(fpath)
set fpath to quoted form of fpath
do shell script "/usr/local/bin/exiftool -T -Make " & fpath & "|awk '{print $1}'"
set maker to result
do shell script "/usr/local/bin/exiftool -T -Model -LensID -ISO -FocalLength -FocalLengthIn35mmFormat -MaxApertureValue -ExposureCompensation -FNumber -ShutterSpeed -SubjectDistance " & fpath
set {camera_model, lensid, iso, focal_length, focal35, maxf, ev, f_number, shutter_speed, distance} to split(result, tab)
if camera_model is "SIGMA SD1 Merrill" then
-- SD1 Merrill用処理
-- LensIDよりレンズ名取得
if lensid = "Sigma 8-16mm F4.5-5.6 DC HSM" then
set lensid to "8-16mm F4.5-5.6"
else if lensid = "Sigma 17-50mm F2.8 EX DC OS HSM" then
set lensid to "17-50mm F2.8"
else if lensid = "Unknown (8009) 18-35mm" then
set lensid to "Art 18-35mm F1.8"
else if lensid = "Unknown (8015) 24mm" then
set lensid to "Art 24mm F1.4"
else if lensid = "Unknown (8005) 35mm" then
set lensid to "Art 35mm F1.4"
else if lensid = "Unknown (8012) 50mm" then
set lensid to "Art 50mm F1.4"
else if lensid = "Sigma 70mm F2.8 EX DG Macro" then
set lensid to "MACRO 70mm F2.8"
else if lensid = "Sigma 105mm F2.8 EX DG OS HSM Macro" then
set lensid to "MACRO 105mm F2.8"
else if lensid = "Sigma 105mm F2.8 EX DG OS HSM Macro + 2x" then
set lensid to "MACRO 105mm F2.8 + TC-2001"
else if lensid = "Unknown (8003) 180mm" then
set lensid to "MACRO 180mm F2.8"
else if lensid = "Unknown (8003) 360mm" then
set lensid to "MACRO 180mm F2.8 + TC-2001"
end if
join({"" & camera_model, lensid, "@" & focal_length & " F" & f_number, shutter_speed, "ISO" & iso, ev & "EV"}, ", ")
else if camera_model is "DMC-LX100" then
-- LX100用処理
if maker is not in camera_model then set camera_model to maker & space & camera_model
join({"" & camera_model, focal_length & "(換算" & focal35 & ")" & " F" & maxf, "@F" & f_number, shutter_speed, "ISO" & iso, ev & "EV"}, ", ")
else
-- 上記二種類以外のカメラ用処理
if maker is not in camera_model then set camera_model to maker & space & camera_model
join({"" & camera_model, lensid, "@" & focal_length & " F" & f_number, shutter_speed, "ISO" & iso, ev & "EV"}, ", ")
end if
end summary_exif

on unix_path()
tell application "Finder"
set sel_list to selection
(sel_list's item 1 as alias)'s POSIX path
end tell
end unix_path

on split(sourceText, delimiter)
if sourceText = "" then return {}
set oldDelimiters to AppleScript's text item delimiters
set AppleScript's text item delimiters to delimiter
set theList to text items of sourceText
set AppleScript's text item delimiters to oldDelimiters
return theList
end split

on join(sourceList, delimiter)
set oldDelimiters to AppleScript's text item delimiters
set AppleScript's text item delimiters to delimiter
set theText to sourceList as text
set AppleScript's text item delimiters to oldDelimiters
theText

end join

--ここまで

 これでFinder上でファイルを選択し、AppleScriptを実行するだけでExifがクリップボードにコピーされるようになった。AppleScriptは触ったことがないので具体的になにが行われているのかあまり理解していない。
 変更箇所は殆どif文を追加しただけ。特にSD1 Merrillでのレンズ名取得は力技である。多くのレンズがそのままではUnknown(8009)のような表記になる。カッコの中は当然レンズ固有のユニークな番号が振られているが、できればレンズ名をそのまま書いてほしいものだ。
 ここに場合分けで載せた11種類は私の所持するレンズとテレコンの組み合わせのみであるため、流用する場合は自分の所持するレンズのLensIDを調べてif文を追加する必要がある。私も新しいレンズが増えるたびにif文を増やしていかなければならない。
 SPP内にはレンズIDとレンズ名を紐付けるための対応表があるはずなのでそれを見つければ全レンズを網羅できると思ったが、Mac版をざっと探したところ見つからなかった。LensList.txtというファイルはあったが、レンズ名は載っていなかった。
 ちなみにLensID以外にLensTypeという項目もあるが、こちらではテレコンの有無が検出できない。
 変換後のレンズ名はDGやEX、OSといった部分は省いてある。焦点距離とF値さえわかれば被るレンズを持っていないのでこれだけで十分だ。
 ひとまずこれで私の持つ主なカメラであるSD1 Merrill、α900、LX100でのExif取得が簡単にできるようになった。TG-3工一郎やSP-550UZ、EOS 20DではExifを取得する機会は殆どないであろうからひとまず無視している。
 この方法では以下のようにExifが出力される。

・SD1 Merrill
【SIGMA SD1 Merrill, Art 24mm F1.4, @24.0 mm F2.8, 1/1250, ISO100, 0EV】
【SIGMA SD1 Merrill, Art 18-35mm F1.8, @18.0 mm F1.8, 0.3, ISO100, +0.3EV】

・α900
【SONY DSLR-A900, Minolta/Sony 135mm F2.8 [T4.5] STF, @135.0 mm F4.5, 1/640, ISO100, 0EV】
【SONY DSLR-A900, Carl Zeiss Vario-Sonnar T* 24-70mm F2.8 ZA SSM (SAL2470Z), @60.0 mm F2.8, 1/10, ISO1600, 0EV】

・LX100
【Panasonic DMC-LX100, 34.0 mm(換算75 mm) F2.8, @F2.8, 1/125, ISO200, 0EV】
【Panasonic DMC-LX100, 10.9 mm(換算24 mm) F1.7, @F5.6, 1/160, ISO200, 0EV】

 あまり褒められた設定ではないものも混じっているが、気にしないでほしい。
 過去記事のFoveon X3 Merrillでの色被りでもこれを用いてExifを取得している。
 しかしVario-Sonnerの名前長いな。
 改良するとすればPASMの各モードを取得するくらいだろうか。

 ちなみにSIGMA Photo Proでも同じようにExifのコピーができないか試してみたが、Selectionを取得することができなかった。Winとソースを共有化しているため、AppleScriptには未来永劫対応できない構造らしい。残念。

 このExiftool、Exifを見るだけでなく書き換えることもできるらしい。というよりそちらが本来の使い方のようだ。
 SD1 Merrillではバッテリーを抜いた状態で放置していると時計が2011年1月1日になるため、日付の修正には使えそうだ。
 Exiftoolで色々なExifを見ると、こんな情報まで記録されているのかと驚くものも多かった。暇つぶしにはなると思うので、自分のカメラの出すExifを一度くらい見てみるのもおもしろいのではないだろうか。

0 Comments:

コメントを投稿