ImageIO で JAI を使う
JDK 1.4 から導入された Image I/O のおかげで Java から各種フォーマットの画像を簡単に読み書き出来るようになった。
// 画像の読み込み |
標準でサポートされているフォーマットは、JDK 1.4 で GIF (読み込みのみ), JPEG, PNG、JDK 1.5 では加えて Windows (OS/2) Bitmap, Wireless Bitmap が追加されているようだ。どのような形式をサポートしているかは以下のコードで確認できる。
String[] format = ImageIO.getReaderFormatNames(); format = ImageIO.getWriterFormatNames(); |
上記を JDK 1.4 で実行すると:
C:>"c:\Program Files\j2sdk1.4.2_09\bin\java" IIOSupported |
また JDK 1.5 の場合は以下のような出力になる。
C:>"c:\Program Files\jdk1.5.0_05\bin\java" IIOSupported |
JDK 1.6 ではこれに加えて、Unisys の LZW 特許が切れた GIF の書き込みをサポートしている。
これだけサポートされていれば大抵の場合は十分なのだが、TIFF など特定フォーマットのサポートが必須なアプリケーションや、画像変換のようにサポートフォーマットの豊富さがユーザビリティに直結する類のアプリケーションもあるだろう。
そこで Java Advanced Imaging (JAI) を使って Image I/O のサポートフォーマットを増やしてみよう。
◆ インストール
JAI 自体は 2 次元処理を行うためのライブラリだ。これを Image I/O から使うためには Java Advanced Imaging-Image I/O Tools を使用する。今のところ 1.1 は α なので、1.0_01 か 1.0 をダウンロードしよう。Tools には JAI が含まれているので JAI 本体を別途ダウンロードする必要はない。
1.0_01 を選択した場合は 4 種類のインストーラーから選ぶことが出来る。
Signed Auto | Java Plugin で自動でダウンロード & インストールするための署名付きJAR |
CLASSPATH | 手作業で CLASSPATH を設定 |
JDK | JDK 用インストーラー |
JRE | JRE 用インストーラー |
上記 CLASSPATH, JDK, JRE はダウンロードしたファイルを実行してやればインストールは完了する。用途に合わせて好きなものを選べば良いだろう。
ちなみに Linux ではカレントディレクトリをインストール対象の JAVA_HOME に移動して実行する必要がある (JAVA_HOME は java コマンドが入っている bin ディレクトリの一つ上のディレクトリを意味する)。
JDK 1.4 が入っているにもかかわらず、1.5 やその他の JDK が既にインストールされている場合はバージョンチェックに引っかかることがあるようだ (「JDK 1.4 or higher must be installed!」 というポップアップが出てインストールを強制終了させられる)。この場合 1.0 の方を試してみよう。
1.0 はインストーラーの無いただの ZIP ファイルだ。解凍して全ての JAR を JAVA_HOME\jre\lib\ext に、DLL を JAVA_HOME\jre\bin にコピーしてやればインストールは終了。それ以外のディレクトリに配置する場合は CLASSPATH と PATH の設定が必要になる。
憶測だが、1.0_01 もただの自己解凍 ZIP だと思うので、中のファイルを取り出して同じように配置してやれば動くと思われる。
インストールが完了したら先ほどのプログラムを実行してみよう。
C:>"c:\Program Files\j2sdk1.4.2_09\bin\java" IIOSupported |
おおぉ、猛烈に増えているではないかw
◆ まとめ
インストールの作業ではソースには一切手を入れていないことに注目したい。既に Image I/O を使用しているコードなら、上記のインストール作業だけですぐに利用可能になるのだ。
本当にこれだけで大丈夫か? ということで、手元で作れるだけの画像フォーマットを作成して読み込ませてみた。
フォーマット | AWT |
Image I/O |
JAI | ||
1.4 | 1.5 | 1.6 | |||
JPEG | △ | ○ | ○ | ○ | ○ |
PNG | △ | ○ | ○ | ○ | ○ |
GIF | △ | △ | △ | ○ | △ |
Bitmap | × | × | ○ | ○ | ○ |
Wirelesse Bitmap | × | × | ○ | ○ | ○ |
TIFF | × | × | × | × | ○ |
raw | × | × | × | × | ○ |
pnm (pbm, pgm, ppm) | × | × | × | × | ○ |
JPEG-2000 | × | × | × | × | ○ |
Lossless JPEG | × | × | × | × | ○ |
※△…読み込みのみ、青字…読み込み確認済み、赤字…読み込み失敗、黒字…未確認
raw 形式のみが失敗したようだが、名前からして本当に意図したフォーマットの画像になっているかちょっと自信がない。とりあえず 1.4 で本来読み込めないはずの BMP, WBMP, TIFF 画像が表示できたのでちゃんと機能しているようだ。
◆ JAIと火星探査
余談だが、Java および JAI は NASA の火星探査機 Spirit の地球側のコンソールとして使用されている。JAI で加工処理されたカメラ映像を見ながら、マウスでどちらへ動けば良いか決めているわけだ。
ただ Sun の広報活動のせいで Spirit 上で Java のバイトコードが動いていると思っている人も居るかもしれない。実際のところ火星で動いているのは、IBM RS/6000 に使われている Power シリーズに耐放射線性能を向上させた RAD6000 と、厳しいリソース状況で高い信頼性のある VxWORKS というリアルタイム OS の組み合わせだ。Spirit の RAM は 128MB しかない。
この手のハードは桁外れに高価な上 (RAD6000に至っては30万ドル) ミッション失敗時のインパクトが大きいので、組み込み Java にはまだまだ荷が重すぎるようである。