任意方向へのブラー


エフェクト処理の中に任意方向へのブラーを追加
こんな感じ
ソースは右クリックで見れます。


前回のやつを任意の方向効果をかけられるようにした感じです。


追加した部分のソース

//任意方向へのブラー
private function effect_blur_arb(ef:int, ang:int):void{
    if(target_bmpData == null) return;
    bmpData2 = new BitmapData(target_bmpData.width, target_bmpData.height);
    
    var nn:int;
    var px:Array = [], py:Array = [], pat:Array = [];
    var mx:int;
    var pat_sum:int;
    var oo:int = 0;
    var mask_ary:Array;
    
    //フィルタの大きさ
    mx = 2*ef+1;
    
    //マスクパターンが入った配列の取得
    mask_ary = makeBlurPat(mx, ang, px, py, pat, pat_sum);
    var count:int = mx*mx;
    for(var i:int = 0; i < count; i++){
        oo += mask_ary[i];
    }
    var filter:ConvolutionFilter = new ConvolutionFilter(mx, mx, mask_ary, oo);
    
    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;
}

private function linarPol(c1:int, c2:int, c3:int, c4:int, xr:Number, yr:Number):int{
    var d:Number, e:Number, f:Number;
    var res:int;
    
    d = Number(c1)*(1.0-xr)+Number(c3)*xr;
    e = Number(c2)*(1.0-xr)+Number(c4)*xr;
    f = d*(1.0-yr)+e*yr;
    res = (f + 0.5);
    if(res > 255) res = 255;
    else if(res < 0) res = 0;
    return res;
}

private function getPatVal(mat:Array, n:int, x:int, y:int):int{
    if(x < 0 || y < 0 || x >= n || y >= n) return 0;
    
    return mat[x+y*n];
}

private function linearInterpolate(mat:Array, n:int, x1:Number, y1:Number):int{
    var mx:int, my:int, dep:int;
    var px:int, py:int;
    var nx:int, ny:int;
    var xrate:Number, yrate:Number;
    var col1:int, col2:int, col3:int, col4:int, col_n:int;
    
    nx = int(x1);
    ny = int(y1);
    px = int(x1);
    py = int(y1);
    xrate = x1 - Number(px);
    yrate = y1 - Number(py);
    col1 = getPatVal(mat, n, px, py);
    col2 = getPatVal(mat, n, px, py+1);
    col3 = getPatVal(mat, n, px+1, py);
    col4 = getPatVal(mat, n, px+1, py+1);
    return linarPol(col1, col2, col3, col4, xrate, yrate);
}

private function makeBlurPat(n:int, ang:int, x:Array, y:Array, val:Array, sum:int):Array{
    var tmpv:Array=[];
    var mat:Array=[];
    var msum:int, tsum:int;
    var i:int;
    var vv:int;
    var hf:int;
    var rad:Number;
    var fx:Number, fy:Number, tx:Number, ty:Number;
    var sinT:Number, cosT:Number;
    var mask_ary:Array = [];
    
    hf = n / 2;
    
    //配列の初期化
    for(var yy:int = 0; yy < n; yy++){
        for(var xx:int = 0; xx < n; xx++){
            mat[xx+yy*n] = 0;
        }
    }
    
    msum = 0;
    
    for(xx = 0; xx < n; xx++){
        vv = 1;
        mat[xx+hf*n] = vv;
        msum += vv;
    }
    
    mat[hf+hf*n] = 3;
    rad = Number(ang)*Math.PI/180.0;
    sinT = Math.sin(rad);
    cosT = Math.cos(rad);
    
    i = 0;
    tsum = 0;
    for(yy = 0; yy < n; yy++){
        for(xx = 0; xx < n; xx++){
            tx = Number(xx-hf);
            ty = Number(yy-hf);
            fx = cosT*tx+sinT*ty + Number(hf);
            fy = -sinT*tx+cosT*ty + Number(hf);
            vv = linearInterpolate(mat, n, fx, fy);
            mask_ary[i] = vv;
            tsum += vv;
            i++;
        }
    }
    
    val = tmpv;
    sum = tsum;
    return mask_ary;
}