Enregistrement d’une image graphique Java 2d en tant que fichier .png

Je dessine une représentation graphique des informations générées par ma simulation. J’ai le graphique qui s’affiche mais le problème que je rencontre est de pouvoir le sauvegarder au format .png. Lorsque le fichier png est enregistré, le fichier est entièrement noir. Par conséquent, il ne sauvegarde pas mon graphique mais crée un fichier png vierge. Le problème est que j’ai de la difficulté à comprendre comment transtyper en une image BufferedImage ou RenderedImage toutes mes tentatives d’erreurs de projection d’éclipse et lorsqu’elle est compilée, cela fonctionne comme décrit ci-dessus. Des pensées ou des suggestions? Cela fait deux semaines que je suis coincé là-dessus et soit il s’agit d’une solution évidente, soit je ne suis pas en mesure de l’enregistrer au format png. Mais à partir des recherches que j’ai menées, il est possible de sauvegarder un fichier jg 2d graphics img au format png. Je ne sais pas ce qui me manque? Une nouvelle paire d’yeux serait grandement appréciée! Merci d’avance, j’apprécie tous les conseils et commentaires à ce sujet.

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(); } } 

Voir cet exemple: Dessine une image et enregistre en png .


 import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.FontMesortingcs; 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(Ssortingng 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); Ssortingng message = "www.java2s.com!"; FontMesortingcs fontMesortingcs = ig2.getFontMesortingcs(); int ssortingngWidth = fontMesortingcs.ssortingngWidth(message); int ssortingngHeight = fontMesortingcs.getAscent(); ig2.setPaint(Color.black); ig2.drawSsortingng(message, (width - ssortingngWidth) / 2, height / 2 + ssortingngHeight / 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(); } } } 

Screen Image créera une image en mémoire tampon du panneau et l’écrira dans un fichier.

Il semble que vous ne peigniez jamais réellement à BufferedImage dans votre routine saveGraph (..).

Après avoir créé votre BufferedImage et récupéré l’object Graphics pour cette image, appelez la méthode paintComponent de votre classe principale en transmettant ce contexte graphique. Vous créez également deux objects GraphDisplay, mais n’utilisez jamais l’un ni l’autre.

  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); 

À ce stade, votre image BufferedImage devrait maintenant avoir le même dessin que votre panneau et vous devriez pouvoir enregistrer le contenu.