Lun*_*nar 39 java bufferedimage
我试图理解下面的代码,其中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);
}
Run Code Online (Sandbox Code Playgroud)
xs0*_*xs0 45
这是一个所谓的面具.问题是,您将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;
Run Code Online (Sandbox Code Playgroud)
在alpha情况下,你可以跳过& 0xFF,因为它没有做任何事情; 同样在蓝色情况下移位0.
Dil*_*nga 12
该
& 0xFF
Run Code Online (Sandbox Code Playgroud)
得到一个颜色组件(红色或蓝色,我忘了哪个).
如果未执行颜色掩码,请考虑RGB(0,127,0)和阈值63. getRGB(...)调用将返回
(0 * 256 * 256) + (127 * 256) + 0 = 32512
Run Code Online (Sandbox Code Playgroud)
这显然超过了阈值63.但目的是忽略其他两个颜色通道.位掩码仅获得最低8位,为零.
该
> b
Run Code Online (Sandbox Code Playgroud)
检查颜色是否比特定阈值"b"更亮.
如果超过阈值,则使用的像素为白色
image.setRGB(i,j,0xffffff)
Run Code Online (Sandbox Code Playgroud)
...否则它是黑色的,使用
image.setRGB(i,j,0x000000)
Run Code Online (Sandbox Code Playgroud)
因此,它是基于单个颜色通道上的简单逐像素阈值转换为黑白.
颜色表示
RGB值是一个整数,因此它在内存中用4个字节(或等价的32位)表示.
例:
00000001 00000010 00000011 00000100
Run Code Online (Sandbox Code Playgroud)
每个字节代表颜色的一个组成部分:
0xff和0xffffff符号
0xff表示十六进制值FF,它等于整数255.其二进制表示形式为:
00000000 00000000 00000000 11111111
Run Code Online (Sandbox Code Playgroud)
类似地,0xffffff表示为:
00000000 11111111 11111111 11111111
Run Code Online (Sandbox Code Playgroud)
它对应于白色(红色,绿色和蓝色等于255).
&运营商
二元运算符和"&"应用于两个整数i1和i2(i1和i2).它返回一个整数,其所有位等于0,除了i1和i2中等于1的整数.例如,如果我们在我的第一个例子和0xff上应用&,我们获得:
00000000 00000000 00000000 00000100
Run Code Online (Sandbox Code Playgroud)
因此,(&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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
54482 次 |
| 最近记录: |