Salvando uma imagem gráfica do Java 2d como arquivo .png

Eu estou desenhando uma representação gráfica da informação que minha simulação está gerando. Eu tenho o gráfico exibindo, mas o problema que estou correndo é para ser capaz de salvá-lo como um PNG. Quando ele salva o png, o arquivo é todo preto, por isso não está salvando meu gráfico, mas criando algum arquivo png em branco. O problema é que eu estou tendo dificuldade em descobrir como converter para um BufferedImage ou um RenderedImage todas as minhas tentativas de erros de lançamento do eclipse e quando eu obtê-lo para compilar, funciona como eu descrevi acima. Alguma idéia ou sugestão? Eu tenho sido preso por um par de semanas e ou é uma correção óbvia ou eu não sou capaz de salvá-lo como png. Mas a partir da pesquisa que realizei, é possível salvar um img de charts java 2d como um arquivo png, não sei o que estou perdendo? Um novo par de olhos seria imensamente apreciado! Agradeço antecipadamente, agradeço todo e qualquer conselho ou comentários sobre isso.

public class GraphDisplay extends JPanel implements RenderedImage { final int PAD = 20; Primate p; public GraphDisplay(){ } public GraphDisplay(Primate p){ this.p = p; } protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // now we can get x1,y1,x2,y2 double tlx= p.getMap().getX1(); double tly= p.getMap().getY1(); double brx= p.getMap().getX2(); double bry= p.getMap().getY2(); int w = getWidth(); int h= getHeight(); ArrayList  t= p.getMap().getTrees(); ArrayList xHist = p.getXHist(); ArrayList yHist = p.getYHist(); ArrayList testxHist = new ArrayList(); ArrayList testyHist = new ArrayList(); for(double i=34;i<1000;i+=5) { testxHist.add(i); } for(double i=34;i<1000;i+=5) { testyHist.add(i); } // Draw lines. double scale=.45; g2.setBackground(Color.WHITE); g2.setPaint(Color.green.darker()); for(int i = 0; i < xHist.size()-1; i++) { double x1 = PAD + (xHist.get(i)-tlx)*scale; double y1 = (tly-yHist.get(i))*scale-PAD; double x2 = PAD + (xHist.get(i+1)-tlx)*scale; double y2 = (tly-yHist.get(i+1))*scale-PAD; g2.draw(new Line2D.Double(x1, y1, x2, y2)); } // Mark path points if(p.getRoute()!=null) { ArrayList routeX= p.getRoute().getX(); ArrayList routeY= p.getRoute().getY(); g2.setPaint(Color.pink); for(int i = 0; i < routeX.size()-1; i++) { double x1 = PAD + (routeX.get(i)-tlx)*scale; double y1 = (tly-routeY.get(i))*scale-PAD; double x2 = PAD + (routeX.get(i+1)-tlx)*scale; double y2 = (tly-routeY.get(i+1))*scale-PAD; g2.draw(new Line2D.Double(x1, y1, x2, y2)); } } g2.setPaint(Color.red); for(int i = 0; i < xHist.size(); i++) { double x = PAD + (xHist.get(i)-tlx)*scale; double y = (tly-yHist.get(i))*scale-PAD; g2.fill(new Ellipse2D.Double(x-.75, y-.75, 1.5, 1.5)); } //testing purposes g2.setPaint(Color.BLACK); for(int i=0;i<t.size();i++) { double x= PAD+(t.get(i).getX()-tlx)*scale; double y= (tly-t.get(i).getY())*scale-PAD; g2.fill(new Ellipse2D.Double(x-1,y-1,2,2)); } } public class GraphListener implements ActionListener { public void actionPerformed(ActionEvent event) { saveGraph(p); } } public void saveGraph(Primate p) { ImageIcon saveIcon = new ImageIcon("save.png"); GraphDisplay graphImg = new GraphDisplay(p); Object graph = new GraphDisplay(p); BufferedImage buffGraph = new BufferedImage(500,500, BufferedImage.TYPE_INT_RGB); graph = buffGraph.createGraphics(); RenderedImage rendGraph = (RenderedImage) graphImg; String graphFileName = JOptionPane.showInputDialog("Please enter a name for the S1Mian graphical output file: "); File f; f = new File(graphFileName + ".png"); //every run is unique so do not allow the user to overwrite previously saved files... if(!f.exists()) { try{ ImageIO.write(buffGraph, "png", f); JOptionPane.showMessageDialog(null, graphFileName + ".png has been created and saved to your directory...", "File Saved", JOptionPane.INFORMATION_MESSAGE, saveIcon); } catch (IOException e) { e.printStackTrace(); } } else{ JOptionPane.showMessageDialog(null, graphFileName +".png already exists please use a different file name...", "File Exists", JOptionPane.INFORMATION_MESSAGE, saveIcon); } } public void createGraph(Primate p) { JFrame frame = new JFrame("S1Mian Graphical Output"); //frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //disabled now that graphical output is integrated into GUI as when clicked shut down entire program... JPanel savePanel = new JPanel(); ImageIcon saveIcon = new ImageIcon("saveIcon.png"); JButton save = new JButton("Save"); save.setToolTipText("Saves the S1Mian graphical output to a .png file"); save.setIcon(saveIcon); GraphListener gl = new GraphListener(); save.addActionListener(gl); GraphDisplay graph = new GraphDisplay(p); graph.setPreferredSize(new Dimension(950, 900)); JScrollPane graphScrollPane = new JScrollPane(); graphScrollPane.setViewportView(graph); graphScrollPane.setViewportBorder(BorderFactory.createLineBorder(Color.black)); frame.getContentPane().add(graphScrollPane, BorderLayout.CENTER); savePanel.add(save); frame.getContentPane().add(savePanel, BorderLayout.NORTH); frame.setSize(900,850); frame.setLocation(200,200); frame.setVisible(true); } 

 JPanel dPanel; ... public void save() { BufferedImage bImg = new BufferedImage(dPanel.getWidth(), dPanel.getHeight(), BufferedImage.TYPE_INT_RGB); Graphics2D cg = bImg.createGraphics(); dPanel.paintAll(cg); try { if (ImageIO.write(bImg, "png", new File("./output_image.png"))) { System.out.println("-- saved"); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } 

Veja este exemplo: Desenhe uma imagem e salve em png .


 import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.GradientPaint; import java.awt.Graphics2D; import java.awt.geom.Ellipse2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; public class WriteImageType { static public void main(String args[]) throws Exception { try { int width = 200, height = 200; // TYPE_INT_ARGB specifies the image format: 8-bit RGBA packed // into integer pixels BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); Graphics2D ig2 = bi.createGraphics(); Font font = new Font("TimesRoman", Font.BOLD, 20); ig2.setFont(font); String message = "www.java2s.com!"; FontMetrics fontMetrics = ig2.getFontMetrics(); int stringWidth = fontMetrics.stringWidth(message); int stringHeight = fontMetrics.getAscent(); ig2.setPaint(Color.black); ig2.drawString(message, (width - stringWidth) / 2, height / 2 + stringHeight / 4); ImageIO.write(bi, "PNG", new File("c:\\yourImageName.PNG")); ImageIO.write(bi, "JPEG", new File("c:\\yourImageName.JPG")); ImageIO.write(bi, "gif", new File("c:\\yourImageName.GIF")); ImageIO.write(bi, "BMP", new File("c:\\yourImageName.BMP")); } catch (IOException ie) { ie.printStackTrace(); } } } 

A imagem da canvas criará uma imagem em buffer do painel e gravará a imagem em um arquivo.

Parece que você nunca pintou para o BufferedImage em sua rotina saveGraph (..).

Depois de criar seu BufferedImage e recuperar o object Graphics para essa imagem, chame o método paintComponent de sua class principal passando esse contexto de elementos charts. Você também cria dois objects GraphDisplay, mas nunca usa nenhum deles.

  GraphDisplay graphImg = new GraphDisplay(p); //You don't need this one, you created one above named graphImg // Object graph = new GraphDisplay(p); BufferedImage buffGraph = new BufferedImage(500,500, BufferedImage.TYPE_INT_RGB); //get the graphics context for the BufferedImage Graphics2D graph = buffGraph.createGraphics(); //now tell your main class to draw the image onto the BufferedImage graphImg.paintComponent(graph); 

Neste ponto, sua BufferedImage deve agora ter o mesmo desenho que seu painel e você deve ser capaz de salvar o conteúdo.