首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >验证Android位图是否为GrayScale

验证Android位图是否为GrayScale
EN

Stack Overflow用户
提问于 2012-06-09 08:07:39
回答 3查看 2.4K关注 0票数 2

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

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

非常感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-09 14:24:14

首先要说的是,有几种方法可以实现这一点。

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

代码语言:javascript
复制
int myHeight = myImage.getHeight();
int myWidth  = myImage.getWidth();

我想说,在这种情况下,您可能还想验证位图的配置,因为它可能是3种不同的格式之一

代码语言:javascript
复制
ALPHA_8, ARGB_8888, or RGB_565

您可以使用

代码语言:javascript
复制
myImage.getConfig()

例行公事我们稍后会回到应该如何使用它的问题。

现在您知道了镜像的大小,您应该运行一个双循环结构,如下所示:

代码语言:javascript
复制
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分量中的每个分量设置为原始8位基于ALPHA_8的图像中提供的Alpha值来转换为灰度图像。

如果图像是RGB_565格式的,这就有点麻烦了,因为您必须自己使用shift和掩码操作符将R、G和B值拆分为各自的字节。一旦你这样做了,它本质上就像是处理ARGB_8888图像(在下面讨论)。

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

正如你在你的问题中所说的,如果R == G == B,那么一个像素被认为是灰度的(示例代码可能如下所示)

代码语言:javascript
复制
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;

}

有一些优化是可以做的,但我正在尝试为您记录主要算法。

希望这能帮助你:-)

票数 2
EN

Stack Overflow用户

发布于 2014-08-27 23:39:01

注意,当掩码应该是单个&(按位AND)时,使用&& (布尔值AND),如下所示:

代码语言:javascript
复制
int alpha = (pixel & 0xFF000000) >> 24;
int red   = (pixel & 0x00FF0000) >> 16;
int green = (pixel & 0x0000FF00) >> 8;
int blue  = (pixel & 0x000000FF);
票数 1
EN

Stack Overflow用户

发布于 2016-12-20 17:01:19

如果你要做的就是检查R,G和B的值是否相同,然后用Colors.red()Colors.green()或者Colors.blue()来做。

以下是实际代码的一小部分。

代码语言:javascript
复制
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));
    }
}

你可以看到我已经注释了移位和掩蔽部分。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10957348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档