我有一个疑问。 当我从获得的像素Bitmap
在Android中。 我有它里面装的形象,这个形象是一个灰度图像。 如果我做getPixels()
并检查值我可以看到的R值!= G!= B.
我想,我可以检查它是否是灰度如果三张幻灯片(R,G和B)的价值得到了相同的价值,但我是不可能的。 有一种方法来验证呢?
很多的感谢!
我有一个疑问。 当我从获得的像素Bitmap
在Android中。 我有它里面装的形象,这个形象是一个灰度图像。 如果我做getPixels()
并检查值我可以看到的R值!= G!= B.
我想,我可以检查它是否是灰度如果三张幻灯片(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图像和设定的阿尔法值至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;
}
有可能进行优化,但我想记录的主要算法为您服务。
希望这可以帮助你 :-)
注意,这里使用的&&(布尔AND)屏蔽的情况应该是,如下的单个&(按位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));
}
}
你可以看到我已经评论了移位和屏蔽部分。