DATE : 2006/07/21 (Fri)
JAI で基本となるクラスは、次の2つです。
ParameterBlock
処理を行う際のパラメータを設定するためのクラスです。
例えば、画像の周辺部を切り落とす Crop 操作は以下のパラメータを指定できます。(詳しくは、javax.media.jai.operator.CropDescriptorをご覧ください)
パラメータ名 | 型 | 説明 |
---|---|---|
x | java.lang.Float | 切り取る領域の原点の x 座標値 |
y | java.lang.Float | 切り取る領域の原点の y 座標値 |
width | java.lang.Float | 切り取る領域の幅 |
height | java.lang.Float | 切り取る領域の高さ |
なお、原点とは、領域の左上隅の座標のことを言います。
ここで、100×100の画像(java.awt.image.BufferedImage)の外周10 px を切り落とすとすると、パラメータは次のようになります。
パラメータ名 | 値 |
---|---|
x | 10 |
y | 10 |
width | 80 px |
height | 80 px |
このパラメータを構築するコードは、次のようになります。
ここでのポイントは、以下の通りです。
- addSource メソッドで操作対象の画像を指定する。
- add メソッドでパラメータを順番に指定する。
- パラメータの型に気をつける。
ParameterBlock parameter = new ParameterBlock();
// 操作対象画像の設定
parameter.addSource(image);
// パラメータの設定
parameter.add((float) 10);
parameter.add((float) 10);
parameter.add((float) 80);
parameter.add((float) 80);
ここで、操作対象の画像を表すオブジェクトは image 変数に格納されているものとします。
なお、addSource メソッドで指定できる画像は、java.awt.image.RenderedImage か java.awt.image.renderble.RenerableImage のどちらかです。今回は RenderedImage の方を指定しました。両者の違いは、今回は省略します。
なお、パラメータの型が異なると、操作の実行時に例外が発生します。
ちなみに、JAI には javax.media.jai.ParameterBlockJAI というクラスがあります。こちらを使うと、パラメータ名を指定して値を設定できます。
JAI
上で設定したパラメータで Crop 操作を行うコードは次の通りです。
RenderedOp result;
result = JAI.create("Crop", parameter);
ここで、create メソッドの第1引数で指定している文字列は、実行したい操作の名前です。具体的には、実行したい操作の「GrobalName」を指定します。例えば、Crop 操作の場合は、javax.media.jai.operator.CropDescriptor に「GrobalName」が「Crop」と設定されています。ちなみに、大文字小文字の区別はありません。「crop」と操作を指定しても、動作します。
なお、操作の結果返ってくるオブジェクトは、RenderedImage インタフェースを実装しています。そのため、続けて他の操作を行う場合は、返ってきたオブジェクトを次の操作の対象としてそのまま使うことができます。
DATE : 2006/07/20 (Thu)
インストール
Java Advanded Imaging (JAI) のインストールには、3通りの方法があります。
ここでは、Windows でのインストールを前提に話を進めていきます。
JAI は、「Java Advanced Imaging Binary Builds」のページからダウンロードできます。
現在リリースされている最新バージョンは、1.1.2_01です。
ダウンロードできるパッケージには、以下の3通りがあります。
- JRE にインストールするパッケージ
- Java の実行環境に JAI をインストールするパッケージです。「*-jre.*」という形式のファイルです。JAI が必要なアプリケーションを実行する場合は、このパッケージをインストールします。
- JDK にインストールするパッケージ
- Java の開発環境に JAI をインストールするパッケージです。「*-jdk.*」という形式をしたファイルです。JDK 付属の JRE を使って JAI が必要なアプリケーションを起動する場合は、このパッケージをインストールします。
- 指定のフォルダにインストールするパッケージ
- インストールするフォルダを指定できるパッケージです。「*-windows-*.exe」という形式をしたファイルです。クラスパス変数は自分で設定しなければなりません。
私個人としては、実行用に JRE / JDK にインストールするパッケージを、Eclipse のビルドパスや Maven の依存ライブラリへの設定のために「指定のフォルダにインストールするパッケージ」を使用しています。
ファイルの構成
JAI は、以下のファイルから構成されています。(ドキュメント類は除きます)
- jai_core.jar
- JAI の核となるクラスライブラリです。JRE や JDK にインストールした場合は、<JRE のインストールフォルダ>\lib\ext にインストールされています。
- jai_codec.jar
- 主に、各種画像形式のエンコードやデコードを行うクラスライブラリが収められています。jai_core.jar と同じフォルダにインストールされています。
- mlibwrapper_jai.jar
- ネイティブライブラリを呼び出すためのライブラリです。jai_core.jar と同じフォルダにインストールされています。
- mlib_jai.dll
- C で記述されたネイティブライブラリです。JRE や JDK にインストールした場合は、<JRE のインストールフォルダ>\bin にインストールされています。
- mlib_jai_mmx.dll
- MMX を使用したネイティブライブラリです。mlib_jai.dll と同じフォルダにインストールされています。
- checkmmx.exe
- MMX が使用可能かどうかを確認するためのプログラムです。
DATE : 2006/07/18 (Tue)
最近、Java Advanced Imaging というライブラリを知りました。
簡単に言えば、高度な画像処理用のライブラリです。例えば、画像の拡大・縮小・回転はもちろんのこと、ノイズ除去フィルタなどのフィルタや色変換、DFT、ヒストグラムの作成など、画像処理の基本的な手法がある程度揃っています。
また、一部の処理は C で実装されており、MMXを使って実行される処理もあります。
JIT が賢くなったとはいえ、処理の重い画像処理をネイティブでやってくれるので、とても心強いですね( ´∀`)。
ただこのライブラリ、一応 Sun が作ったもので歴史も古い(バージョン1.0 は1999年のリリース)のですが、日本語の情報が極端に少ないんですよね……(´・ω・`)「"Java Advanced Imaging"」で Google 検索しても、1000件程度しかヒットしません。
ということで、Java Advanced Imaging の使い方をメモしていくことになるかもしれません。
DATE : 2006/07/17 (Mon)
文字列を入力ストリーム(java.io.InputStream)に流すには、次のようにします。
(import 文などは省略)
ByteArrayInputStream inputStream = new ByteArrayInputStream(str.getBytes());
なお、この場合、入力ストリームにはプラットフォームで標準の文字コードが流れます。例えば、日本語 Windows の場合は Shift_JIS(正確には、MS932)です。
なお、String に格納された XML を入力ストリームに流すには、XML の文書型宣言に指定された文字エンコーディングを指定するようにします。例えば、以下のように UTF-8 が文字エンコーディングに指定されていたとします。
<?xml version="1.0" encoding="UTF-8" ?>
この場合は、次のようにして XML を入力ストリームに流します。
(import 文などは省略)
ByteArrayInputStream inputStream = new ByteArrayInputStream(str.getBytes("UTF-8"));
文字エンコーディングの宣言がない場合は、XML の仕様に沿って、UTF-8 で入力ストリームに流します。
ちなみに、この方法はごく限られた場面でしか使いません。通常は、入力ストリームではなく文字ストリーム(java.io.StringReader)を使います。文字列の入力を受け付けるメソッドが入力ストリームしか受け付けない場合にのみ、この方法が使えます。
DATE : 2006/07/16 (Sun)
ブログを巡回していて興味深い話があったので、ここにメモしておきます。
XHTML 1.0の仕様書(邦訳)を眺めてみると、「4.8 スクリプト要素およびスタイル要素」の項目に、スクリプトは CDATA として記述しなければならないという内容が書かれています。ここで、CDATA とは、簡単言えば文書中の文字列のことを言います。なお、XHTML 文書は PCDATA であり、これはブラウザの解析対象になる CDATA のことを言います。
つまり、PCDATA として記述しなければいけないところに CDATA の記述をそのまま混ぜると、スクリプト中にある「<」などの文字をブラウザが XHTML として処理してしまう恐れがあるというわけです。
上の仕様の中では、スクリプトを次のように記述するように勧告されています。
<script>
<![CDATA[
// スクリプトの内容
]]>
</script>
「<![CDATA[ ... ]]>」で囲むことで、スクリプトを CDATA として記述しています。
実際には、次のように CDATA 宣言はコメントアウトします。(例は JavaScript の場合)
<script type="text/javascript">
// <![CDATA[
// スクリプトの内容
// ]]>
</script>
script 要素の中身はスクリプトエンジンに解析されてしまいます。そのため、CDATA 宣言があると文法エラーになる場合があります。
CDATA の宣言なしで標準にあったスクリプトを書くには、「<」の部分を「\<」とエスケープするなどの方法があるようです。
また、XHTML 1.0 の仕様の「C.4 埋め込みスタイルシート及びスクリプト」では、XHTML の解析対象となっている文字が含まれる場合は外部スクリプトにするという勧告がなされています。具体的には、「<」・「]]>」・「--」が該当するようです。
XHTML に対応していないブラウザへの互換性も考えると、CDATA 宣言でスクリプトを記述するよりも、「<」・「]]>」・「--」が含まれている場合は外部スクリプトにした方が良いかもしれません。
もっとも私の場合は、面倒臭いので全部外部スクリプトにしようと思います。( ´ー`)コーディング時は、XHTML に埋め込みますが