【问题标题】:Can java load images with transparency?java可以加载透明的图像吗?
【发布时间】:2013-09-15 15:08:57
【问题描述】:

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

因此我将透明的“theimage”绘制到不透明的“backimage”上

【问题讨论】:

  • 能分享一下代码吗,你是用什么方法添加图片的?在某些库中,您可以添加图片并给出透明度。
  • 是的,它确实支持透明度。要获得更完整的答案,您需要显示一些代码(例如,您如何绘制)。
  • 对于example
  • @kiheru 添加了代码 sn-p
  • 啊,和前两天一样的代码。它实际上正常工作。请检查您正在使用的图像。我已经看到使用某些 java 版本加载带有索引颜色的 PNG 的破坏行为。这不一定是问题,但我会通过使用 RGBA 中的两个图像开始寻找,两者都具有一定的半透明性。

标签: java image swing jpanel transparency


【解决方案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;

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 图像并排打开,而不是一个在另一个上。 :(
    • 对不起,为我工作(FireFox + IE),也许是background-image: ...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    • 2011-12-24
    • 1970-01-01
    • 2020-10-17
    相关资源
    最近更新 更多