Tutorial1Activityクラスと同じ場所にErrorDiffusionColorFilterクラスを作成します。その後、filterメソッドに以下のコードを入力します。
public int[] filter(int[] imageArray, int width, int height) { int length = width*height; int rgbarray[][]=new int[3][imageArray.length]; int[] oimgArray = new int[imageArray.length]; int rgb; int red,green,blue; int y_val; 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 error=0; for(int i=0;i < 3;i++){ for(int y=0;y < height; y++){ for(int x=0;x < width;x++){ point=x+y*width; if(rgbarray[i][point] > 127){//② error=rgbarray[i][point]-255; rgbarray[i][point]=255; }else{ error=rgbarray[i][point]; rgbarray[i][point]=0; } if((x+1) < width){ rgbarray[i][point+1]+=error*7/16;//③ } if((y+1) < height){ if((x-1) >= 0){ rgbarray[i][point-1+width]+=error*3/16; } rgbarray[i][point+width]+=error*5/16; if((x+1) < width){ rgbarray[i][point+1+width]+=error*1/16; } } } } } for(int i =0;i < length;i++){ oimgArray[i]=255*16777216+rgbarray[0][i]*65536+rgbarray[1][i]*256+rgbarray[2][i]; } return oimgArray; }
①ではまず赤緑青の値を配列に格納しています。
②では赤緑青それぞれの色の値を127と比較し、0や255との差をエラー値として格納しています。
③ではフロイド-スタインバーグ・ディザリングの伝播方法に基づいてエラー値を伝播させます。
最後に、 Tutorial1Activityクラスのint imageArray[]=ba2ia(ba);の下に以下の文を記入します。
imageArray=new ErrorDiffusionColorFilter().filter(imageArray, imagewidth, imageheight);
以下に実機での実行結果を示します。8色で作製したにもかかわらず、実際の色をかなり再現できていることがわかります。
0 件のコメント:
コメントを投稿