ImageIO仅写入背景颜色,但不写入图形

时间:2017-06-25 11:30:38

标签: java swing jpanel javax.imageio

我有以下语句将缓冲的jPanel图像写入.png文件。它确实写了背景颜色而不是图形。

BufferedImage image = new BufferedImage(jPanel.getWidth(), 
jPanel.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics g = image.getGraphics();
jPanel.paint(g);
ImageIO.write(image, "png", new File("testing.png"));

2 个答案:

答案 0 :(得分:1)

使用paint这种方式存在很多问题,除了调用双缓冲,这是一个不必要的开销,它也会在屏幕上没有实现组件时引起问题 - 比如不绘画事情甚至触发运行时异常。

作为一般经验法则,请不要拨打paint,而是使用printprintAll,例如......

BufferedImage image = new BufferedImage(jPanel.getWidth(), jPanel.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D g = image.createGraphics();
jPanel.print(g);
g.dispose();
ImageIO.write(image, "png", new File("testing.png"));

此外,请不要忘记,您应该在您创建的dispose上调用Graphics,以确保它释放它可能已创建的任何基础资源。

答案 1 :(得分:0)

以下最小的例子适合我。 最好拨打image.createGraphics()而不是getGraphics()。 覆盖super.paintComponent(g)时,请务必致电paintComponent

public static void main(String[] args)
{
    JPanel jPanel = new JPanel()
    {
        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);

            g.setColor(Color.RED);
            g.drawRect(10, 10, 100, 100);
        }
    };

    jPanel.setSize(120, 120);
    jPanel.setBackground(Color.BLACK);

    BufferedImage image =
        new BufferedImage(jPanel.getWidth(), jPanel.getHeight(), BufferedImage.TYPE_INT_ARGB);

    Graphics2D g = image.createGraphics();

    jPanel.print(g);

    try
    {
        ImageIO.write(image, "png", new File("testing.png"));
        g.dispose();
    }
    catch(IOException e)
    {
        e.printStackTrace();
    }
}