- PR -

Jpegのexif形式ファイルからの画像解像度(幅高)取得について

1
投稿者投稿内容
あふさん
会議室デビュー日: 2007/08/30
投稿数: 3
投稿日時: 2007-11-06 18:04
Jpeg画像から、幅、高の解像度(dpi)を取得したいのですが、
下記APIから取得しようとしたところgetXDensity()では
NULLがかえってきてしまい取得できませんでした。

-------------------------------------------
private int physicalHeightDpi;
private int physicalWidthDpi;

JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(in);
JPEGDecodeParam param = decoder.getJPEGDecodeParam();
physicalHeightDpi = param.getXDensity();
physicalWidthDpi = param.getYDensity();
-------------------------------------------

しかし、windows環境で、該当ファイルのプロパティ(概要)にて、
確認したところ水平方向の解像度 300dpi,垂直方向の解像度 300dpi
と表示されています。

取得方法があると思うのですが、該当ヘッダーを下記のようにやって
みたのですが、うまいこと300dpiにたどりつきません。

--------------------------------------------
File file = new File("TEST.JPG");
ImageInputStream iis = ImageIO.createImageInputStream(file);
Iterator readers = ImageIO.getImageReaders(iis);

if (readers.hasNext()) {
ImageReader reader = (ImageReader) readers.next();
reader.setInput(iis);
System.out.println("[Trace] Image Reader : " + reader);
・・・
---------------------------------------------

どなたか、取得方法をご教示いただけないでしょうか?
よろしくお願いします。
ranco
大ベテラン
会議室デビュー日: 2007/11/02
投稿数: 112
投稿日時: 2007-11-07 14:04
非常に抽象的にしか答えられませんが(未経験なので)、求めるデータが、規格に基づいて、原データのmバイト目からnバイト目までにあるとすると、それをbyte[]に取り出してnew String()すればよいのでは?
IIJIMAS
ベテラン
会議室デビュー日: 2006/12/06
投稿数: 77
投稿日時: 2007-11-07 16:20
EXIFのバイナリから抽出する方法なら、
検索すると詳しく書かれたページを見つけました。
http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif.html
のページによると
Exifデーター部の構造の中の最初のIFD : Image file directory(IFD0の部分)の中に
エントリ(各12bytes)がいくつか入っています。IFD : Image file directory項目の項目の(TTTT ffff NNNNNNNN DDDDDDDD )と書いてある部分がエントリです。2文字で1byteを表しています。
このTTTT が0x011aならXResolution:横の解像度、TTTT が0x011bならYResolution:縦の解像度のエントリで、このDDDDDDDD にデータのオフセットが入っています。
ffffが5(unsigned rational)のときは分数(分子・分母)で入っています。

※ここのByteOrderはLITTLE_ENDIANのようです。

詳細は上記ページをご参照下さい。
あふさん
会議室デビュー日: 2007/08/30
投稿数: 3
投稿日時: 2007-11-12 10:49
rancoさん、IIJIMASさん、ありがとうございました。

ご教示頂いた、Exif形式の画像ファイル解説のページや、
http://www.utilz.jp/wiki/ExifGps
のページ等参考にして、作成してみました。

なぜか、解像度のエントリと、実際のデータ位置がバイナリ
を見る限りちがってますが、これは自分の仕様理解が、たらない
ところだと思いますので、仕様を見直してみます。

ご教示ありがとうございました。
あふさん
会議室デビュー日: 2007/08/30
投稿数: 3
投稿日時: 2007-11-12 11:18
エントリ位置とバイナリの実データ位置が違っていたのは、
ベースにするオフセットの位置が間違っていただけでした。

解決しました。ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)