有没有办法复制JPanel的Graphic2D实例为BufferedImage制作Graphic2D?

时间:2017-04-02 09:08:08

标签: java file save bufferedimage

我有一个JPanel,它使用Graphic2D显示图形。这很好用。我现在希望能够将图表保存到文件中。到目前为止,我能让它工作的唯一方法是创建一个BufferedImage和我写入JPanels Graphic2D对象的所有内容,我写入属于BufferedImage的Graphic2D对象,然后从BufferedImage执行PrintAll。 所以我有如下代码:

    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对象?

1 个答案:

答案 0 :(得分:0)

我提取了一个方法,比如绘制图表的paintGraph(Graphics2D g)。然后从两个位置调用它。一旦使用JPanel paintComponent(..)方法,一次使用" saveToFile"方法,使用您的BufferedImage Graphics2D实例。

如果您的图表绘制代码可以调整大小,则可能需要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);
}