2013-05-05 95 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並將圖像保存到文件中。