
Perlで書いたexif読み取りアプリ、個人的には結構役に立っています。
そこで、このExif読み込みアプリ,もう少し極めてみようとおもいはじめました。
GGプログラマーとして、exif取得アプリを、なるべく近い外部仕様という条件で、いろんな言語で作る修行に挑戦してみます。Java,Scalr,C++,pythonなどなど。
この挑戦によって、自分の腕を維持することは無論、各言語自体の特徴を把握する比較言語学的なアプローチや、各言語を取り巻くエコシステムを比較文化論的に見渡ことができる気がしてきています。
そうそう、あとから、プロセスを検証できるように、実験ノートもちゃんと書きましよう。
まずは、java編。
Javaはprocessingでもお世話になっているので、私のMacBookの中ではPerlの次に慣れている言語と開発環境ですが、かなり苦戦.時間を使いましたが、ようやくできました。
できてしまえばなかなかいい使い心地です。
Javaの方がPerlより小回りがききますね。欲しいデータを欲しい形式でとりだすのはJavaのほうが楽。
ただ,Javaで書くと行数が増える気がします。そんなたいした処理じゃないのに。
javaの場合、PerlがCPANとして用意してくれたライブラリ相当のツールはいろんなところにあるようです。Apache projectだったり。エコシステムがしっかりしています。
ソースは、こんな感じ。
import com.drew.imaging.ImageMetadataReader;
import com.drew.imaging.ImageProcessingException;
import com.drew.metadata.exif.ExifIFD0Descriptor;
import com.drew.metadata.exif.ExifIFD0Directory;
import com.drew.metadata.exif.ExifSubIFDDescriptor;
import com.drew.metadata.exif.ExifSubIFDDirectory;
import com.drew.metadata.xmp.XmpDescriptor;
import com.drew.metadata.xmp.XmpDirectory;
import com.drew.metadata.Metadata;
import com.drew.metadata.Directory;
import java.io.File;
import java.io.IOException;
public class Read_Min_Tag
{
public Read_Min_Tag(String fileName)
{
File file = new File(fileName);
try {
Metadata metadata = ImageMetadataReader.readMetadata(file);
// obtain a specific directory
Directory directory = metadata.getDirectory(ExifSubIFDDirectory.class);
// create a descriptor
ExifSubIFDDescriptor descriptor = new ExifSubIFDDescriptor((ExifSubIFDDirectory) directory);
// obtain a specific directory
Directory directory2= metadata.getDirectory(ExifIFD0Directory.class);
ExifIFD0Descriptor descriptor2 = new ExifIFD0Descriptor((ExifIFD0Directory) directory2);
// obtain a specific directory
Directory directory3 = metadata.getDirectory(XmpDirectory.class);
XmpDescriptor descriptor3 = new XmpDescriptor((XmpDirectory) directory3);
//カメラ機種:Model
String Model = descriptor2.getDescription(ExifIFD0Directory.TAG_MODEL);
//レンズ種別:Lens
String Lens= descriptor3.getDescription(XmpDirectory.TAG_LENS);
//ISO:ISO
String ISO= descriptor.getDescription(ExifSubIFDDirectory.TAG_ISO_EQUIVALENT);
//焦点距離:FocalLength
String FocalLength = descriptor.getFocalLengthDescription();
//絞り:FNumber
String FNumber = descriptor.getFNumberDescription();
//シャッタースピード:ShutterSpeed
String ShutterSpeed = descriptor.getShutterSpeedDescription();
System.out.println("Model---->"+Model);
System.out.println("Lens---->"+Lens);
System.out.println("ISO---->"+ISO);
System.out.println("FocalLength---->"+FocalLength);
System.out.println("FNumber---->"+FNumber);
System.out.println("ShutterSpeed---->"+ShutterSpeed);
} catch (ImageProcessingException e) {
System.err.println("error 1a: " + e);
} catch (IOException e) {
System.err.println("error 1b: " + e);
}
}
public static void main(String[] args) throws IOException{
if(args.length == 1){
new Read_Min_Tag(args[0]);
} else {
System.err.println("usage: java Read_Min_Tag filename");
}
}
}
出力結果は、こんな感じ。
Model---->NIKON D5100 Lens---->18.0-55.0 mm f/3.5-5.6 ISO---->100 FocalLength---->18.0 mm FNumber---->F8 ShutterSpeed---->1/159 sec
Perl版にそっくりにできます。
おお!
■実験ノート■ 5/10:apache commons imagesを発見。インタフエースが汚そう。 5/10:保守が止まっているみたい。なので不採用。 5/10:metadata-extractorを発見。Drew Noakes氏がメンテ。 5/10:他にも面白そうな画像処理系ソフトを公開しているようす。 5/10:metadata-extractorはgoogle-code上でメンテが続いている。 5/10:インタフェースも軽そうなので、まず採用。 5/11:eclipseのプロジェクト環境整備に苦戦。 5/11:落としてきたbuild.xmlではant-buildが失敗.adobe-xmpのjarが必要 5/11:javacのメッセージが文字化け。エンコードを正す。 5/12:プロジェクトを作成する。jarをbuild pathにくわえる。 5/12:buil.xmlを読み始める。手修正。参照しているjarのフォルダー名が不一致 5/12:ecllipseは所詮、開発支援レベル。でも、それでいい。 5/12:junitが古い。最新をプロジェクトのライブラリにimport。 5/13:junitが失敗。成功5シナリオ、失敗1シナリオ。 5/14:junit成功。build.xmlに記述されているテストセットのパス定義がいい加減。 5/14:javaコマンドでの実行に失敗。クラスパス定義。 5/14:classファイルにはパスまで、jarファイルにはパス+ファイル名を記述。 5/15:javaコマンド成功。
コメントを残す