画像処理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);
となる。