category: Java
DATE : 2006/09/10 (Sun)
DATE : 2006/09/10 (Sun)
(前回の記事)
処理の順序を整理する
まず手始めに、addAlpha メソッドの処理の流れを整理します。
とりあえず、「アルファチャンネルを追加した BufferedImage を作成する - 処理手順」に従ってコードを整理します。
整理した addAlpha メソッドは、次の通りです(javadoc コメントは省略しています)
private static RenderedImage addAlphaChannel(RenderedImage image) {
// 対象画像の大きさ
int width = image.getWidth();
int height = image.getHeight();
// 1 : アルファチャンネル付きのカラーモデルの生成
// 対象画像のカラースペース
ColorSpace sourceColorSpace = image.getColorModel().
getColorSpace();
// アルファチャンネルのあるカラーモデル
ColorModel destColorModel = new ComponentColorModel(
sourceColorSpace, true, false,
Transparency.BITMASK, DataBuffer.TYPE_BYTE);
// 2 : 1のカラーモデルを扱える WritableRaster の生成
WritableRaster destRaster = destColorModel.
createCompatibleWritableRaster(width, height);
// 3 : 2の WritableRaster の色成分を設定
// 色成分のバンド番号の配列
int[] colorBandList = getColorBandList(destRaster.getNumBands());
// 色成分のみの WritableRaster
WritableRaster colorRaster = destRaster.
createWritableChild(0, 0, width, height,
0, 0, colorBandList);
colorRaster.setRect(image.getData());
// 4 : 2の WritableRaster のアルファ成分を設定
WritableRaster alphaRaster = destRaster.
createWritableChild(0, 0, width, height, 0, 0,
new int[]{destRaster.getNumBands() - 1});
// 可視領域を表すアルファ成分のみの Raster
WritableRaster visibleMaskRaster =
createVisibleAlphaRaster(image);
alphaRaster.setRect(visibleMaskRaster);
// 5 : BufferedImage の生成
return new BufferedImage(destColorModel, destRaster,
false, null);
}
番号の振ってあるコメントは、「アルファチャンネルを追加した BufferedImage を作成する - 処理手順」の各手順を表しています。
具体的には、次のようにして処理の整理を行いました。
- 1 : アルファチャンネル付きのカラーモデルの生成
- アルファチャンネルのあるカラーモデルを生成しているところで処理を区切りました。
- 2 : 1のカラーモデルを扱える WritableRaster の生成
- 1の直後にある、WritableRaster を生成している処理で区切りました。
- 3 : 2の WritableRaster の色成分を設定
- アルファ成分を表す WritableRaster にデータを設定している部分の直前で一旦区切りました(具体的には、
alphaRaster.setRect(visibleMaskRaster);の直前)。しかし、この部分には、アルファ成分に関係する処理も含まれています。そこで、アルファ成分に関係する処理を4に移しました(具体的には、WritableRaster alphaRaster = destRaster. createWritableChild(0, 0, width, height, 0, 0, new int[]{destRaster.getNumBands() - 1});// 可視領域を表すアルファ成分のみの Raster WritableRaster visibleMaskRaster = createVisibleAlphaRaster(image);
の処理です) - 4 : 2の WritableRaster のアルファ成分を設定
- 3で移された処理を含めて、アルファ成分のデータを設定しているところで区切りました。
- 5 : BufferedImage の生成
- 最後に BufferedImage を生成しているので、この部分を5としました。
これで順序ごとに処理が分けられたので、ある程度は見やすくなりました。しかし、全体が長いためか、あまり分かりやすいようには思えません。
そこで、順序ごとに分けた部分を、メソッドとして抽出していきたいと思います。
(つづきます)
PR
●この記事にコメントする
忍者ブログ [PR]
