2017年2月9日木曜日

拡散フィルタ(DiffusionFilter)

 今回は拡散フィルタを作成します。拡散フィルタは色を拡散してすりガラス越しに見たような効果を出します。これは単純に各ピクセルをランダムに任意の範囲に拡散するだけです。

 Tutorial1Activityクラスと同じ場所にDiffusionFilterクラスを作成します。その後、filterメソッドに以下のコードを入力します。
    public int[] filter(int[] imageArray, int width, int height) {
        int[] oimgArray = new int[imageArray.length];
        int xn,yn,xpoint,ypoint;
        for(int y=0;y < height;y++){
            for(int x=0;x < width;x++){
                xn=(int)(Math.random()*4.99) - 2;//①
                yn=(int)(Math.random()*4.99) - 2;//②
                xpoint=x+xn;//③
                if(xpoint < 0 || xpoint >= width){//④
                    xpoint=x;
                }
                ypoint=y+yn;//③
                if(ypoint < 0 || ypoint >= height){//④
                    ypoint=y;
                }
                oimgArray[x+y*width]=imageArray[xpoint+ypoint*width];//⑤
            }
        }
        return oimgArray;
    }

 ①と②では、x座標用およびy座標用の乱数を発生させています。乱数(0~1)に4.99をかけてからint型にキャストすることで0~4の整数乱数を生成し、-2することで-2~2の整数乱数に変換しています。
 得られた整数乱数を③でx座標およびy座標に加えます。そのうえで、④では計算して得られた座標が画像の枠内を超えていないかを調べます。超えた場合には元のx座標、y座標に戻します。
 ⑤では③で得られた座標の色を、当該座標(x+y*width)の色としています。これにより、周辺のランダムな位置の色を当該座標の色とすることができます。

 最後に、 Tutorial1Activityクラスのint imageArray[]=ba2ia(ba);の下に以下の文を記入します。
imageArray=new DiffusionFilter().filter(imageArray, imagewidth, imageheight);

以下に実機での実行結果を示します。



0 件のコメント:

コメントを投稿