创建bufferedimage只会保存Panel背景,而不是保存在其上的东西

时间:2015-04-20 02:33:19

标签: java swing

我有一个名为drawPanel的JPanel对象。我在它上面画了各种各样的东西,比如矩形,当我尝试创建一个bufferedimage并将其保存为下面时,它只保存一个只有背景颜色的空白图像而不是绘制在框架上的矩形。

BufferedImage image = createImage(drawPanel);
File outputfile = new File("MyImage.jpg");
try {
    ImageIO.write(image, "jpg", outputfile);
} catch (IOException e) {
     e.printStackTrace();
}



public BufferedImage createImage(JPanel panel) {
    int w = panel.getWidth();
    int h = panel.getHeight();
    BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
    Graphics2D g = bi.createGraphics();
    panel.print(g);
    return bi;
}

请帮助我解决这个问题。

2 个答案:

答案 0 :(得分:3)

这个Graphics2D g2 = (Graphics2D) drawPanel.getGraphics();是你的问题。致电printprintAllpaint将使用getGraphics清除对组件绘制的任何内容。

简短的回答是,永远不要使用它。答案很长,创建一个自定义组件,从JPanel这样的方法扩展并覆盖它的paintComponent方法,并在其中调用所有自定义绘画,当它被调用时

有关详细信息,请参阅Painting in AWT and SwingPerforming Custom Painting

答案 1 :(得分:2)

Robot

的一点点hackery

只需将您的方法createImage替换为我的方法。 : - )

public BufferedImage createImage(JPanel panel) {
    //Get top-left coordinate of drawPanel w.r.t screen
    Point p = new Point(0, 0);
    SwingUtilities.convertPointToScreen(p, panel);

    //Get the region with wiht and heighht of panel and 
    // starting coordinates of p.x and p.y
    Rectangle region = panel.getBounds();
    region.x = p.x;
    region.y = p.y;

    //Get screen capture over the area of region
    BufferedImage bi = null;
    try {
        bi = new Robot().createScreenCapture( region );
    } catch (AWTException ex) {
        Logger.getLogger(MyPaintBrush.class.getName()).log(Level.SEVERE, null, ex);
    }

    return bi;
}

enter image description here

(Credit to this dude)