L'enregistrement d'un Java graphismes en 2d de l'image .fichier png
Je dessine une représentation graphique des informations de ma simulation est de générer. J'ai l'affichage de graphes, mais le problème je suis en cours d'exécution, c'est d'être en mesure de l'enregistrer en tant que .png. Lorsqu'il enregistre le png, le fichier est tout noir, il n'est donc pas sauver mon graphique, mais la création de certains vides fichier png. Le problème est que j'ai de la difficulté à déterminer la manière de voter, à une BufferedImage ou un RenderedImage toutes mes tentatives dans eclipse de générer des erreurs et quand j'arrive à compiler, il fonctionne comme la façon dont je l'ai décrit ci-dessus. Des idées ou des suggestions? J'ai été coincé sur ce pour un couple de semaines et soit il s'agit d'une correction évidente ou je ne suis pas capable de l'enregistrer au format png. Mais à partir de la recherche que j'ai menée, il est possible d'enregistrer un java 2d graphiques img au format png, je ne sais pas ce que je suis absent? Une nouvelle paire d'yeux serait grandement et très apprécié! Merci d'avance, je vous remercie de tout et tous les conseils ou commentaires au sujet de cette.
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);
}
OriginalL'auteur theoreticalyield | 2011-11-20
Vous devez vous connecter pour publier un commentaire.
OriginalL'auteur MMD
Voir cet exemple: Dessiner une Image et l'enregistrer en png.
OriginalL'auteur Eng.Fouad
L'Image De L'Écran permettra de créer un tampon de l'image du groupe et à écrire l'image dans un fichier.
OriginalL'auteur camickr
Il semble que vous n'avez jamais fait de peinture à l'BufferedImage dans votre saveGraph(..) de la routine.
Après la création de votre BufferedImage et récupérer l'objet Graphique de cette image, appelez la méthode paintComponent de votre classe principale en passant que le contexte graphique. Vous avez également la création de deux GraphDisplay objets, mais ne jamais utiliser l'un des deux.
À ce stade, votre BufferedImage devriez maintenant avoir le même dessin que votre groupe a et vous devriez être en mesure de sauvegarder le contenu.
C'est l'approche que j'ai d'abord été d'essayer de mettre en œuvre cependant, lorsque j'utilise TYPE_INT_RGB-je obtenir un tout en noir .png et quand j'utilise TYPE_INT_ARGB-je obtenir un gris fichier png avec rien rendu. Doit être quelque chose que je suis en manque... Merci encore!
OriginalL'auteur Jere