- PR -

Java1.4でJPEGを読み込む

1
投稿者投稿内容
ocean
ベテラン
会議室デビュー日: 2003/07/06
投稿数: 65
投稿日時: 2003-08-18 19:48
みなさん、こんにちは。

Java1.4でJPEGを読み込む方法には、私の知る限り3通りあります。

1. Toolkit & MediaTracker
2. com.sun.image.codec.jpeg.JPEGCodec
3. javax.imageio.ImageIO

簡単に使えるのは3なのですが、一番新しいはずなのに一番遅く、特定のJPEGで異常に重いのです。ちなみに、一番速いのは2ですが、SunのJDKでしか動かないし、あまり使いたくはありません。

皆さんは、JPEGを読み込むときどのようにしていらっしゃいますか?また、このあたりについて詳しいサイトがあれば教えてください。
さくらば
大ベテラン
会議室デビュー日: 2002/11/12
投稿数: 145
投稿日時: 2003-08-18 22:08
こんにちは、さくらばです。

引用:

oceanさんの書き込み (2003-08-18 19:48) より:

皆さんは、JPEGを読み込むときどのようにしていらっしゃいますか?また、このあたりについて詳しいサイトがあれば教えてください。



自分の Web の宣伝になってしまってすいませんが、まさに同じことを比較してます。
http://www5.airnet.ne.jp/sakuraba/java/laboratory/graphics/ImageLoading/ImageLoading.html

J2SE のバージョンによっても変化しているようです。
J2SE 1.4.0 では Exif の大きいファイルを読み込むとエラーが起こることがあったの
ですが、1.4.2 ではなくなっています。

また、Image I/O は次の URL で新しいツールキットが公開されています。多分、次の
J2SE には入ると思いますが、一足早く使うことができます。このツールキットで JPEG 2000
も読み込めるようになりました。

また、普通の JPEG の読み込みも向上されているので、J2SE のバージョンをあげても
だめであれば、このツールキットを試してみるのもいいと思います。
さくらば
大ベテラン
会議室デビュー日: 2002/11/12
投稿数: 145
投稿日時: 2003-08-18 22:11
すいません、URL を書き忘れました。

引用:

さくらばさんの書き込み (2003-08-18 22:08) より:

また、Image I/O は次の URL で新しいツールキットが公開されています。



ここです。
http://java.sun.com/products/java-media/jai/downloads/download-iio.html
ocean
ベテラン
会議室デビュー日: 2003/07/06
投稿数: 65
投稿日時: 2003-08-19 00:06
はじめまして、さくらばさん。Java In the Box の管理人さんだったんですね。よく閲覧させていただいてます。

引用:

また、普通の JPEG の読み込みも向上されているので、J2SE のバージョンをあげても
だめであれば、このツールキットを試してみるのもいいと思います。



情報ありがとうございます。さっそく試してみます。
ocean
ベテラン
会議室デビュー日: 2003/07/06
投稿数: 65
投稿日時: 2003-08-19 00:38
試してみました。やっぱり、特定のJPEGに対しては遅いです。例えば、下のファイルですが、com.sun....なら1秒未満で終わるのに、3秒ほどかかったりします。どうも、プログレッシブだと遅いようです。

http://www.msfc.nasa.gov/news/news/photos/2001/2001images/0176_illustration_with3_m.jpg

http://www1.msfc.nasa.gov/NEWSROOM/news/photos/2002/2002images/gcenter_xray_rgb_m.jpg

JavaTM Advanced Imaging Image I/O Tools 1.0 Notes Introduction には、「プログレッシブのデコードはできません。J2SE core のプラグインを使ってください」とあるので、将来は改善されるのかもしれません。(でも J2SE core も同じ挙動を示すんですよね

でも、なぜ com.sun... で高速な実装をしておきながら、それを使わないんだろう。何か理由があるんでしょうか?

#追記
J2SE core の JPEG Plugin を disable してないため、新しいプラグインが使われていない気がしてきました。また明日考えます・・・


[ メッセージ編集済み 編集者: ocean 編集日時 2003-08-19 01:04 ]
さくらば
大ベテラン
会議室デビュー日: 2002/11/12
投稿数: 145
投稿日時: 2003-08-19 13:12
こんにちは、さくらばです。

引用:

oceanさんの書き込み (2003-08-19 00:38) より:
試してみました。やっぱり、特定のJPEGに対しては遅いです。例えば、下のファイルですが、com.sun....なら1秒未満で終わるのに、3秒ほどかかったりします。どうも、プログレッシブだと遅いようです。



どうやらプログレッシブは鬼門のようです ^^;;
以前、私が行っていたときは例外が起こってロードができなかったことを
思い出しました (J2SE 1.4 ベータのころだったと思います)
それ以来、プログレッシブは触れてはいけないものと...

引用:

でも、なぜ com.sun... で高速な実装をしておきながら、それを使わないんだろう。何か理由があるんでしょうか?



たぶん、いろいろな画像フォーマットを統一的に扱いたいからだと思います。
Image I/O を使えばフォーマットを気にすることなく扱えるのでプログラミング
は楽なのですが、その分パフォーマンスには目をつぶっているのでしょう。

引用:

J2SE core の JPEG Plugin を disable してないため、新しいプラグインが使われていない気がしてきました。また明日考えます・・・



ちゃんとコードをおっていないので不確かなのですが、Image I/O Tools を入れると
勝手に新しい Plugin を使うようです。

ImageIO#read メソッドを使用しないで、ImageIO#getImageReaderByMIMEType メソッド
などを使用すると、複数の ImageReader を取得することができます。

ImageIO#read メソッドでも内部では ImageReader オブジェクトを使用しているはず
なので、core で提供されている ImageReader と Image I/O Tools のそれのどちらかを
選択しているのだと思います。
ocean
ベテラン
会議室デビュー日: 2003/07/06
投稿数: 65
投稿日時: 2003-08-19 15:33
こんにちは。

引用:

たぶん、いろいろな画像フォーマットを統一的に扱いたいからだと思います。
Image I/O を使えばフォーマットを気にすることなく扱えるのでプログラミング
は楽なのですが、その分パフォーマンスには目をつぶっているのでしょう。



JPEGに特化すれば速くなるけど、ImageIOのフレームワークだとそこまで速くできないということですね。

引用:

ちゃんとコードをおっていないので不確かなのですが、Image I/O Tools を入れると
勝手に新しい Plugin を使うようです。

ImageIO#read メソッドを使用しないで、ImageIO#getImageReaderByMIMEType メソッド
などを使用すると、複数の ImageReader を取得することができます。



貴重な情報ありがとうございます。試しに、
ImageIO.getImageReadersByMIMEType("image/jpeg");
で見たところ、新しいプラグインの優先度は J2SE core のプラグインより上でした。
また、ImageReaderで新しいプラグインを直接使ってみたところ、プログレッシブは表示しませんでした。つまり、プログレッシブの場合は処理できないので J2SE core のプラグインにまかせているようです。そのため速度が変わらなかったのだと思います。

#ImageIOについて理解が深まった気がします。さくらばさん、ありがとうございます。


[ メッセージ編集済み 編集者: ocean 編集日時 2003-08-19 15:59 ]
1

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