我在JavaDoc上找到了这个代码,但我似乎无法理解它。
output.setRGB(x, y, (image.getRGB(x, y) & 0xff00ff00)
| ((image.getRGB(x, y) & 0xff0000) >> 16)
| ((image.getRGB(x, y) & 0xff) << 16));
我只知道此代码在BufferedImage中将蓝色变为红色。 但是,如果我想用蓝色或其他颜色替换蓝色,反之亦然呢?
我将不胜感激。
答案 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());