-2
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);

他们在做什么?

4

2 回答 2

2

让我们假设a = 0xf000b = 0x000f

x | y按位或x,或两者中的每一位y都将1在结果输出上设置为。a | b会变成0xf00f. b | b会变成0x000f.

x << num左移。中的每一位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 十六进制表示看起来像0xAARRGGBB,其中 A 是 alpha,R 是红色,G 是绿色,B 是蓝色。

于 2013-06-25T12:42:36.693 回答
1

getGreen() 函数返回颜色的绿色部分的值。

颜色通常以十六进制代码表示,包含六个字符,前两个字符为红色,接下来的两个字符为绿色,最后两个字符为蓝色。

(r<<8)将两个绿色字符移到两个字符上,因此它适合标准的十六进制颜色代码。两个十六进制字符的长度为 8 位,这就是为什么它左移 8 位,以将绿色值放置在正确的空间中。

于 2013-06-25T12:36:29.873 回答