2017-04-02 70 views
0

我有一个使用Graphic2D显示图形的JPanel。这工作正常。我现在想要将图形保存到文件中。到目前为止,我能做到这一点的唯一方法是创建一个BufferedImage,并将所写的所有内容写入JPanels Graphic2D对象,然后写入属于BufferedImage的Graphic2D对象,然后从BufferedImage执行PrintAll。 所以我有类似下面的代码:有没有办法复制一个JPanel的Graphic2D实例来为一个BufferedImage创建一个Graphic2D?

g.setFont(g.getFont().deriveFont(fontSize)); 
    g.drawString(text, xPos, yPos); 
    g.setFont(saveFont); 
    bG.setFont(g.getFont().deriveFont(fontSize)); 
    bG.drawString(text, xPos, yPos); 
    bG.setFont(saveFont); 

其中g是JPanel的 的Graphic2D对象和BG是的BufferedImage的

的Graphic2D对象当然这不可能是做的最好的办法这个。有没有使用属于JPanel的Graphic2D对象为BufferedImage生成Graphic2D对象的方法?

+0

太好了!这应该不是一个评论的答案。 –

回答

0

我会提取一种方法,例如paintGraph(Graphics2D g)绘制图。然后你从两个地方调用它。一旦从您的JPanelpaintComponent(..)方法,并在您的“saveToFile”方法一次,使用您的BufferedImageGraphics2D实例。

如果您的图形绘制代码可调整大小,您可能需要一个Dimension作为您的方法的第二个参数,它是面板的大小或图像的大小。

在代码:

void paintGraph(Graphics2D g, Dimension size) { 
    g.setFont(g.getFont().deriveFont(fontSize)); 
    g.drawString(text, xPos, yPos); 
    g.setFont(saveFont); 
    // ...etc 
} 

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    paintGraph((Graphics2D) g, getSize()); 
} 

void saveToFile(File f) { 
    BufferedImage image = new BufferedImage(512, 512, BufferedImage.TYPE_INT_ARGB); 

    Graphics2D g = image.createGaphics(); 
    paintGraph(g, new Dimension(image.getWidth(), image.getHeight()); 
    g.dispose(); 

    ImageIO.write(image, "PNG", f); 
} 
相关问题