0

我在 JavaDoc 上找到了这段代码,但我似乎无法理解它。

output.setRGB(x, y, (image.getRGB(x, y) & 0xff00ff00)
                    | ((image.getRGB(x, y) & 0xff0000) >> 16)
                    | ((image.getRGB(x, y) & 0xff) << 16));

我只知道这段代码在 BufferedImage 中将蓝色变为红色。但是如果我想用白色或其他颜色代替蓝色,反之亦然呢?

我将不胜感激任何帮助。

4

2 回答 2

2

颜色以十六进制存储如下:

RRGGBBAA

红色,绿色,蓝色,阿尔法。现在让我们看一下其中的一行:

(image.getRGB(x, y) & 0xff0000) >> 16

image.getRGB(x, y)将返回一个RRGGBBAA值,并且此使用0xff0000. 这是一个视觉效果:

RRGGBBAA
&
00FF0000
=
00GG0000

因此,它将RRGGBBAA值转换为GG0000

然后,向右移位16 个二进制位。Java 不能以十六进制移动位,但我们现在正在以十六进制可视化颜色。因此,我们必须将 16 个二进制移位转换为 4 个十六进制移位,因为十六进制是 base-16。二进制是以 2 为底的,并且2^4是 16,十六进制的底数。

因此,您必须右移 4 位。这将GG0000变成GG,因为这些位向右移动了 4 位。

因此,我们现在有了颜色中绿色量的值。

您可以将类似的逻辑应用于其他行,以查看它们是如何工作的。

于 2013-04-22T12:16:01.667 回答
1

当我使用颜色时,我使用不同的想法:

    BufferedImage image = //create Buffered image
    int rgb = image.getRGB(x,y);   //get Rgb color value
    Color color = new Color(rgb);  // create color with this value
    Color resultColor = new Color(color.getRed(), color.getBlue(), color.getGreen()); //create new color change blue and green colors values
    image.setRGB(x,y,resultColor.getRGB());   //set color

我认为这个想法更容易理解。

如果你想得到白色使用这个:

    BufferedImage image = new BufferedImage();
    Color color = new Color(255,255,255);
    image.setRGB(x,y,color.getRGB());
于 2013-04-22T12:28:07.957 回答