Exifの必要な部分だけコピーする

写真撮影時の情報はexiftoolコマンドを使うと、余すところなくすべて確認できる。

$ exiftool R0015381.DNG

詳細に確認できることは素晴らしいこと。でも、あまりに項目数が多すぎると本来注目したい値が埋もれてしまう...。もっとシンプルに基本的な撮影情報をまず知りたい。そう、iPhotocommand-Iした時にウィンドウ右上に表示されるExif程度で十分なのだ。

f:id:zariganitosh:20130322133915p:image

exiftoolコマンドはすべてのExifを取得できるのだから、その中から必要な項目だけピックアップして、自分好みのフォーマットで出力するようにすれば良いはず。やってみた。

exiftoolコマンドの使い方

  • 当初、パイプで繋げて、grepawkに渡して必要な項目を取り出そうかと考えていたのだが...
$ exiftool -Model R0015381.DNG|grep -E '^Camera Model Name *:'
Camera Model Name               : GXR A12
  • そんなことをしなくても、タグ名をオプションに指定すれば、その項目だけが出力されるのであった。
$ exiftool -Model R0015381.DNG
Camera Model Name               : GXR A12
  • ちなみに、タグ名は-sオプションで確認できる。(タグ名:値というフォーマットで出力される)
$ exiftool -s R0015381.DNG
...中略...
Model                           : GXR A12
...中略...
  • さらに、欲しい値は「GXR A12」だけなので、cutやawkで取り出そうと考えていたのだが...
$ exiftool -Model R0015381.DNG|awk -F': ' '{print $2}'
GXR A12
  • そんなことをしなくても、-Tオプションを指定すると値だけになってくれるのであった!
$ exiftool -T -Model R0015381.DNG
GXR A12
  • さらに、タグ名のオプションを複数指定すると、タブ区切りテキストとして出力される。
$ exiftool -T -Model -LensID -ISO -FocalLength35efl -ExposureCompensation -FNumber -ShutterSpeed R0015381.DNG
GXR A12	GR Lens A12 28mm F2.5	200	18.3 mm	0	4.0	1/200


exiftoolコマンドは、痒い所に手が届く、素晴らしい使い勝手を備えていたのであった。

画像ファイルからExifをコピーする

以上のexiftoolコマンドの使い勝手の良さを利用して、画像ファイルから必要なExifをコピーするAppleScriptを作ってみた。

Finderバージョン


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/bin/exiftool -T -Make " & fpath & "|awk '{print $1}'"
set maker to result
do shell script "exiftool -T -Model -LensID -ISO -FocalLength35efl -ExposureCompensation -FNumber -ShutterSpeed " & fpath
set {camera_model, lens_id, iso, focal_length_35, ev, f_number, shutter_speed} to split(result, tab) if maker is not in camera_model then set camera_model to maker & space & camera_model
join({camera_model, lens_id, "ISO " & iso, focal_length_35, ev & " EV", "f/" & f_number, shutter_speed}, ", ") 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で画像ファイルを選択して、実行すると、クリップボードExifがコピーされるのだ。ペーストすると、こんな感じになる。
RICOH GXR A12, GR Lens A12 28mm F2.5, ISO 200, 18.3 mm, 0 EV, f/4.0, 1/200
  • その画像


iPhotoバージョン
  • 上記コードのon unix_path() ハンドラの部分を以下のように書き換えると、iPhotoで選択したアイテムのExifをコピーできるのだ。


on unix_path() tell application "iPhoto"
set sel_list to selection
sel_list's item 1's original path
end tell
end unix_path

アプリケーションのAppleScript

  • 上記コードは、それぞれ以下のように保存しておいた。
    • ~/Library/Scripts/Apprications/Finder/copy_exif.scpt
    • ~/Library/Scripts/Applications/iPhoto/copy_exif.scpt
  • すると、FinderやiPhotoがアクティブな時、そのアプリケーション用のスクリプトとして表示されて便利。

f:id:zariganitosh:20130322092334p:image:w263
f:id:zariganitosh:20130322092454p:image:w263

  • ちなみに、AppleScriptエディタの設定は以下のようにしている。

f:id:zariganitosh:20130322092455p:image:w450