DATE : 2006/08/30 (Wed)
(前回の記事)
BufferedImage にアルファチャンネルを追加するコード(一部)は、次のようになります。(import 文などは省略してあります)。
ここで、image はアルファチャンネルを追加する対象の画像(RenderedImage)、最後の return 文で返されるオブジェクトが、アルファチャンネルが追加された画像(BufferedImage)です。
// 1 ColorModel destColorModel = createColorModelWithAlpha(image.getColorModel()); // 2 WritableRaster destRaster = destColorModel. createCompatibleWritableRaster( image.getWidth(), image.getHeight()); // 3 setColorSamples(destRaster, image.getData()); // 4 setAlphaSamples(destRaster); // 5 return new BufferedImage(destColorModel, destRaster, destColorModel.isAlphaPremultiplied(), null);
コメントで示したとおり、上のコードは5つの手順に分かれています。ここからは、それぞれの手順を細かく見ていくことにします。
1. BufferedImage 用に、アルファチャンネル付きの java.awt.image.ColorModel を生成する
ColorModel destColorModel = createColorModelWithAlpha(image.getColorModel());
ここでは、createColorModelWithAlpha メソッドに、対象となる画像のカラーモデルを渡すことでアルファチャンネル付きのカラーモデルを生成しています。
createColorModelWithAlpha メソッドは、次のようなメソッドです。
private static ColorModel createColorModelWithAlpha(ColorModel src) { return new ComponentColorModel(src.getColorSpace(), true, src.isAlphaPremultiplied(), Transparency.BITMASK, src.getTransferType()); }
渡されたカラーモデルと同じ色空間、アルファ値の乗算状態、サンプルの型で、それでいてアルファ値をもつようなカラーモデルを生成しています。
なお、「Transparency.BITMASK」は、透明部分が「完全に不透明、もしくは完全に透明」であることを表します。つまり、アルファ値が1(不透明)か0(透明)かに限定されるわけです。もしも、任意の透明度を設定したい場合は、「Transparency.TRANSLUCENT」にします。(Transparency インタフェースは、java.awt パッケージにあります)
2. BufferedImage 用に、上の ColorModel が扱える java.awt.image.WritableRaster を生成する
WritableRaster destRaster = destColorModel. createCompatibleWritableRaster( image.getWidth(), image.getHeight());
java.awt.image.ColorModel には、そのカラーモデルが扱える WritableRaster を生成するメソッドがあります。
そのため、ここではそのメソッドを利用することで、生成したカラーモデルが扱える WritableRaster を生成しています。
(つづきます)