18-5:フィルタリングの処理


・ 与えられたイメージをフィルタリングする機能は、 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
     }
}

・ フィルタの処理の呼び出しの手順は次のようになります。

  1. フィルタのオブジェクトの生成
  2. フィルタの読み込みの ImageProducer の指定 (通常は Image の getSource() を呼び出す。)
  3. ImageProducerとフィルタのオブジェクトを指定して イメージの元となる ImageProducer(FilteredImageSourceクラスのオブジェクト) を生成
  4. ImageProducerから Imageを生成

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のオブジェクトでかまいません。