在非透明的BufferedImage上绘制透明的BufferedImage

时间:2012-04-13 16:19:58

标签: java transparency alpha bufferedimage

我在绘制BufferedImages方面遇到了问题。我正在使用基于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),而在其他图像上它就像魅力一样,并且不绘制白色像素in。

我一直只使用.png图片,所以我知道它与格式化无关。我尝试了很多不同的事情,如果有人可以提供帮助,我就会陷入困境。

1 个答案:

答案 0 :(得分:0)

我相信默认情况下BufferedImage不支持alpha通道。构造BufferedImage时,传入BufferedImage.TYPE_INT_ARGB修复了问题。