Speichern einer Java-2d-Grafik wie .png-Datei
Ich bin zeichnen einer grafischen Darstellung von Informationen meiner simulation ist die Generierung. Ich habe das Diagramm anzeigen, aber das problem habe ich in der Lage sein, um es zu speichern als .png. Beim speichern der png-Datei ist alles schwarz, es ist also nicht die Rettung meines Graphen, sondern die Schaffung einige leere png-Datei. Das problem ist, ich habe Schwierigkeiten, herauszufinden, wie die Besetzung auf ein BufferedImage oder ein RenderedImage alle meine versuche in eclipse werfen Fehler und wenn ich es zu kompilieren, funktioniert es so wie ich oben beschrieben habe. Irgendwelche Gedanken oder Anregungen? Habe ich fest auf dieser für ein paar Wochen und entweder es ist ein offensichtlicher fix oder ich bin nicht in der Lage, es zu speichern als png. Aber aus der Forschung, die ich durchgeführt haben, ist es möglich, speichern Sie eine java-2d-Grafik-img als png-Datei, ich weiß nicht, was ich bin fehlt? Ein frisches paar Augen wäre erheblich und immens geschätzt! Vielen Dank im Voraus, ich freue mich über jede und alle Ratschläge oder Kommentare über diese.
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 <Tree> t= p.getMap().getTrees();
ArrayList<Double> xHist = p.getXHist();
ArrayList<Double> yHist = p.getYHist();
ArrayList<Double> testxHist = new ArrayList();
ArrayList<Double> 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<Double> routeX= p.getRoute().getX();
ArrayList<Double> 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);
}
InformationsquelleAutor theoreticalyield | 2011-11-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
InformationsquelleAutor MMD
Diesem Beispiel sehen: Zeichnen Sie ein Bild und speichern als png.
InformationsquelleAutor Eng.Fouad
Bild erstellen ein buffered image von der Platte und schreibt das image in eine Datei.
InformationsquelleAutor camickr
Es scheint, dass Sie eigentlich nie Farbe auf dem BufferedImage in Ihrem saveGraph(..) routine.
Sie nach dem erstellen des BufferedImage und abrufen, die mit dem Graphics-Objekt für das Bild, rufen Sie die paintComponent Methode der main-Klasse übergeben, die Grafik-Kontext. Sie sind auch erstellen Sie zwei GraphDisplay Objekte, aber nie verwenden Sie entweder eine.
Zu diesem Zeitpunkt Ihren BufferedImage sollte jetzt die gleiche Zeichnung, die Ihre Kammer hatte, und Sie sollten in der Lage sein, den Inhalt speichern.
Dies ist der Ansatz, den ich anfangs versucht hatte, Sie zu implementieren, aber wenn ich TYPE_INT_RGB bekomme ich einen komplett schwarzen .png und wenn ich TYPE_INT_ARGB bekomme ich eine Grau-png-Datei mit nichts gerendert. Muss etwas sein, was ich bin fehlt... nochmals vielen Dank!
InformationsquelleAutor Jere