我不熟悉按位操作。这是一种图像处理算法。发生了什么事?
void binarize50(int pixels[]) {
for(int i = 0; i < pixels.length; i++) {
int gray = ((pixels[i] & 0xff) + ((pixels[i] & 0xff00) >> 8) + ((pixels[i] & 0xff0000) >> 16)) / 3;
pixels[i] = gray < 128 ? 0xff000000 : 0xffffffff;
}
}
我发现(像素[i]&amp; 0xff)只是以某种方式“标准化”并让像素/字节变为0..255之间的正值。
(pixels [i]&amp; 0xff00&gt;&gt; 8)做什么?
什么是0xff00?
如果灰色&lt; 128像素变为0xff000000或者0xffffffff?
答案 0 :(得分:5)
它的作用取决于颜色模型以及颜色在内存中的表示方式。
我的猜测是它将普通的ARGB图像转换为基于50%阈值的黑/白图像。 (使所有小于50%“亮度”的像素变为全黑,其他所有像素都变为白色。)
(pixels[i] & 0xff00 >> 8)
做了什么?
pixel[i]
你已经知道了: - )& ff00
屏蔽第二个字节中的位>> 8
向右移位位,八个位置(即使边缘最右边的字节落下)什么是
0xff00
?
0xff00是值为65280的十六进制文字(或二进制中的1111111100000000)
为什么如果灰色&lt; 128像素变为0xff000000或者0xffffffff?
这一行:
int gray = ((pixels[i] & 0xff) +
((pixels[i] & 0xff00) >> 8) +
((pixels[i] & 0xff0000) >> 16)) / 3;
将红色,绿色和蓝色组件添加为upp并将其除以3(找出平均值)。
这一行
pixels[i] = gray < 128 ? 0xff000000 : 0xffffffff;
据推测,如果灰度小于一半,则像素应该是完全黑色的,否则它应该是完全白色的。
答案 1 :(得分:5)
&amp;使用0xff
等操作应用位掩码。这是一个按位和操作。由于Java中的int是32位,因此您可以将0xff
视为00000000_00000000_00000000_11111111
,将0xff00
视为00000000_00000000_11111111_00000000
,依此类推。他们只是省略了前导零。
所以,如果你做pixels[i] & 0xff
,那么你得到一个int,其中最后8位与像素[i]相同,其余的则设置为零。
>>
运营商是正确的转变。它会在指定的位数上将位模式向右移位。如果b
包含00110011_11001100_00010110_01001100
而您执行了b >> 8
,那么您最终会得到00000000_00110011_11001100_00010110
。最后8位“掉线”,而左边的零点已经移入。我不记得如果前导位为1,此操作是否会向左移1,所以也许有人可以确认或否认。
知道了这一点,让我们来看看这一行:
int gray = ((pixels[i] & 0xff) + ((pixels[i] & 0xff00) >> 8) + ((pixels[i] & 0xff0000) >> 16)) / 3;
这里发生的是我们按如下方式创建一个int(不是精确的代码执行顺序,仅用于说明):
那么这实现了什么?那么,它基本上归结为像素[i]的前8位被忽略,并且随后的3位8位被解释为0到255之间的单个值,其中取平均值。
然后检查结果是否为128.如果它低于,像素[i]我设置为0xff000000,否则设置为0xffffffff。
这是在编码为int的颜色操作中遇到的典型位。这可能是argb方案,其中int的前8位是alpha(透明度),接下来的8位是红色,接下来的8位是绿色,后8位是蓝色。或其变体。 0xff000000将是完全不透明的黑色,而0xffffffff是完全不透明的白色。
答案 2 :(得分:2)
(pixels [i]&amp; 0xff)= 0到255之间的蓝色值
(pixels [i]&amp; 0xff00)&gt;&gt; 8 = 0到255之间的绿色值
(pixels [i]&amp; 0xff0000)&gt;&gt; 16)= 0到255之间的红色值
然后你取上面找到的3个值的平均值。
在此之后,取决于灰度,使其为白色或黑色,即小于50%的灰色为黑色,否则为白色。
答案 3 :(得分:1)
(pixels[i] & 0xff00) >> 8
从int获取第二个字节,表示绿色 - &
使除8-15之外的所有位和>>
将它们的8位移位到是的,所以如果数字是(以位为单位)0101000100001100:
0101000100001100 & 0xff = 0101000100001100 & 1111111100000000 = 0101000100000000.
0101000100000000 >> 8 = 01010001
((pixels[i] & 0xff0000) >> 16)
也一样。
不是你取它们的平均值(/3
)并得到颜色是接近白色还是黑色(gray < 128
)。根据这个,您可以将像素设为黑色或白色。
答案 4 :(得分:1)
0xFF00这是一个位掩码意味着二进制表示中的1111111100000000。
因此,当您将此掩码应用于数字时,您会留下更高的8位。
运营商&gt;&gt;意味着向右移动。例如11110000&gt;&gt; 2 = 00111100