使用ImageIO.write Java实时保存jpg

时间:2013-10-19 21:58:38

标签: java file

有我的代码。我尝试分析数据并创建图表并保存到本地驱动程序。该计划现在正常运作。但我发现jpg文件只能在程序全部完成后保存到本地驱动器。但是,数据太多,需要创建太多图表。整个计划可能会持续数小时。我只是想知道我可以让它实时保存jpg吗?所以我可以查看刚刚创建的所有图表。或者,如果我需要在完成所有程序之前停止程序,我就不必放弃所有图形。

谢谢

protected void paintComponent(Graphics g) {
    System.out.println("go");
    super.paintComponent(g);
    BufferedImage jpg = new BufferedImage(1040, 400,
            BufferedImage.TYPE_INT_RGB);
    Graphics2D g2 = jpg.createGraphics();
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                        RenderingHints.VALUE_ANTIALIAS_ON);
    int w = getWidth();
    int h = getHeight();
    double total=0;
    // Draw ordinate.
    g2.draw(new Line2D.Double(SPACE, SPACE, SPACE, h-SPACE));
    // Draw abcissa.
    g2.draw(new Line2D.Double(SPACE, h/2, w-SPACE, h/2));
    double xInc = (double)(w - 2*SPACE)/(data.size()-1);
    double scale = (double)(h/2 - SPACE*3)/getMax();
    // Mark data points.
    g2.setPaint(Color.red);
    for(int i = 0; i < data.size(); i++) {
        double x = SPACE + i*xInc;
        double y;
        if(data.get(i)!=0){
            y= h/2 - SPACE - scale*data.get(i);
            total = total + data.get(i);
        }else{
            y = h/2;
        }

        g2.fill(new Ellipse2D.Double(x, y-1, 4, 4));

    }
    try {
        ImageIO.write(jpg, "JPEG", new File("111\\"+total/data.size() + ".jpg"));
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

1 个答案:

答案 0 :(得分:1)

每当需要重新绘制时,

paintComponent被称为事件处理。并且可能经常发生。绘画也应该快速完成。因此,请将图像保存在绘图组件之外。

可能检查文件是否存在,或编号文件。

也要调用Graphics.dispose(),以防止资源泄漏。

BufferedImage jpg = new BufferedImage(1040, 400,
        BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = jpg.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
paintComponent(g2);
g2.dispose();

您还选择了一个程序相关文件夹。下面我选择了用户的文件夹,然后 如果不存在,可能会创建一个目录111mkdirs)。

String userHome = System.getProperty("user.home");
File imgFile = new File(userHome + "/111/" + (total/data.size()) + ".jpg");
// Windows still allows `/` instead of `\` as path separator.
imgFile.getParentFile().mkdirs();
System.out.println("Writing to image: " + imgFile.getPath());
...
    ImageIO.write(jpg, "JPEG", imgFile);