2017-09-10 3 views
2

비트 맵 이미지로 메모리에로드 된 비트 맵 이미지가 있습니다. 이 ImageView로로드 할 Canvas 등등을 사용하여 작업을 수행 할 수 있습니다.하지만 난 3 채널 그레이 스케일 비트 맵이 필요 해요 알고리즘을 사용하고 있습니다. 아래 이미지는 How to Geek의 Eric Z Goodnight로 작성된 기사에서 가져온 것입니다. 링크는 아래에 있습니다.안드로이드에서 비트 맵의 ​​빨강, 녹색 및 파랑 채널을 추출하는 방법

enter image description here 는 각 색 영역은 밝은 각각의 채널에 대응하는 그레이 스케일 이미지에서 볼 수 있듯이

https://www.howtogeek.com/howto/42393/rgb-cmyk-alpha-what-are-image-channels-and-what-do-they-mean/

. 어떻게 안드로이드의 비트 맵 이미지에서 각 채널에 해당하는 그레이 스케일 이미지를 추출 할 수 있습니까? 이 3 개의 채널 그레이 스케일을 각각 포함하는 3 비트 맵 객체가 필요합니다. ColorMatrix의 채도를 0으로 설정하여 그레이 스케일을 만드는 방법을 보았습니다. 그러나 하나의 그레이 스케일로 반환합니다. 그레이 스케일 이미지를 얻는 방법은 없습니다 3 개의 채널에?

+0

자세히 설명해 주시겠습니까? ColorMatrices에 대한 많은 경험이 없습니다. 어떤 도움이라도 정말로 감사 할 것입니다. –

답변

1

비트 맵 형식의 픽셀은 해당 픽셀의 알파, 빨강, 녹색 및 파랑 채널을 나타내는 4 바이트 정수로 표시됩니다. 특정 채널을 추출하려면 적절한 16 진수 값을 사용하여 모든 픽셀에 대해 비트 OR을 수행하면됩니다.

예를 들어, 0xFFFF0000은 최대 알파 (FF), 최대 빨간색 (FF), 제로 녹색 및 0 파란색을 나타냅니다. 따라서 모든 픽셀에 대한 비트 OR은 녹색 및 파란색 채널이 무시되도록합니다. 원인은 영 (00)입니다.

어쨌든, 코드가 red channel을 추출하기위한 다음과 같습니다 결과적으로

for (int x = 0; x < bitmap.getWidth(); x++) 
{ 
    for (int y = 0; y < bitmap.getHeight(); y++) 
    { 
     bitmap.setPixel(x, y, bitmap.getPixel(x, y) & 0xFFFF0000); 
    } 
} 

을의 green channel 방법 :

for (int x = 0; x < bitmap.getWidth(); x++) 
{ 
    for (int y = 0; y < bitmap.getHeight(); y++) 
    { 
     bitmap.setPixel(x, y, bitmap.getPixel(x, y) & 0xFF00FF00); 
    } 
} 

blue channel :

for (int x = 0; x < bitmap.getWidth(); x++) 
{ 
    for (int y = 0; y < bitmap.getHeight(); y++) 
    { 
     bitmap.setPixel(x, y, bitmap.getPixel(x, y) & 0xFF0000FF); 
    } 
} 

마지막으로 이미지를 회색조로 표시하려면 이미지 뷰 위젯에 ColorMatrix를 사용할 수 있습니다.

ColorMatrix matrix = new ColorMatrix(); 
    matrix.setSaturation(0); 

    ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix); 
    imageView.setColorFilter(filter); 
+0

자세한 답변 해 주셔서 감사합니다. 나는 이것을 시도 할 것이고 나의 결과도 올릴 것이다. 이 게시물이 다른 많은 개발자들에게 도움이되기를 바랍니다. –

관련 문제