Tutorial1Activityクラスと同じ場所にMosaicFilterクラスを作成します。その後、filterメソッドに以下のコードを入力します。
public int[] filter(int[] imageArray, int width, int height) { int size=8;//① int xnum=width/size;//② int xrest=width%size; int ynum=height/size; int yrest=height%size; int length = width*height; int rgb; int red,green,blue; int rgbarray[][]=new int[3][imageArray.length]; for(int i =0;i < length;i++){ rgb = imageArray[i]; red = (rgb >> 16) & 0xff; green = (rgb >> 8) & 0xff; blue = (rgb) & 0xff; rgbarray[0][i]=red;//③ rgbarray[1][i]=green; rgbarray[2][i]=blue; } int point=0; int rsum,gsum,bsum; int[] oimgArray = new int[imageArray.length]; for(int y=0;y < ynum;y++){ for(int x=0;x < xnum;x++){ point=x*size+y*size*width; rsum=0; gsum=0; bsum=0; for(int yn=0;yn < size;yn++){ for(int xn=0;xn < size;xn++){ rsum+=rgbarray[0][point+xn+yn*width];//④ gsum+=rgbarray[1][point+xn+yn*width]; bsum+=rgbarray[2][point+xn+yn*width]; } } rsum=rsum/(size*size); gsum=gsum/(size*size); bsum=bsum/(size*size); for(int yn=0;yn < size;yn++){ for(int xn=0;xn < size;xn++){ oimgArray[point+xn+yn*width]= 255*16777216+ rsum*65536 + gsum*256+bsum;//⑤ } } } if(xrest>0){ for(int ysize=0;ysize < size; ysize++){ for(int rest=0;rest < xrest;rest++){ point=xnum*size+(y*size+ysize)*width+rest; oimgArray[point]=imageArray[point];//⑥ } } } } if(yrest>0){ for(int rest=0;rest < yrest;rest++){ for(int x=0;x < width;x++){ point=x+(ynum*size+rest)*width; oimgArray[point]=imageArray[point];//⑦ } } } return oimgArray; }
①ではモザイクをかけるサイズを指定しています。
②では幅と高さを①のサイズで割り、画像の分割数を求めています。
③では一度赤緑青の色の値を格納しています。
④では①のサイズの領域について色の値の合計数をだし、その後平均値を出しています。
⑤では平均値を領域内のすべての画素に適用し、新しい色としています。
⑥と⑦では①のサイズが幅や高さを割り切れなかった時の処理を行っています。今回は元の色をそのまま用いるようにしています。
最後に、 Tutorial1Activityクラスのint imageArray[]=ba2ia(ba);の下に以下の文を記入します。
imageArray=new MosaicFilter().filter(imageArray, imagewidth, imageheight);
以下に実機での実行結果を示します。上が①のサイズが4のときで、下が8のときです。
0 件のコメント:
コメントを投稿