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; }
このくらい短くなります。
そして、処理がすごく速い。