我在JavaDoc上找到了这段代码,但我似乎无法理解它。
output.setRGB(x, y, (image.getRGB(x, y) & 0xff00ff00)
| ((image.getRGB(x, y) & 0xff0000) >> 16)
| ((image.getRGB(x, y) & 0xff) << 16));
据我所知,这段代码将 BufferedImage 中的蓝色变成红色。 但如果我想用白色或其他颜色替换蓝色,反之亦然怎么办?
如果有任何帮助,我将不胜感激。
最佳答案
颜色的存储方式如下,以十六进制表示:
RRGGBBAA
红、绿、蓝、阿尔法。现在让我们看一下其中一行:
(image.getRGB(x, y) & 0xff0000) >> 16
image.getRGB(x, y)
将返回一个 RRGGBBAA
值,并且这一行使用 0xff0000<位掩码它
。这是一个视觉效果:
RRGGBBAA
&
00FF0000
=
00GG0000
因此,它将 RRGGBBAA
值转换为 GG0000
。
然后,向右位移 16 二进制位。 Java 无法以十六进制移动位,但我们现在正在以十六进制可视化颜色。因此,我们必须将 16 个二进制移位转换为 4 个十六进制移位,因为十六进制是以 16 为底的。二进制以 2 为基数,2^4
为 16,即十六进制的基数。
因此,必须右移 4 位。这会将 GG0000
转换为 GG
,因为这些位向右移动了 4 位。
因此,我们现在有了颜色中绿色量的值。
您可以将类似的逻辑应用于其他线路,看看它们是如何工作的。
关于java - BufferedImage 颜色 channel 蒙版,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16146794/