†REXXのどろぬま†

デジカメ画像変換転送とExif情報

作成開始日 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;

●完成版デジカメ転送プログラム

と言うことで、デジカメ画像ファイルの検出、転送、XGA変換機能を組み込んで完成させたのがこれ。ただし、私の環境に合せて、サーチ対象ドライブは「J:〜M:」、画像転送先ディレクトリは「g:\digicama\_trf」に決め打ちとなっている。使用する場合は、必要に応じて書き換えて欲しい。

TRFX.CMD
PIPEEXIF.CMD


【REXXのどろぬま目次】 【ホーム】