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