我有个疑问。当我从安卓的Bitmap中获取像素时。我已经在里面加载了一个图像,这个图像是一个灰度图像。如果我创建一个getPixels()并检查这些值,我可以看到R != G != B的值。
我想我可以检查三张幻灯片(R,G和B)的值是否为灰度,但我不能。有没有办法验证它?
非常感谢!
发布于 2012-06-09 14:24:14
首先要说的是,有几种方法可以实现这一点。
我会说使用(类似于)获取图像的大小
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分量中的每个分量设置为原始8位基于ALPHA_8的图像中提供的Alpha值来转换为灰度图像。
如果图像是RGB_565格式的,这就有点麻烦了,因为您必须自己使用shift和掩码操作符将R、G和B值拆分为各自的字节。一旦你这样做了,它本质上就像是处理ARGB_8888图像(在下面讨论)。
对于ARGB_8888图像: alpha通道应始终为0xFF。
正如你在你的问题中所说的,如果R == G == 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;
}有一些优化是可以做的,但我正在尝试为您记录主要算法。
希望这能帮助你:-)
发布于 2014-08-27 23:39:01
注意,当掩码应该是单个&(按位AND)时,使用&& (布尔值AND),如下所示:
int alpha = (pixel & 0xFF000000) >> 24;
int red = (pixel & 0x00FF0000) >> 16;
int green = (pixel & 0x0000FF00) >> 8;
int blue = (pixel & 0x000000FF);发布于 2016-12-20 17:01:19
如果你要做的就是检查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));
}
}你可以看到我已经注释了移位和掩蔽部分。
https://stackoverflow.com/questions/10957348
复制相似问题