【问题标题】:BufferedImage Color Channel MaskBufferedImage 颜色通道蒙版
【发布时间】:2013-04-15 08:04:17
【问题描述】:

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

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

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

我将不胜感激。

【问题讨论】:

  • 您在哪个类看到这些 javadocs?
  • “我想用白色代替蓝色”白色是蓝红和绿色的组合,你可以用白色代替蓝色
  • @ShreyosAdikari 我从这里得到它:JavaDoc 和这里 StackOverflow
  • @AlekseiBulgak 我已经能够把它变成浅蓝色,但不幸的是不是白色
  • @freeze2ice 看看我的回答

标签: java image colors bufferedimage mask


【解决方案1】:

颜色是这样存储的,十六进制:

RRGGBBAA

红、绿、蓝、阿尔法。现在让我们看一下其中的一行:

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

image.getRGB(x, y) 将返回一个 RRGGBBAA 值,并且这一行是 bitmasking 它与 0xff0000。这是一个视觉效果:

RRGGBBAA
&
00FF0000
=
00GG0000

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

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

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

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

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

【讨论】:

  • 你能给我举个例子吗,因为我得到的只是亮黄色,而不是白色!
【解决方案2】:

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

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

【讨论】:

  • 也许我应该在问题中包含想象我在图像中有其他颜色不同的对象(例如黑色),使用这种方法会将所有东西都变成白色。
猜你喜欢
  • 2019-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多