如何在Android中提取位图的红色,绿色和蓝色通道

时间:2017-09-10 09:52:05

标签: java android image-processing bitmap android-image

我有一个位图图像作为Bitmap对象加载到内存中。我可以将它加载到ImageView中,使用Canvas进行操作等等。但是对于我使用的算法,我需要3通道灰度位图。 下面的图片来自Eric Z Goodnight关于How to Geek的文章。链接如下。

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

enter image description here 正如您在与每个通道对应的灰度图像中所看到的,各个颜色区域最亮。如何从android中的位图图像中提取对应每个通道的灰度图像?我需要分别包含这3个通道灰度的3个位图对象。我遇到了一种通过将ColorMatrix的饱和度设置为0来创建灰度的方法。但是它返回到一个灰度级。是否有任何方法可以获得相应的灰度图像到3个频道?

1 个答案:

答案 0 :(得分:1)

位图格式的像素由4字节整数表示,其描述该像素的Alpha,红色,绿色和蓝色通道。要提取特定通道,只需对每个像素执行一个按位OR,并使用相应的十六进制值。

例如,0xFFFF0000表示最大alpha(FF),最大红色(FF),零绿色和零蓝色。因此,每个像素的按位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用于imageview小部件:

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

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