验证Android的位图是灰阶(Verify Android Bitmap is GrayScale

2019-09-17 22:33发布

我有一个疑问。 当我从获得的像素Bitmap在Android中。 我有它里面装的形象,这个形象是一个灰度图像。 如果我做getPixels()并检查值我可以看到的R值!= G!= B.

我想,我可以检查它是否是灰度如果三张幻灯片(R,G和B)的价值得到了相同的价值,但我是不可能的。 有一种方法来验证呢?

很多的感谢!

Answer 1:

让我们首先说,有一对夫妇的实现这一点的方式。

我要说的使用得到了图像的大小(像)

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图像和设定的阿尔法值至0xFF被转换成一个并且每个R,G,和B分量的原始8位ALPHA_8基于图像内所提供的α值。

如果图像RGB_565格式化,这是因为你将不得不自己使用移位和屏蔽运营商拉开了R,G,B值转化为自己的字节有点棘手。 一旦你做到了这一点,它本质上是喜欢处理ARGB_8888图像(约下面谈到)。

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

当你在你的问题说的像素被认为是灰度如果R == ==摹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;

}

有可能进行优化,但我想记录的主要算法为您服务。

希望这可以帮助你 :-)



Answer 2:

注意,这里使用的&&(布尔AND)屏蔽的情况应该是,如下的单个&(按位AND):

int alpha = (pixel & 0xFF000000) >> 24;
int red   = (pixel & 0x00FF0000) >> 16;
int green = (pixel & 0x0000FF00) >> 8;
int blue  = (pixel & 0x000000FF);


Answer 3:

如果你所要做的就是检查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));
    }
}

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



文章来源: Verify Android Bitmap is GrayScale