我有以下语句将缓冲的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"));
答案 0 :(得分:1)
使用paint
这种方式存在很多问题,除了调用双缓冲,这是一个不必要的开销,它也会在屏幕上没有实现组件时引起问题 - 比如不绘画事情甚至触发运行时异常。
作为一般经验法则,请不要拨打paint
,而是使用print
或printAll
,例如......
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();
}
}