†REXXのどろぬま†
作成開始日 2015.06.28
最終更新日 2015.06.28
1) 最近は私の常用サイズであるXGA(1024x768)モードのないデジカメが増えた
2) 露出情報を確認するために、いちいちPMViewでExifを表示させるのは面倒臭い
そこで、メモリカード/デジカメから画像ファイルを転送する際に、自動的に次のような処理をすることにした。
1) 画像サイズをXGAに変換する
2) ファイル名に露出情報を付加する
このうち、サイズ変換に関してはImageMagickのconvertなどを使えば簡単だが、Exif情報を読み出すのは少々厄介だ。ヘッダ部を自分で解析するという方法もあるが、けっこう面倒臭い(以前、Win用の写真印刷ツールを作った時にやったことがあるが…)。また、現在のImageMagickならばExifを取得することも可能なようだが、私が愛用している旧バージョンでは不可能。と言う事で、今回ではjheadというexif情報操作ツールを使うことにした(Hobbesで入手可能)。
jheadはかなり多機能なようだが、とりあえずExifの内容を表示させるだけにして、必要な情報を拾って、ファイル名に反映させることにする。なお、convertで変換するとExif情報が落ちてしまうが、jheadを使えば、元ファイルからExifをコピーすることもできるそうだ。が、まあ、それは混乱の元なので今回はしないことにする。
jheadeを使うと、たとえば次のように表示される。
File name : p4280002.jpg File size : 154296 bytes File date : 2015:04:28 15:26:56 Camera make : OLYMPUS IMAGING CORP. Camera model : AZ-2ZOOM Date/Time : 2015:04:28 15:26:56 Resolution : 1024 x 768 Flash used : No Focal length : 6.2mm Exposure time: 0.040 s (1/25) Aperture : f/2.9 ISO equiv. : 400 Whitebalance : Auto Metering Mode: pattern Exposure : program (auto) JPEG Quality : 86このjheadの出力の取り込みには、例によってパイプを使うことにした。次に示す出力仲介プログラムPIPEEXIF.CMDは、上記の出力から露出関係の情報(ISO感度、絞り、速度)を抜き出して、メインプログラムに引き渡す。メインプログラムは、その情報を反映させたファイル名を作る。なお、ここでは、メモリカード/デジカメから画像を転送する部分は省略して、ファイル名に露出情報を追加してリネームするルーチンだけを示す。
■メインプログラム
/* rExif.CMD 2015.06.28 */ /* 1.jhead.exeを使って写真ファイルからExif情報を読み取る */ /* 2.Exif情報から露出情報を抜き出してファイル名に反映させる */ /* 例) img00001.mpg → img00001-400-2_8-15.jpg(ISO400-F2.8-1/15")*/ fname='img00001.jpg' /* テスト用【注意】フルパス付きだとrenameで引っ掛かる */ /* fname=ARG(1) */ /* ツールとして使用するときはファイル名を引数に指定 */ '@jhead' fname '| PipeExif.cmd' PARSE PULL S; PARSE PULL F; PARSE PULL ISO; PARSE VAR fname body '.' ext newfname=body'-'ISO'-'F'-'S'.'ext /* 元ファイル名-感度-絞り-速度 */ SAY fname '->' newfname '@REN' fname newfname
■出力仲介プログラム
/* PipeExif.CMD (rExif.CMD/TRFX.CMD用) 2015.06.28 */ /* jheadが吐き出すEXIF情報を読み取る */ DO FOREVER PARSE PULL st IF st='' THEN LEAVE /* ISO感度の取得 */ IF POS("ISO EQUIV.",st)>0 THEN Do ISO=WORD(st,4) ISO=RIGHT('000'ISO,4) /* 感度は四桁揃え;10000以上には未対応 */ End /* 絞り値の取得 */ IF POS("APERTURE",st)>0 THEN Do F=WORD(st,3) F=SUBSTR(F,3) F=translate(F,'_','.') /* 例)F2.8:2.8→2_8;拡張子の混乱防止 */ End /* シャッター速度の取得 */ IF POS("EXPOSURE TIME",st)>0 THEN Do S=WORD(st,5) S=SUBSTR(S,4,LENGTH(s)-4) /* 例)1/30":1/30→30;逆数表記 */ End End PUSH ISO PUSH F PUSH S Exit;