与えられたイメージをフィルタリングする機能は、
JDK1.1 から存在します。
この場合、個々のピクセル値の操作は表面には現れません。
ImageProducer と ImageConsumer という抽象化された概念で取り扱われます。
フィルタのオブジェクトは ImageProducer から元のデータを読み込み
処理を行う ImageConsumerの性質と、新しいイメージのデータを提供する
ImageProducerの性質を合わせ持つことになります。
フィルタのクラスは ImageFilter およびそのサブクラス RGBImageFilterの
サブクラスとして設計します。
RGBImageFilter の filterRGB()メソッドにフィルタリングの処理を定義する
ことで、カラーフィルタを実現することができます。
import java.awt.Color;
import java.awt.image.RGBImageFilter;
public class RedFilter extends RGBImageFilter {
/** フィルタリングの処理を実行するメソッド */
public int filterRGB(int x, int y, int rgb) {
int r = (( rgb & 0x00ff0000 ) >> 16); // R成分のみ取り出す
return 0xff000000 | (r << 16); // アルファ値は 255
}
}
フィルタの処理の呼び出しの手順は次のようになります。
Image orig, filtered;
ImageFilter filter = new RedFilter(); // 上で独自に設計したフィルタクラス
ImageProducer source = orig.getSource();
ImageProducer newsource = new FilteredImageSource( source, filter );
filtered = createImage( newsource );
上の処理の次のように行をまとめて記述することもできます。
Image orig, filtered;
filtered = createImage(
new FilteredImageSource( orig.getSource(), new RedFilter() ) );
なお、フィルタリングの処理の対象は BufferedImageである必要はなく、 通常の Imageのオブジェクトでかまいません。