我怀疑了。当我从Android中的Bitmap
获取像素时。我在里面加载了一个图像,这个图像是一个灰度图像。如果我创建getPixels()
并检查值,我可以看到R!= G!= B的值。
我想如果三个幻灯片(R,G和B)的值得到相同的值,我可以检查它是否为灰度,但我无法做到。 有一种方法可以验证吗?
非常感谢!
答案 0 :(得分:1)
首先请说有几种方法可以实现这一目标。
我想说使用(类似的)
来获取图像的大小int myHeight = myImage.getHeight();
int myWidth = myImage.getWidth();
我想说在这种情况下你可能还需要验证Bitmap的配置,因为它可能是3种不同格式之一
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图像并将Alpha值设置为0xFF以及每个R,G和B组件,技术上可以将其转换为1。到原始8位基于ALPHA_8的图像中提供的alpha值。
如果图像是RGB_565格式化的,这有点棘手,因为您必须使用shift和MASKING运算符将R,G和B值拆分为它们自己的字节。完成此操作后,它基本上就像处理ARGB_8888图像一样(下面会谈到)。
对于ARGB_8888图片: alpha通道应该总是0xFF。
正如您在问题中所述,如果R == 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;
}
可以进行优化,但我正在尝试为您记录主要算法。
希望这可以帮助你: - )
答案 1 :(得分:1)
请注意使用&amp;&amp; (布尔AND)当掩蔽应该是单个&amp; (按位AND)如下:
int alpha = (pixel & 0xFF000000) >> 24;
int red = (pixel & 0x00FF0000) >> 16;
int green = (pixel & 0x0000FF00) >> 8;
int blue = (pixel & 0x000000FF);
答案 2 :(得分:1)
如果您要做的只是检查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));
}
}
你可以看到我评论了移动和遮蔽部分。