2013-05-05 88 views
2

我正试图保存一个我作为新文件绘制的bufferedImage。我打开文件,使用graphics2d在它上面绘制(然后在JFrame中显示图像以确保它的工作,它的工作),然后将它保存到一个新文件中。保存已用graphics2d绘制的缓冲图像,java

问题是: 保存的文件只是原始图像。它不包含我绘制的任何新图形。

这里是我的代码更简化的版本:

public driver() throws IOException { 
     try { 
      image = ImageIO.read(new File("src/mc_map.png")); 
     } catch (IOException e) { e.printStackTrace(); } 
     this.setPreferredSize(new Dimension(image.getWidth(), image.getHeight())); 
     image = process(image); 
    } 

在另一种方法后:

g.draw(new Line2D.Double(road.start.x, road.start.y, road.end.x, road.end.y)); 
... 
br.close(); 
     image.createGraphics(); 
     File map = new File("map.png"); 
     ImageIO.write(image, "png", map); 

相关方法:

private BufferedImage process(BufferedImage old) throws IOException { 
     int w = old.getWidth(); 
     int h = old.getHeight(); 
     BufferedImage img = new BufferedImage(
      w, h, BufferedImage.TYPE_INT_ARGB); 
     Graphics2D g2d = img.createGraphics(); 
     g2d.drawImage(old, 0, 0, null); 
     g2d.setPaint(Color.BLUE); 
     g2d.drawLine(407, 355, 371, 349); 
     readAndDraw(g2d); 
     g2d.dispose(); 
     return img; 
    } 

    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawImage(image, 0, 0, null); 
    } 

    private static void create() throws IOException { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(new driver()); 
     f.pack(); 
     f.setVisible(true); 
    } 
+0

从你提供的小片段中,我会猜测你根本没有在图片上绘制图片,但是要么使用单独的缓冲区,要么没有在上面绘制。 – MadProgrammer 2013-05-05 20:16:07

+0

我可以查看正确的图片JFrame,但它不会保存我画的线。 – Ted 2013-05-05 20:24:56

+0

在第二个示例中,请在保存图像之前尝试删除igecreateGraphics。为了更快速的回答,请尝试提供一个可运行的示例,以说明您的问题,以便更好地了解您的工作流程。 – MadProgrammer 2013-05-05 20:57:33

回答

2

我面临着一个非常类似的问题你最近在这里是我的解决方案:)。

框架只是指您正在绘制的JFrame,宽度和高度指的是您保存的图像大小。

try { 
     BufferedImage saving = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); 
     Graphics graphics = saving.createGraphics(); 
     frame.paint(graphics); 
     g.dispose(graphics); 
     File map = new File("map.png"); 
     ImageIO.write(saving, "png", map); 
    } catch(IOException exc) { 
     System.out.println("problem saving"); 
    } 

编辑:如果你的JFrame包含比你想保存我会建议增加一个JPanel到您的JFrame和借鉴到,而不是像其他任何东西。您将以与您现在正在执行的操作几乎完全相同的方式进行绘制,但在保存时您会将代码中的框架替换为JPanel的名称。

+0

这将绘制框架以及图像......不确定这是OP所需要的内容 – MadProgrammer 2013-05-05 20:58:14

+0

以前我曾用过此方法在JFrame内的JPanel上,而不在JFrame上。对我来说,如果不经过测试就可以得到相同的结果,我很快就会回来。 编辑:它捕获的JFrame的内容,没有一个任务栏,框架的地区充满了黑色,我将编辑我的答案相应 – Iain 2013-05-05 21:03:15

+0

谢谢,很好的解决方案。有一件事:我认为 g.dispose(图形); 应该是 graphics.dispose(); – 2017-05-03 17:29:21

2

然后在一个JFrame显示图像,以确保其工作

使用Screen Image得到任何组件的BufferedImage并将图像保存到文件中。