2012-06-09 4 views
1

되어 있는지 확인합니다. Android의 Bitmap에서 픽셀을 얻을 때. 내부에 이미지가로드되어 있는데이 이미지는 회색 음영 이미지입니다. getPixels()을 만들고 값을 확인하면 R! = G! = B로 표시됩니다.안드로이드 비트 맵 내가 의심을 가지고 그레이 스케일

3 개의 슬라이드 (R, G 및 B) 값에 회색 음영이 있는지 확인 할 수 있다고 생각합니다. 같은 가치지만, 나는 가능할 수 없었다. 확인 방법이 있습니까? 감사의

많이!

답변

1

보자 우선이 달성의 몇 가지 방법이 있다는 것을 말한다. 내가 사용하여 이미지의 크기를 얻을 말할 것

(같은)이 3 가지 형식 중 하나가 될 수 있기

int myHeight = myImage.getHeight(); 
int myWidth = myImage.getWidth(); 

난 당신이 또한 비트 맵 '설정을 확인 할 수 있습니다이 경우에 말할 것

ALPHA_8, ARGB_8888, or RGB_565 

당신은

myImage.getConfig() 

루틴을 사용하여 구성을 얻을. 나중에 어떻게 사용해야하는지 다시 살펴 보겠습니다. 이제 다음과 같이 이중 루프 구조를 실행해야합니다 이미지의 크기를 알고

:

돌아 가기 픽셀이 회색조 경우 테스트하는 방법에
boolean isGrayscaleImage = true; // assume it is grayscale until proven otherwise 

for(int i = 0; i < myWidth; i++){ 
    for(int j = 0; j < myHeight; j++){ 
     int currPixel = myImage.getPixel(i, j); 

     if(false == isGrayScalePixel(currPixel)){ 
      isGrayscaleImage = false; 
      break; 
     } 
    } 
} 

: 이미지가 ALPHA_8이 저장되어있는 경우 실제로 그레이 이미지 아니지만, 그것은 기술적으로 ARGB_8888 화상으로 화상을 회전하여 원래 내에 마련된 알파 값을 알파 내지 0xFF 값과 R, G의 각, 및 B 성분을 설정하여 하나로 변환 될 수있다 8 비트 ALPHA_8 기반 이미지.

이미지가 RGB_565로 포맷 된 경우 Shift 및 MASKING 연산자를 사용하여 R, G 및 B 값을 직접 자신의 바이트로 분리해야하기 때문에 다소 까다 롭습니다. 이 작업을 마치면 기본적으로 ARGB_8888 이미지 처리와 같습니다 (아래에서 설명). ARGB_8888 이미지에 대한

: 알파 채널은 항상 0xFF로해야한다.

당신이 당신의 질문에 명시된 바와 같이 R == SO G의 ==의 B (과 같을 샘플 코드는 다음) 경우 픽셀은 그레이 스케일로 간주됩니다

boolean isGrayScalePixel(int pixel){ 
    int alpha = (pixel && 0xFF000000) >> 24; 
    int red = (pixel && 0x00FF0000) >> 16; 
    int green = (pixel && 0x0000FF00) >> 8; 
    int blue = (pixel && 0x000000FF); 

    if(0 == alpha && red == green && green == blue) return true; 
    else return false; 

} 

가 만들어 질 수 최적화,하지만 난 주 알고리즘을 문서화하려고합니다.

희망이 당신을 도와줍니다 :-)

+0

그게 내가 한 일이지만 그레이 스케일 이미지의 픽셀은 다른 값을 가지며, 같은 생각을해야한다고 생각합니다. 그게 내 문제 야. – SamuSan

+0

음 ......... 이것은 귀하의 질문이 무엇인지를 확인하는 방법입니다. 실제 이미지가 있습니까? 이미징 응용 프로그램에서 열어 보았고 그레이 스케일이 아닌 색이 있는지 보려면 확대 했습니까 ??? – trumpetlicks

+0

확대/축소 또는 다른 다른 조작없이 이미지를로드 한 직후 이미지의 사전 처리 단계로 확인을 적용합니다. 이 이미지를 Matlab과 함께 열면 하나의 레이어 만있는 이미지로 발견되었으며 0에서 255 사이의 픽셀을 가진 회색 음영 이미지 (색인 된 색상 이미지 아님)입니다. – SamuSan

1

주 & &의 사용 (부울 AND) 아래 하나의 & (비트 AND)해야 마스킹 때 : 모든 당신을하면

int alpha = (pixel & 0xFF000000) >> 24; 
int red = (pixel & 0x00FF0000) >> 16; 
int green = (pixel & 0x0000FF00) >> 8; 
int blue = (pixel & 0x000000FF); 
0

을 해야 할 것은 R, G 및 B 값은 단지 그것이 Colors.red(), 또는 Colors.green()Colors.blue()를 사용합니까 후 동일 여부를 확인한다.

실제 코드의 일부입니다.

for(int x=0;x< bmp.getWidth();x++) { 
    for(int y=0;y< bmp.getHeight();y++) {  

     int pixel=bmp.getPixel(x,y); 
     int alpha=Color.alpha(pixel);    
     int gray_color=Color.red(pixel);   
     int gray_color1=Color.green(pixel); 

     //int gray_color=pixel&0x000000ff; 
     //int gray_color1=(pixel&0x0000ff00)>>8; 
     //int gray_color2=(pixel&0x00ff0000)>>16; 
     //int gray_color3=Math.abs((pixel&0xff000000))>>24; 

     int pixels= (int)Math.pow(gray_color,gamma); 
     k.add(""+alpha+" "+gray_color+" "+gray_color1); 
     bmp.setPixel(x,y,Color.argb(alpha,pixels,pixels,pixels)); 
    } 
} 

나는 시프 팅 및 마스킹 부분에 주석을 달았습니다.

관련 문제