2012-06-09 38 views
1

我有疑问。当我从Android中的Bitmap获得像素时。我已经加载了一张图片,这张图片是灰度图片。如果我做一个getPixels(),并检查值,我可以看到值与R!= G!= B验证Android位图是GrayScale

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

非常感谢!

回答

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图像并将Alpha值设置为0xFF,并将每个R,G和B分量转换为原始图像中提供的alpha值基于8位ALPHA_8的图像。

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

对于ARGB_8888图像: alpha通道应该总是为0xFF。

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

} 

有可能进行优化,但我我正在努力为您记录主要算法。

希望这可以帮助你:-)

+0

这就是我所做的,但灰度图像中的像素具有不同的值,我认为,就像你一样,它们应该是相同的。这是我的问题。 – SamuSan

+0

嗯.........这是你如何验证,这是你的问题。你有没有真实的图像,你有没有在成像应用程序中打开它,并放大看看是否确实有颜色不是灰度? – trumpetlicks

+0

加载后,我将验证作为图像的预处理步骤,而不进行缩放或其他不同操作。如果这个图像是用Matlab打开的,我发现它只有一层图像,它是一个灰度图像(不是索引的彩色图像),像素级别从0到255. – SamuSan

1

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

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

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

你可以看到我已经评论过换挡和遮挡部分。