« 2014年4月 | トップページ | 2014年6月 »

2014.05.22

JPEGメタ情報を取得したい!そんな時どうする?(Java編)

Dsc_1823shadow

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コマンド成功。

| | コメント (0) | トラックバック (0)

2014.05.04

May the 4th be with you!

Starwarsday2014heroshadow

今日は、新聞の朝刊にスターウオーズの全面広告が入ってきました。
StarWars の中でジェダイが言い交わす合い言葉、
"May the force be with you".
の中の"May"と”force"を使って”5月”、”4日”にちなんだイベントを創ろうとしたようです。
いよいよEpisode VIIの制作発表もされたので、勢いをつけたいんでしょうね。
Episode VIIを見るまで、達者でいないと!!

| | コメント (0) | トラックバック (0)

« 2014年4月 | トップページ | 2014年6月 »