Java.awt.imageパッケージのクラスを使って簡単なイメージフィルターを作ってみましょう。
Javaのイメージ処理は、他のデスクトップアプリケーションなどとは違って ネットワークからイメージを読み込む場合を想定して、 イメージを少しずつ読みながら同時に表示できるようになっています。
イメージを少しずつ読みながらでも動けるようにして、 イメージが読み終わるまでアプレットが次の処理に進めなくなるのを 防ぐために、Javaではイメージの処理にProducer-Consumerモデルという 方法を採用しています。

| Producer | ネットワークからイメージを読み込むオブジェクトやイメージをあらわすbyteの配列など |
| Consumer | イメージデータを扱うオブジェクト |
Javaでイメージを表示するときには、ProducerとConsumerの他に画面にイメージを見えるようにするためにObserverになるオブジェクトが必要になります。
Observerは、Compomentクラスのサブクラスのインスタンスがなることができます。 Observerの一番簡単な例はAppletのインスタンスです。
イメージフィルタは、ProducerとConsumerの間に入ってイメージに処理を施します。 (イメージフィルター自信は、Producerから見るとConsumerになっています。); アップレットでイメージフィルターを使って加工したイメージを表示する場合は, オリジナルのImafeProducerとイメージフィルターを組にして、新しいイメージのソース(ImageProducwe)を作ります。
ImageProducer imgsrc = FilteredImageSource(ImageProducer orig, ImageFilter imgf);

イメージは、新しく作られたイメージのソースを元にcreateImageメソッドで作ることができます。
Image newimage = createImage(imgsrc);
あとは、アプレットのpaintメソッドで、drawImageメソッドを使ってイメージを表示するようにします。 drawImageの最後の引数には、ImageObserverを指定します。 下の例ではアプレット自信 this になっています。
public void paint(Graphics g) {
g.drawImage(newimage, 0, 0, this);
}
イメージフィルタの位置づけがわかったところで、次はイメージの 処理を行う簡単なフィルターを作ってみましょう。
ここでは、java.awt.imageパッケージの中のRGBImageFilterのサブクラスでRGBの色の強さを個々に指定できるフィルターを作ります。
RGBImageFilterには、filterRGBというアブストラクトメソッドがあります。 filterRGBの引き数には、ピクセルのx,y座標とRGBの値が渡されます、 サブクラスでこのfilterRGBメソッドにイメージ処理を実装し、復帰値に変換後のRGB値を返すようにします。
abstruct int filterRGB(int x, int y, int rgb)
引き数のrgbは、上から8ビットづつでそれぞれ、Alpha,Red,Green,Blueの値を表しています。(Alphaは透明度です)

また、filterRGBには、canFilterIndexColorModelというインスタンス変数があり、ピクセルのRGB値の計算がピクセルの座標に依存しない場合は、trueにするとイメージ処理が高速に行われます。
import java.applet.Applet;
import java.awt.*;
import java.awt.image.*;
//
// simpleRGBFilter
// RGBImageFilterの例
//
class SimpleRGBFilter extends RGBImageFilter {
int r_ratio, g_ratio, b_ratio;
// オリジナルのイメージのRGBの値に対する比率を0から100の間で設定します。
public SimpleRGBFilter(int r, int g, int b){
r_ratio = r;
g_ratio = g;
b_ratio = b;
canFilterIndexColorModel = true;
}
public int filterRGB(int x, int y, int rgb) {
int r, g, b;
r = (rgb >> 16 & 0xff) * r_ratio / 100;
g = (rgb >> 8 & 0xff) * g_ratio / 100;
b = (rgb & 0xff) * b_ratio / 100;
int newrgb = (255 << 24) + (r << 16) + (g << 8) + b;
return(newrgb);
}
}
//
// フィルターを使うアプレット
//
public class RGBFilterSample extends java.applet.Applet{
private ImageFilter rgbfilter;
private Image orgimage;
private Image newimage;
private ImageProducer imgsrc;
private ImageProducer orgsrc;
public void init() {
URL baseurl = getCodeBase();
//String imagename = getParameter("image-name");
String imagename = "rgbsample.gif";
if(imagename != null) {
orgimage = getImage(getCodeBase(), imagename);
orgsrc = orgimage.getSource();
rgbfilter = new SimpleRGBFilter(100, 100, 100);
imgsrc = new FilteredImageSource(orgsrc, rgbfilter); newimage = createImage(imgsrc);
}
}
public void update(Graphics g) {
paint(g);
}
public void paint(Graphics g) {
g.drawImage(newimage, 0, 0, this);
}
public void changeRGB(int r, int g, int b) {
if (r < 0) r = 0;
if (r > 100) r = 100;
if (g < 0) g = 0;
if (g > 100) g = 100;
if (b < 0) b = 0;
if (b > 100) b = 100;
rgbfilter = new SimpleRGBFilter(r, g, b);
imgsrc = new FilteredImageSource(orgsrc, rgbfilter);
newimage = createImage(imgsrc);
repaint();
}
}