2

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

如果三张幻灯片(R,G和B)的值相同,我想我可以检查它是否是灰度,但我不可能。有办法验证吗?

非常感谢!

4

3 回答 3

2

首先让我们说有几种方法可以实现这一点。

我会说使用(类似)获取图像的大小

int myHeight = myImage.getHeight();
int myWidth  = myImage.getWidth();

我想说在这种情况下,您可能还想验证位图的配置,因为它可能是 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 将其转换为灰度图像以及原始 8 位基于 ALPHA_8 的图像中提供的 alpha 值的每个 R、G 和 B 分量。

如果图像是 RGB_565 格式,这有点棘手,因为您必须自己使用 shift 和 MASKING 运算符将 R、G 和 B 值拆分为它们自己的字节。完成此操作后,它本质上就像处理 ARGB_8888 图像(在下面讨论)。

对于 ARGB_8888 图像:alpha 通道应始终为 0xFF。

正如您在问题中所述,如果 R == G == B SO(示例代码可能如下所示),则将像素视为灰度

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;

}

可以进行一些优化,但我正在尝试为您记录主要算法。

希望这可以帮助你 :-)

于 2012-06-09T06:24:14.220 回答
1

注意 && (boolean AND) 的使用,当掩码应该是一个 & (bitwise AND) 时,如下所示:

int alpha = (pixel & 0xFF000000) >> 24;
int red   = (pixel & 0x00FF0000) >> 16;
int green = (pixel & 0x0000FF00) >> 8;
int blue  = (pixel & 0x000000FF);
于 2014-08-27T15:39:01.253 回答
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));
    }
}

你可以看到我已经评论了移位和遮罩部分。

于 2016-12-20T09:01:19.023 回答