java 高手进来看看

来源:百度知道 编辑:UC知道 时间:2024/05/14 07:40:34
for(int j = 0; j <h; j++){
for(int i = 0; i<w; i++)
{
gray = (int)(((pixels[w*j+i]>>16)&0xff)*0.3);//取其低8位。。转化为2进制
gray += (int)(((pixels[w*j+i]>>8)&0xff)*0.59);
gray += (int)(((pixels[w*j+i])&0xff)*0.11);
//得到灰度值
pixels[w*j+i] = (255<<24)|(gray<<16)|(gray<<8)|gray;
}
}

这段代码就是把一彩色的区域化为黑白..我想请问下.gray += (int)(((pixels[w*j+i]>>8)&0xff)*0.59);是什么意思啊
pixels[w * j+ i]就是在[w, j]点的相速.j为图片的宽
我想问的是为什么得到的3个灰度值直接就加了..这样得到的是什么?

图像的色彩,是由RGB彩色来的,电脑中以16进制储存。比如,0xAAFF77就表示以AA深度的红色加FF深度的绿色加77深度的蓝色。
每一色有2位16进制数(如AA),转成2进制就是8位(8个bit,10101010).pixels[w*j+i]>>16是把0xAAFF77向右移16个bit,得到0x0000AA. 0x0000AA & 0xFF是逻辑AND处理,确保只有最后8位取值,即AA.这样就拿到了彩色的红色值,做一定处理(这里是*0.3),转化为灰度值。

另外,pixels[w * j+ i]就是在[i,j]点的像素.[i为像素的水平坐标,j为像素的垂直坐标,w为整个图片的宽度]

回答补充:没有直接加啊,乘了一个系数的。R*0.3+G*0.59+B*0.11。这是RGB转黑白的一般算法

看这里(页面最下面)的图片:
http://www.stepok.net/engrn/TurboPhoto/rgb2grayscale.htm
左起第二幅是没有乘系数直接加,最右边的是乘了系数的。

其他算法看这里:http://blog.vckbase.com/teacheryang/archive/2004/06/24/516.html