【问题标题】:How to keep transparency intact when reading an image? (Java)读取图像时如何保持透明度不变? (爪哇)
【发布时间】:2013-05-31 00:26:03
【问题描述】:

我在保持图像透明时遇到问题。

假设我们有一个名为imageA.png 的图像,我们想要导入它。为了让其他方法可以访问它,我们将首先声明:

private BufferedImage imageA;

然后导入:

className(){
    try{
        imageA = ImageIO.read(className.class.getResourceAsStream("floor.png"));
    }catch(IOException ex){
        ex.printStackTrace();
    }
}

那么我们可以在paintComponent方法中使用它,如下:

public void paintComponent(Graphics g){
    g.drawImage(imageA, 0, 0, null);
    //using Graphics.drawImage(Image img, int dstx1, int dsty1, int dstx2, int dsty2,int srcx1, int srcy1, int srcx2, int srcy2, ImageObserver observer) in the real program, don't know if that matters?
}

现在假设在我的原始图片中,imageA.png 有一个透明区域,现在由于某种原因丢失了。至少,在我的输出中。在我使用这种方式绘制图像的程序中,我将它绘制在另一个图像之上,但是在原始图像中它是透明的地方看到白色。为什么会这样,我该如何解决?

【问题讨论】:

  • 不要在paintComponent内部调用repaint,先调用super.paintComponent()来绘制背景颜色。在构造函数中使用setBackground(Color.CYAN); 来检查透明度。
  • 也许贴一张截图,以及到 floor.png 的链接? ImageIO 将使 PNG 的透明区域保持透明,我猜你的组件有一个让你感到困惑的背景。尝试 setOpaque(false)。另外,如果您想知道是否重要,请尝试一下! :-)

标签: java image graphics awt javax.imageio


【解决方案1】:

这里发布的代码

  • super.paintComponent(g),清除以前的画,否则画累积

  • 不要在paintComponent 内部调用repaint();,因为从内部repaint(); 会导致无限循环,此方法以编程方式用于重新绘制,例如如果来自Swing Timer

  • ,最好的方法

你的问题

  • 如需获得更好的帮助,请尽快发布 SSCCE,简短、可运行、可编译,带有从代码生成或从互联网站点链接的 BuferredImage

【讨论】:

    【解决方案2】:

    我的猜测是您的组件中需要setOpaque(false)(覆盖paintComponent(Graphics g) 的那个)。

    ImageIO 使图像的透明部分保持透明。

    【讨论】:

      猜你喜欢
      • 2011-05-11
      • 2011-01-27
      • 2021-10-08
      • 2013-01-12
      • 2018-12-21
      • 1970-01-01
      • 2014-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多