繁体   English   中英

BufferedImage颜色通道蒙版

[英]BufferedImage Color Channel Mask

我已经在JavaDoc上找到了此代码,但似乎无法理解。

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

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

我将不胜感激任何帮助。

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

RRGGBBAA

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

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

image.getRGB(x, y)将返回RRGGBBAA值,并且该行使用0xff0000对其进行位掩码 这是一个视觉效果:

RRGGBBAA
&
00FF0000
=
00GG0000

因此,它将RRGGBBAA值转换为GG0000

然后,有位位移 16 二进制位的权利。 Java无法将位以十六进制移位,但是我们现在正在以十六进制形式可视化颜色。 因此,由于十六进制为基数16,因此必须将16个二进制移位转换为4个十六进制移位。 Binary是2的基数, 2^4是16的十六进制基数。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM