微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

“&0xff”有什么作用?

如何解决“&0xff”有什么作用?

| 我试图理解下面的代码,其中
b
是给定的整数,
image
是图像。 我了解如果给定点i,j的RGB值大于b,则将该像素设置为白色,否则设置为黑色。因此会将图像转换为黑白图像。 但是我迷失了(&0xff)的实际功能,我猜它是一种二进制移位吗?
if ((image.getRGB(i,j) & 0xff) > b) {
    image.setRGB(i,j,0xffffff) ;
} else {
    image.setRGB(i,0x000000);
}
    

解决方法

这是所谓的面具。事实是,您获得的RGB值全部为一个整数,每个分量一个字节。类似于0xAARRGGBB(alpha,红色,绿色,蓝色)。通过按位执行-并使用0xFF,则仅保留最后一部分,即蓝色。对于其他渠道,您可以使用:
int alpha = (rgb >>> 24) & 0xFF;
int red   = (rgb >>> 16) & 0xFF;
int green = (rgb >>>  8) & 0xFF;
int blue  = (rgb >>>  0) & 0xFF;
在alpha情况下,您可以跳过
& 0xFF
,因为它什么也没做。在蓝色的情况下也要移0。     ,的
& 0xFF
得到一种颜色成分(红色或蓝色,我忘了哪个)。 如果未执行颜色遮罩,请考虑RGB(0,127,0),以及阈值63。getRGB(...)调用将返回
(0 * 256 * 256) + (127 * 256) + 0 = 32512
这显然超过了阈值63。但是目的是忽略其他两个颜色通道。位掩码仅获得最低的8位,且为零。 的
> b
正在检查颜色是否比特定阈值“ b”高。 如果超过阈值,则使用
image.setRGB(i,j,0xffffff)
...否则为黑色,使用
image.setRGB(i,0x000000)
因此,这是基于单个颜色通道上简单的逐像素阈值的黑白转换。     ,颜色表示 RGB值是一个整数,因此在内存中用4个字节(或等效的32位)表示。 例:
00000001 00000010 00000011 00000100
每个字节代表颜色的一个组成部分: 第一个字节:对应于不透明度的Alpha值(在示例中为00000001) 第2个字节:红色值(示例中为00000010) 第3个字节:绿色值(示例中为00000011) 第4个字节:蓝色值(示例中为00000100) 0xff和0xffffff符号 0xff表示等于整数255的十六进制值FF。其二进制表示形式是:
00000000 00000000 00000000 11111111
类似地,0xffffff表示为:
00000000 11111111 11111111 11111111
它对应于白色(红色,绿色和蓝色等于255)。 &运算子 二进制运算符和\“&\”应用于两个整数i1和i2(i1&i2)。它返回一个整数,除i1和i2均等于1之外,所有位均等于0。 例如,如果我们在第一个示例和0xff上应用&,则会获得:
00000000 00000000 00000000 00000100
结果,(&0xff)只能保留最后一个字节的值(即颜色的蓝色分量的值)。
// If the blue component of image.getRGB(i,j) is greater than b
if ((image.getRGB(i,j) & 0xff) > b) {
    // Set the image to white
    image.setRGB(i,0xffffff) ;
} else {
    // Set the image to black
    image.setRGB(i,0x000000);
}
    ,可能是因为存在与ARGB之间的某种转换。这是一篇非常不错的博客文章,内容涉及为什么要对颜色进行按位运算。     ,
& 0xff
是按位与
(image.getRGB(i,j)&0xff)
获取
getRGB
返回的rgb编码的int的蓝色值,
> b
部分检查其是否大于某个阈值     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。