1

我有一个透明的PNG图像。我使用该格式是因为只有 PNG 可以支持透明度和 alpha 蒙版。

我的目标是用这个图像绘制一个JPanel,让透明区域具有底层面板的颜色,并最终用图像做一些动画。

无论我遇到什么问题,当在 JPanel 上加载和绘制时,透明区域变成纯白色。

那么java不支持透明图片吗?

class imgpanel extends JPanel{
BufferedImage image,backg;
imgpanel(){
    try {
              image = ImageIO.read(new File("theimage.png"));
              backg = ImageIO.read(new File("backimage.png"));
           } catch (IOException ex) {
                System.out.println("No image found");
   }
    setPreferredSize(new Dimension(400,300));
}
 @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(backg,0,0,null);
        g.drawImage(image, 0, 0, null);
}
}

因此,我将透明的“图像”绘制到不透明的“背景图像”上

4

2 回答 2

2

是的没问题,不要使用调色板,索引颜色。

试试看,图像是否真的是透明的,颜色中是否有 alpha 分量。例如test.html

<html>
<body>
<div style="background: url(backimage.png)"><img src="theimage.png"></div>
</body>
</html>
于 2013-09-11T14:48:56.693 回答
1

根据我的经验,ImageIO.read 通过选择错误的透明度/图像类型来加载没有透明度的图像。因此,我使用了一种解决方法 - ImageIcon 将其作为图像加载,可以使用预定义的图像类型 BufferedImage.TYPE_INT_ARGB 将其绘制到空的 BufferedImage 中。并且不要忘记 ImageIcon 禁止垃圾收集器收集图像,如果图像没有被刷新。

    ImageIcon imageIcon = new ImageIcon(imageAbsolutePath);
    Image tmpImage = imageIcon.getImage();

    BufferedImage image = new BufferedImage(imageIcon.getIconWidth(), imageIcon.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
    image.getGraphics().drawImage(tmpImage, 0, 0, null);
    tmpImage.flush();

    return image;
于 2016-10-03T08:01:39.287 回答