JAVAイメージフィルタを作ろう

Java.awt.imageパッケージのクラスを使って簡単なイメージフィルターを作ってみましょう。

Javaのイメージ処理について

Javaのイメージ処理は、他のデスクトップアプリケーションなどとは違って ネットワークからイメージを読み込む場合を想定して、 イメージを少しずつ読みながら同時に表示できるようになっています。

Producer-Consumerモデル

イメージを少しずつ読みながらでも動けるようにして、 イメージが読み終わるまでアプレットが次の処理に進めなくなるのを 防ぐために、Javaではイメージの処理にProducer-Consumerモデルという 方法を採用しています。

Producer-Consumer

Producer ネットワークからイメージを読み込むオブジェクトやイメージをあらわすbyteの配列など
Consumer イメージデータを扱うオブジェクト

Javaでイメージを表示するときには、ProducerとConsumerの他に画面にイメージを見えるようにするためにObserverになるオブジェクトが必要になります。

Observerは、Compomentクラスのサブクラスのインスタンスがなることができます。 Observerの一番簡単な例はAppletのインスタンスです。

イメージフィルタ

イメージフィルタは、ProducerとConsumerの間に入ってイメージに処理を施します。 (イメージフィルター自信は、Producerから見るとConsumerになっています。); アップレットでイメージフィルターを使って加工したイメージを表示する場合は, オリジナルのImafeProducerとイメージフィルターを組にして、新しいイメージのソース(ImageProducwe)を作ります。

イメージは、新しく作られたイメージのソースを元にcreateImageメソッドで作ることができます。

あとは、アプレットのpaintメソッドで、drawImageメソッドを使ってイメージを表示するようにします。 drawImageの最後の引数には、ImageObserverを指定します。 下の例ではアプレット自信 this になっています。

RGBImageFilter

イメージフィルタの位置づけがわかったところで、次はイメージの 処理を行う簡単なフィルターを作ってみましょう。

ここでは、java.awt.imageパッケージの中のRGBImageFilterのサブクラスでRGBの色の強さを個々に指定できるフィルターを作ります。

RGBImageFilterには、filterRGBというアブストラクトメソッドがあります。 filterRGBの引き数には、ピクセルのx,y座標とRGBの値が渡されます、 サブクラスでこのfilterRGBメソッドにイメージ処理を実装し、復帰値に変換後のRGB値を返すようにします。

引き数のrgbは、上から8ビットづつでそれぞれ、Alpha,Red,Green,Blueの値を表しています。(Alphaは透明度です)

RGB

また、filterRGBには、canFilterIndexColorModelというインスタンス変数があり、ピクセルのRGB値の計算がピクセルの座標に依存しない場合は、trueにするとイメージ処理が高速に行われます。

完成したアプレット