ConvolutionFilter

マスク処理の部分をConvolutionFilterで書き直してみました。すごく軽いです。
こんな感じ
ソースは右クリック



ConvolutionFilterとは?
ビットマップデータに畳み込み効果を適用するフィルタです。
このフィルタを使うと今までやってきた単純にマスクパターンを各画素に適用していく処理を簡単に書くことができます。


引数の説明
ConvolutionFilter(matrixX, matrixY, matrix, divisor, bias)


matrixX:
適用するパターンを表す配列の列数
matrixY:
適用するパターンを表す配列の行数
matrix:
適用するパターンを表す配列
divisor:
求めた画素値のRGBをそれぞれこの値で割る
bias:
求めた画素値のRGBにそれぞれこの値を加算する


例えば、エンボス処理のコード

//エンボス処理
private function emboss(mask_ary:Array):void{
    if(target_bmpData == null) return;
    
    var c:Color = new Color();
    var pix:Color = new Color();
    var sum_of_weight:Number = 0;
    var rr:int, gg:int, bb:int;
    
    //重みの合計を求める
    for(var i:uint = 0; i < mask_ary.length; i++){
        for(var j:uint = 0; j < mask_ary[i].length; j++){
            sum_of_weight += mask_ary[i][j];
        }
    }
    
    bmpData2 = new BitmapData(target_bmpData.width, target_bmpData.height);
    
    for(i = 1; i < bmpData2.width-1; i++){
        for(j = 1; j < bmpData2.height-1; j++){
            c.color = 0;
            rr = gg = bb = 0;
            for(var k:int = -1; k <= 1; k++){
                for(var l:int = -1; l <= 1; l++){
                    pix.color = target_bmpData.getPixel(i+k, j+l);
                    //重みを掛け合わせる
                    rr += pix.r * mask_ary[k+1][l+1];
                    gg += pix.g * mask_ary[k+1][l+1];
                    bb += pix.b * mask_ary[k+1][l+1];
                }
            }
            pix.r = rr/4+128;
            pix.g = gg/4+128;
            pix.b = bb/4+128;
            bmpData2.setPixel(i, j, pix.color);
        }
    }
    
    view.bitmapData = target_bmpData = bmpData2;
    myImage.width = view.width = myImage.width;
    myImage.height = view.height = myImage.height;
}


これをConvolutionFilterを使って直すと

//エンボス処理
private function emboss(mask_ary:Array):void{
	if(target_bmpData == null) return;

    bmpData2 = new BitmapData(target_bmpData.width, target_bmpData.height);
	
	var size:int = Math.sqrt(mask_ary.length);
	var filter:ConvolutionFilter = new ConvolutionFilter(size, size, mask_ary, 4, 128);
	
	bmpData2 = target_bmpData.clone();
	bmpData2.applyFilter(bmpData2, bmpData2.rect, new Point, filter);
    
    view.bitmapData = target_bmpData = bmpData2;
	myImage.width = view.width = myImage.width;
	myImage.height = view.height = myImage.height;
}


このくらい短くなります。
そして、処理がすごく速い。