category: Java
DATE : 2006/09/16 (Sat)
DATE : 2006/09/16 (Sat)
(前回の記事)
メソッド抽出の結果
これまでに行ってきたリファクタリングの結果を以下に掲載します。
リファクタリング前のコード :
/**
* 指定の画像にアルファチャンネルを加えます。
*
* @param image アルファチャンネルを加える画像
* @return アルファチャンネルを加えた画画像
*/
private static RenderedImage addAlphaChannel(RenderedImage image) {
// 対象画像の大きさ
int width = image.getWidth();
int height = image.getHeight();
// 対象画像のカラースペース
ColorSpace sourceColorSpace = image.getColorModel().
getColorSpace();
// アルファチャンネルのあるカラーモデル
ColorModel destColorModel = new ComponentColorModel(
sourceColorSpace, true, false,
Transparency.BITMASK, DataBuffer.TYPE_BYTE);
WritableRaster destRaster = destColorModel.
createCompatibleWritableRaster(width, height);
// 色成分のバンド番号の配列
int[] colorBandList = getColorBandList(destRaster.getNumBands());
// 色成分のみの WritableRaster
WritableRaster colorRaster = destRaster.
createWritableChild(0, 0, width, height,
0, 0, colorBandList);
WritableRaster alphaRaster = destRaster.
createWritableChild(0, 0, width, height, 0, 0,
new int[]{destRaster.getNumBands() - 1});
// 可視領域を表すアルファ成分のみの Raster
WritableRaster visibleMaskRaster =
createVisibleAlphaRaster(image);
colorRaster.setRect(image.getData());
alphaRaster.setRect(visibleMaskRaster);
return new BufferedImage(destColorModel, destRaster,
false, null);
}
/**
* 可視部分のアルファ成分のみを持つ WritableRaster を生成します。
*
* @param source 生成対象の画像
* @return 可視部分のアルファ成分のみを持つ WritableRaster
*/
private static WritableRaster createVisibleAlphaRaster(
RenderedImage source) {
// 画像の大きさ
int width = source.getWidth();
int height = source.getHeight();
// SampleModel
SampleModel sampleModel = new BandedSampleModel(
DataBuffer.TYPE_BYTE, width, height, 1);
WritableRaster raster = Raster.createWritableRaster(
sampleModel, new Point(0, 0));
int[] alphaSample = new int[width * height];
// データの最大値を設定(アルファ成分を最大にする)
Arrays.fill(alphaSample, 0xff);
raster.setSamples(0, 0, width, height, 0, alphaSample);
return raster;
}
/**
* 指定のバンド数から、アルファ成分を除いたバンド番号の配列を
* 返します。
*
* @param numBands バンド数
* @return アルファ成分を除いたバンド番号の配列
*/
private static int[] getColorBandList(int numBands) {
int[] bands = new int[numBands - 1];
for (int i = 0; i < bands.length; i++) {
bands[i] = i;
}
return bands;
}
リファクタリング後 :
private static int ALPHA_VALUE = Integer.MAX_VALUE;
/**
* 指定の画像にアルファチャンネルを加えます。
*
* @param image アルファチャンネルを加える画像
* @return アルファチャンネルを加えた画画像
*/
private static RenderedImage addAlphaChannel(RenderedImage image) {
ColorModel destColorModel =
createColorModelWithAlpha(image.getColorModel());
WritableRaster destRaster = destColorModel.
createCompatibleWritableRaster(
image.getWidth(), image.getHeight());
setColorSamples(destRaster, image.getData());
setAlphaSamples(destRaster);
return new BufferedImage(destColorModel, destRaster,
destColorModel.isAlphaPremultiplied(), null);
}
/**
* アルファチャンネルを追加したカラーモデルを生成します。
*
* @param src アルファチャンネルを追加する元となるカラーモデル
* @return アルファチャンネルを追加したカラーモデル
* @throws NullPointerException src が null の場合
*/
private static ColorModel createColorModelWithAlpha(ColorModel src) {
return new ComponentColorModel(src.getColorSpace(), true,
src.isAlphaPremultiplied(), Transparency.BITMASK,
src.getTransferType());
}
/**
* 指定の WritableRaster の色成分を設定します。
*
* @param dest 色成分を設定する WritableRaster
* @param src 色成分を表す Raster
*/
private static void setColorSamples(WritableRaster dest, Raster src) {
WritableRaster colorRaster = dest.createWritableChild(
0, 0, dest.getWidth(), dest.getHeight(),
0, 0, getBandListExceptAlpha(dest));
colorRaster.setRect(src);
}
/**
* 指定のバンド数から、アルファ成分を除いたバンド番号の配列を
* 返します。
*
* @param raster アルファ成分を除いたバンド番号の配列を取得する Raster
* @return アルファ成分を除いたバンド番号の配列
*/
private static int[] getBandListExceptAlpha(Raster raster) {
int[] bandList = new int[raster.getNumBands() - 1];
for (int i = 0; i < bandList.length; i++) {
bandList[i] = i;
}
return bandList;
}
/**
* 指定の WritableRaster にアルファ成分を設定します。
* ただし、WritableRaster には、アルファ成分を格納するバンドが
* 存在しなければなりません。
*
* @param raster アルファ成分を設定する WritableRaster
*/
private static void setAlphaSamples(WritableRaster raster) {
int alphaBand = raster.getNumBands() - 1;
for (int y = 0; y < raster.getHeight(); y++) {
for (int x = 0; x < raster.getWidth(); x++) {
raster.setSample(x, y, alphaBand, ALPHA_VALUE);
}
}
}
(つづきます)
PR
●この記事にコメントする
忍者ブログ [PR]
