验证Android位图是否为GrayScale

时间:2012-06-09 00:07:39

标签: android image-processing bitmap grayscale

我怀疑了。当我从Android中的Bitmap获取像素时。我在里面加载了一个图像,这个图像是一个灰度图像。如果我创建getPixels()并检查值,我可以看到R!= G!= B的值。

我想如果三个幻灯片(R,G和B)的值得到相同的值,我可以检查它是否为灰度,但我无法做到。 有一种方法可以验证吗?

非常感谢!

3 个答案:

答案 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));
    }
}

你可以看到我评论了移动和遮蔽部分。