繁体   English   中英

“&0xff”有什么作用?

[英]What does “& 0xff” do?

我试图理解下面的代码,其中b是给定的整数, image是图像。

据我所知,如果给定点i,j的RGB值大于b,则将该像素设置为白色,否则设置为黑色。 所以会将图像转换为黑白图像。

但是我迷失了什么(&0xff)实际上,我猜它是一种二元转换?

if ((image.getRGB(i, j) & 0xff) > b) {
    image.setRGB(i, j, 0xffffff) ;
} else {
    image.setRGB(i, j, 0x000000);
}

这是一个所谓的面具。 问题是,您将RGB值全部放在一个整数中,每个组件都有一个字节。 类似于0xAARRGGBB(alpha,red,green,blue)。 通过按位执行并使用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,j,0x000000)

因此,它是基于单个颜色通道上的简单逐像素阈值转换为黑白。

颜色表示

RGB值是一个整数,因此它在内存中用4个字节(或等价的32位)表示。

例:

00000001 00000010 00000011 00000100

每个字节代表颜色的一个组成部分:

  • 第1个字节:alpha值(示例中为00000001),对应于不透明度
  • 第二个字节:红色值(示例中为00000010)
  • 第3个字节:绿色值(示例中为00000011)
  • 第4个字节:蓝色值(示例中为00000100)

0xff和0xffffff符号

0xff表示十六进制值FF,它等于整数255.其二进制表示形式为:

00000000 00000000 00000000 11111111

类似地,0xffffff表示为:

00000000 11111111 11111111 11111111

它对应于白色(红色,绿色和蓝色等于255)。

&运营商

二元运算符和“&”应用于两个整数i1和i2(i1和i2)。 它返回一个整数,其所有位等于0,除了i1和i2中等于1的整数。 例如,如果我们在我的第一个例子和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, j, 0xffffff) ;
} else {
    // Set the image to black
    image.setRGB(i, j, 0x000000);
}

这可能是因为有一些转换到ARGB或从ARGB转换。 这是一篇非常好的博客文章,讲述为什么要对颜色进行逐位操作。

& 0xff是按位AND

(image.getRGB(i,j)&0xff)获取getRGB返回的rgb编码int的蓝色值> b部分检查它是否大于某个阈值

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM