![](/img/trans.png)
[英]Bufferedimage bitmask operations - apply a color to an image using another image as a mask
[英]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.