【问题标题】:Drawing a transparent BufferedImage over a non-transparent BufferedImage在不透明的 BufferedImage 上绘制透明的 BufferedImage
【发布时间】:2012-04-13 16:19:58
【问题描述】:

我在绘制 BufferedImage 时遇到了问题。我正在开发一个基于 2D 瓦片的地图编辑器,当我绘制瓦片时,它首先绘制较低层,然后是顶层。 像这样:

public void paintComponent(Graphics g)
{
    super.paintComponent(g);
    g.drawImage(tileLayer, 0, 0, null);
    g.drawImage(objectLayer, 0, 0, null);
}

请注意,此方法位于扩展 JLabel 的类中。它实际上是在重绘已设置的 ImageIcon。现在,要理解这个问题,您必须意识到在创建 objectLayer BufferedImage 之前,会检查每个像素的特定颜色。如果像素是该颜色,则该像素将设置为全白,alpha 值为 0(以便它透明)。示例:

    int transparentRed = transparentColor.getRed();
    int transparentGreen = transparentColor.getGreen();
    int transparentBlue = transparentColor.getBlue();


for (int x = 0; x < image.getWidth(); x++)
{
    for (int y = 0; y < image.getHeight(); y++)
    {
        int color = i.getRGB(x, y);

        int red = (color & 0x00FF0000) >> 16;
        int green = (color & 0x0000FF00) >> 8;
        int blue = color & 0x000000FF;

        // If the pixel matches the specified transparent color
        // Then set it to an absolute white with alpha at 0
        if (red == transparentRed && green == transparentGreen && blue == transparentBlue)
            i.setRGB(x, y, 0x00FFFFFF);
    }
}

    return i; 

重点是将顶层绘制在底层之上,而不影响之前放置的任何底层像素。顶层的白色像素不应该出现。

问题在于,这适用于某些图像,而其他图像则不起作用。在某些图像上,当我去绘制顶层时,无论如何它只是绘制白色(好像 alpha 值没有设置为 0),而在其他图像上它就像一个魅力,并且没有绘制白色像素在。

我一直只使用 .png 图像,所以我知道它与格式无关。我已经尝试了很多不同的东西,如果有人可以帮忙,我会被困住。

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖 SSCCE。我们还需要链接到 1. 一个有效的小(字节)图像。 2. 一个失败的小图。
  • g.drawImage(tileLayer, 0, 0, null);null 换成this(两者都使用)。
  • 试过了,但似乎没有帮助。
  • “试过了,但似乎没有帮助。” SSCCE 会,null/this 只是最佳实践,它没有任何作用通过检测“白色”。那你指的是哪个?假装我不是通灵者。
  • 对不起。试图替换 null/this。我将尝试发布 SSCCE 和两个示例图片

标签: java transparency alpha bufferedimage


【解决方案1】:

我相信默认情况下 BufferedImage 不支持 alpha 通道。在构造 BufferedImage 时,传入 BufferedImage.TYPE_INT_ARGB 解决了这个问题。

【讨论】:

  • 你能扩展一下吗?
猜你喜欢
  • 1970-01-01
  • 2016-12-04
  • 2014-12-21
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
  • 2015-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多