忍者ブログ
[157] [156] [155] [154] [153] [152] [151] [150] [149] [148] [146]

DATE : 2017/09/20 (Wed)
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


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
●この記事にコメントする
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード
●この記事へのトラックバック
この記事にトラックバックする:
忍者ブログ [PR]
ブログ内検索
最近の状況
リンク
カレンダー
08 2017/09 10
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
使用許諾
最新コメント
(08/15)
(05/04)
(03/06)
(03/04)
(09/25)
最新トラックバック
T/O
(11/05)
ブログ内検索
最近の状況
リンク
カレンダー
08 2017/09 10
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
使用許諾
最新コメント
(08/15)
(05/04)
(03/06)
(03/04)
(09/25)
最新トラックバック
T/O
(11/05)