public void Only_GREEN()
{
for(int y=0;y<bi.getHeight();y++)
{
for(int x=0;x<bi.getWidth();x++)
{
int rgb = bi.getRGB(x, y);
Color c = new Color(rgb);
int r=c.getGreen();
rgb = (0xff000000) | (0 << 16) | (r << 8) | (0 << 0);
System.out.println("hi",rgb);
bi.setRGB(x, y, rgb);
}
}
}
这是用于绘制绿色图片的一些代码。我无法理解以下两行:
int r=c.getGrenn()
rgb = (0xff000000) | (0 << 16) | (r << 8) | (0 << 0);
他们做了什么?
答案 0 :(得分:2)
我们假设a = 0xf000
和b = 0x000f
。
x | y
是bitwise or。 x
,y
或两者中的每个位都将在结果输出上设置为1
。 a | b
将成为0xf00f
。 b | b
将成为0x000f
。
x << num
是left shift。 x
中的每一位都会将num
位置移到左侧。左侧偏移的值将丢失,右侧的新值将为零。 b << 4
将成为0x00f0
,a << 4
将成为0x0000
。
所以,让我们分解您选择的代码。第一部分看起来只是将绿色值作为int(将有一个位表示)。第二部分更有趣:
// Start
rgb = (0xff000000) | (0 << 16) | (r << 8) | (0 << 0);
// 1. Do the parts in parentheses. Notice the green value was shifted over two bits
rgb = 0xff000000 | 0x00000000 | 0x0000rr00 | 0x00000000;
// 2. Apply the ORs
rgb = 0xff00rr00;
那发生了什么事?看起来这会将alpha(前两个字节)设置为全1,因此颜色是不透明的。然后它将红色(后两个字节)和蓝色(后两个字节)清零。它保持绿色,将其移位到RGB表示的绿色部分。这是有效的,因为RGB hex representation看起来像0xAARRGGBB
,其中A是alpha,R是红色,G是绿色,B是蓝色。
答案 1 :(得分:1)
getGreen()函数返回颜色的绿色部分的值。
颜色通常以十六进制代码表示,包含六个字符,前两个字符为红色,后两个字符为绿色,后两个字符为蓝色。
(r<<8)
将两个绿色字符移到两个字符上,因此它符合标准的十六进制颜色代码。两个十六进制字符长8位,这就是它向左移动8的原因,将绿色值放在正确的空间中。