Java 在非透明BuffereImage上绘制透明BuffereImage

Java 在非透明BuffereImage上绘制透明BuffereImage,java,transparency,alpha,bufferedimage,Java,Transparency,Alpha,Bufferedimage,在绘制缓冲区图像时,我遇到了一个问题。我正在使用一个基于二维平铺的地图编辑器,当我绘制一个平铺时,它首先绘制底层,然后是顶层。 像这样: 请注意,此方法位于扩展JLabel的类中。它实际上是在重新绘制设置好的图像图标。现在,要理解这个问题,您必须意识到在创建objectLayer BuffereImage之前,每个像素都会检查特定的颜色。如果该像素是该颜色,则该像素将设置为全白色,alpha值为0(以便它是透明的)。例如: int transparentRed = transparent

在绘制缓冲区图像时,我遇到了一个问题。我正在使用一个基于二维平铺的地图编辑器,当我绘制一个平铺时,它首先绘制底层,然后是顶层。 像这样:

请注意,此方法位于扩展JLabel的类中。它实际上是在重新绘制设置好的图像图标。现在,要理解这个问题,您必须意识到在创建objectLayer BuffereImage之前,每个像素都会检查特定的颜色。如果该像素是该颜色,则该像素将设置为全白色,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; 
int transparentRed=transparentColor.getRed();
int transparentGreen=transparentColor.getGreen();
int transparentBlue=transparentColor.getBlue();
对于(int x=0;x>16;
绿色=(颜色&0x0000FF00)>>8;
int blue=color&0x000000FF;
//如果像素与指定的透明颜色匹配
//然后将其设置为绝对白色,alpha为0
如果(红色==透明绿色和绿色==透明绿色和蓝色==透明蓝色)
i、 setRGB(x,y,0x00FFFFFF);
}
}
返回i;
重点是在不影响先前放置的任何较低层像素的情况下,在较低层上绘制顶层。顶层的白色像素不应该出现

问题是,这对某些图像有效,而对其他图像无效。在某些图像上,当我去绘制顶层时,它只是以任何方式绘制白色(好像alpha值没有设置为0),而在其他图像上,它就像一个符咒,白色像素没有被绘制


我只使用了.png图像,所以我知道这与格式无关。我尝试了很多不同的方法,如果有人能帮上忙的话,我就束手无策。

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

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

要更快获得更好的帮助,请发布一个。我们还需要到1的链接。工作正常的小(字节)图像。2.失败的小映像。
g.drawImage(tileLayer,0,0,null)
空值
交换为
(两者中)。尝试过,但似乎没有帮助。“尝试过,但似乎没有帮助。”SSCCE将,
空值
/
仅是最佳实践,与检测“白色”无关。那你指的是哪一个?假装我不是通灵者,对不起。试图替换空值/此值。我将尝试发布一个SSCCE和两个示例图像。为了更快地获得更好的帮助,请发布一个。我们还需要到1的链接。工作正常的小(字节)图像。2.失败的小映像。
g.drawImage(tileLayer,0,0,null)
空值
交换为
(两者中)。尝试过,但似乎没有帮助。“尝试过,但似乎没有帮助。”SSCCE将,
空值
/
仅是最佳实践,与检测“白色”无关。那你指的是哪一个?假装我不是通灵者,对不起。试图替换空值/此值。我将尝试发布一个SSCCE和两个示例imagesCan,您可以在此基础上展开吗?您可以在此基础上展开吗?
    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;