Interesting/ANDROID | Posted by hyena0 2008. 12. 2. 01:23

[안드로이드] 엠보싱 바로잡기





[Android] 엠보싱효과 바로잡기

이전 포스팅에서 보여주었던 마스크 처리부분에서 엠보싱효과와 샤프닝은 잘못된 결과라는 것을 알게 되었다.
그 이유는 안드로이드에서 제공되는 색의 처리방법이 aRGB라는 방식인데 a는 투명도를 의미하고, R은 적색, G는 녹색, B는 파란색을 의미한다. 색의 값은 16진수로 0xAARRGGBB 가 되고 예로 100%불투명한 적색이라고 하면 0x00FF0000 이 된다. 마스크 방식으로 한 픽셀에 대해 계산하려면 RGB에 대해 각각 처리를 해야 한다. 하지만 기존의 코드에서는 aRGB 값 자체를 계산했기 때문에 거칠은 영상이 만들어졌다.

아래의 수정된 코드로 나온 결과값을 한번 살펴보자.

private int[] maskColors(Bitmap bitmapO) {
     int W,H,ST;
     int orgColor=0;
     int greenColor=0;
     //get Height and Width
     H=bitmapO.getHeight();
     W=bitmapO.getWidth();
     ST = W;
          
     int[] colors = new int[ST * H];
     int avrColor=0;
     //embossing
     //45도  {0,0,-1,0,0,0,1,0,0}
     //90도  {0,-1,0,0,0,0,0,1,0}
     //135도{-1,0,0,0,0,0,0,0,1}
     
      
     int[] masks = {0,0,-1,0,0,0,1,0,};
     //Mask height, width
     int Mh = 3; int Mw =3;
     int var =0;//MASK 계산될 색의 픽셀값
                
     //get bitmap color
        for (int y = 0; y < H; y++) {
            for (int x = 0; x < W; x++) {
             orgColor = bitmapO.getPixel(x, y);
             greenColor = 0x0000FF00 & orgColor; // 녹색에 해당하는 부분을 처리
             greenColor = greenColor>>8; // 마스크 처리를 위해 8비트를 시프트한다.
             colors[y * ST + x] = greenColor;            }
        }
      //calc. average value of colors
     for (int i=0;i<H*W;i++){
      avrColor += colors[i];
     }
     avrColor /= H*W;
     //mask the color
     //i는 계산될 높이 계산될 폭만큼의 반복범위임

     for (int i=0;i<(H-Mh)*(W-Mw);i++){
      
       //mask 계산
        var = colors[i]*masks[0]      + colors[i+1]*masks[1]      + colors[i+2]*masks[2]
             +colors[W+i]*masks[3]    + colors[W+i+1]*masks[4]    + colors[W+i+2]*masks[5]
             +colors[(W+1)+i]*masks[6]+ colors[(W+1)+i+1]*masks[7]+ colors[(W+1)+i+2]*masks[8];
        
        var +=avrColor; //평균값을 더한다.
        colors[i]=var;
        var =0;//var 초기화       
     }
     
     //aRGB 형태로 다시 저장
        for (int y = 0; y < H; y++) {
            for (int x = 0; x < W; x++) {
             greenColor = colors[y * ST + x];
             greenColor = greenColor<<8;
             greenColor = 0x0000FF00 & greenColor;             
             colors[y * ST + x] = greenColor;
            }
        }
      return colors;
    }

이렇게 처리한 결과는 아래와 같이 엠보싱효과를 보인다. 이전 포스팅 결과와 확연한 차이를 보인다.

//45도  {0,0,-1,0,0,0,1,0,0}

//90도  {0,-1,0,0,0,0,0,1,0}

//135도{-1,0,0,0,0,0,0,0,1}