【发布时间】: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