1

我在绘制 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),而在其他图像上它就像一个魅力并且没有绘制白色像素在。

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

4

1 回答 1

1

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

于 2012-04-14T00:26:31.480 回答