BufferedImage彩色通道掩码

时间:2013-04-22 12:10:12

标签: java image colors bufferedimage mask

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

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

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

我将不胜感激。

2 个答案:

答案 0 :(得分:2)

颜色以十六进制格式存储:

RRGGBBAA

红色,绿色,蓝色,alpha。现在让我们来看看其中一行:

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

image.getRGB(x, y)将返回RRGGBBAA值,此行 bitmasking 0xff0000。这是一个视觉:

RRGGBBAA
&
00FF0000
=
00GG0000

因此,它会将RRGGBBAA值转换为GG0000

然后,右边有一个 bitshift 16 二进制位。 Java不能以十六进制移位,但我们现在正在以十六进制显示颜色。因此,我们必须将16个二进制移位转换为4个十六进制移位,因为十六进制是base-16。二进制是base-2,2^4是16,十六进制的基数。

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

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

您可以将类似的逻辑应用于其他行,以了解它们的工作原理。

答案 1 :(得分: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());