有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java可以加载透明的图像吗?

我有一个透明的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);
}
}

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


共 (2) 个答案

  1. # 1 楼答案

    从我的经验来看。read通过选择错误的透明度/图像类型加载没有透明度的图像。因此,我使用一个变通方法-ImageIcon将其加载为图像,可以使用预定义的图像类型BuffereImage将其绘制到空的BuffereImage中。输入_INT_ARGB。不要忘了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;
    
  2. # 2 楼答案

    是没有问题,不要使用调色板和索引颜色

    试一试,无论图像是否真的是透明的,颜色中都有一个alpha分量。 例如,使用test.html

    <html>
    <body>
    <div style="background: url(backimage.png)"><img src="theimage.png"></div>
    </body>
    </html>