http://www.sm.rim.or.jp/~shishido/post.html
Tutorial1Activityクラスと同じ場所にPosterizationFilterクラスを作成します。その後、filterメソッドに以下のコードを入力します。
public int[] filter(int[] imageArray, int width, int height, int gradation) { int range=255/(gradation-1); int slash=255/gradation; int table[]=new int[256]; int num=0; for(int i =0;i < 256;i++){ num=i/slash; if(num==0){ table[i]=0; }else if(num >= gradation-1){ table[i]=255; }else{ table[i]=range*num; } } int length = width*height; int[] oimgArray = new int[imageArray.length]; int rgb; int alpha,red,green,blue; for(int i =0;i < length;i++){ rgb = imageArray[i]; alpha = (rgb >> 24) & 0xff; red = (rgb >> 16) & 0xff; green = (rgb >> 8) & 0xff; blue = (rgb) & 0xff; oimgArray[i]=alpha*16777216+ table[red]*65536+table[green]*256+table[blue]; } imageArray=null; return oimgArray; }
①は階調変換後の値を決めるための値の増加幅を計算しています。例えば、階調数が5ならば、63が増加幅になります。
②は階調変換の区間幅を指定します。階調数が5ならば51ごとの区間になります。
③は0~255の値のそれぞれについて、階調数ある区間のなかで、どの区間に相当するかを計算しています。階調数が5ならば、0~51は0番の区間、52~102は1番の区間になります。
④は0番の区間についてルックアップテーブルの値を0に設定しています。
⑤は階調数-1以上の区間についてルックアップテーブルの値を255に設定しています。
⑥ではそれら以外の区間について、ルックアップテーブルを区間番号×①の増加幅に設定しています。
⑦ではこれまでに得られたルックアップテーブルを用いて色の変換を行っています。
最後に、 Tutorial1Activityクラスのint imageArray[]=ba2ia(ba);の下に以下の文を記入します。
imageArray=new PosterizationFilter().filter(imageArray, imagewidth, imageheight,5);
メソッドの第4引数が階調数を示します。
以下に実機での実行結果を示します。階調数は5です。ポスターのように色がグラディエーションではなく段階になっていることがわかります。また、ヒストグラムも5本のバーで構成されていることがわかります。
0 件のコメント:
コメントを投稿