- - PR -
Jpegのexif形式ファイルからの画像解像度(幅高)取得について
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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); ・・・ --------------------------------------------- どなたか、取得方法をご教示いただけないでしょうか? よろしくお願いします。 |
|
投稿日時: 2007-11-07 14:04
非常に抽象的にしか答えられませんが(未経験なので)、求めるデータが、規格に基づいて、原データのmバイト目からnバイト目までにあるとすると、それをbyte[]に取り出してnew String()すればよいのでは?
|
|
投稿日時: 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-11-12 10:49
rancoさん、IIJIMASさん、ありがとうございました。
ご教示頂いた、Exif形式の画像ファイル解説のページや、 http://www.utilz.jp/wiki/ExifGps のページ等参考にして、作成してみました。 なぜか、解像度のエントリと、実際のデータ位置がバイナリ を見る限りちがってますが、これは自分の仕様理解が、たらない ところだと思いますので、仕様を見直してみます。 ご教示ありがとうございました。 |
|
投稿日時: 2007-11-12 11:18
エントリ位置とバイナリの実データ位置が違っていたのは、
ベースにするオフセットの位置が間違っていただけでした。 解決しました。ありがとうございました。 |
1