我有疑问。当我从Android中的Bitmap
获得像素时。我已经加载了一张图片,这张图片是灰度图片。如果我做一个getPixels()
,并检查值,我可以看到值与R!= G!= B验证Android位图是GrayScale
我想我可以检查是否灰度如果三个幻灯片(R,G和B)的值得到相同的价值,但我不可能。 有一种方法可以验证它吗?
非常感谢!
我有疑问。当我从Android中的Bitmap
获得像素时。我已经加载了一张图片,这张图片是灰度图片。如果我做一个getPixels()
,并检查值,我可以看到值与R!= G!= B验证Android位图是GrayScale
我想我可以检查是否灰度如果三个幻灯片(R,G和B)的值得到相同的价值,但我不可能。 有一种方法可以验证它吗?
非常感谢!
首先让我们说说有几种方法可以实现这一点。
我想说获得图像的使用尺寸(像)
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;
}
有可能进行优化,但我我正在努力为您记录主要算法。
希望这可以帮助你:-)
注意使用& &(布尔AND)屏蔽的情况应该是一个单一的&如下(按位与):
int alpha = (pixel & 0xFF000000) >> 24;
int red = (pixel & 0x00FF0000) >> 16;
int green = (pixel & 0x0000FF00) >> 8;
int blue = (pixel & 0x000000FF);
如果你必须要做的是检查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));
}
}
你可以看到我已经评论过换挡和遮挡部分。
这就是我所做的,但灰度图像中的像素具有不同的值,我认为,就像你一样,它们应该是相同的。这是我的问题。 – SamuSan
嗯.........这是你如何验证,这是你的问题。你有没有真实的图像,你有没有在成像应用程序中打开它,并放大看看是否确实有颜色不是灰度? – trumpetlicks
加载后,我将验证作为图像的预处理步骤,而不进行缩放或其他不同操作。如果这个图像是用Matlab打开的,我发现它只有一层图像,它是一个灰度图像(不是索引的彩色图像),像素级别从0到255. – SamuSan