プログラム悪戦苦闘日記

はてなダイアリーからの移行(遺物)

画像処理3 - 抜き色転送

 通常抜き色転送は、抜き色はGraphic Contextに描画しないようにしますが、
Javaの場合、抜き色のalpha値を0にしてしまったほうが早い。
これを行うにはjava.awt.image.RGBImageFilterのサブクラスを作るのが、一般的らしい。
 RGBImageFilterのサブクラスは、

class KeyColorFilter extends RGBImageFilter {
	int colorKey_;
	
	KeyColorFilter(int argb) {
		canFilterIndexColorModel = true;
		colorKey_ = argb;
	}
	
	public int filterRGB(int x, int y, int argb) {
		if( argb == colorKey_ ) return 0x00000000;
		else                    return argb;
	}
}

抽象メソッドであるfilterRGB()をオーバーロードする。
また、canFilterIndexColorModelをtrueにする。
これで、ピクセル単位ではなく、画像全体に対して行うようになるので高速になるらしい。
 このクラスを使う側では、

	Image 			image 	= Toolkit.getDefaultToolkit().createImage(
								new URL(applet_.getCodeBase() + "image/" + applet_.getParameter("picture")));
	MediaTracker 	tracker = new MediaTracker(this);
	tracker.addImage(image, 0);
	tracker.waitForID(0);

	ImageFilter 	filter	 = new KeyColorFilter(0xFFFFFFFF);
	ImageProducer	producer = new FilteredImageSource(image.getSource(), filter);
	image = Toolkit.getDefaultToolkit().createImage(producer);

	tracker.addImage(image, 1);
	tracker.waitForID(1);

	image_ = new BufferedImage(640, 480, BufferedImage.TYPE_INT_ARGB);
	Graphics g = image_.getGraphics();
	g.drawImage(image, 0, 0, this);

となる。