2017-02-16 3 views
1

Ich versuche, einige Punkte mit X- und Y-Koordinaten zu zeichnen und speichern Sie die Ausgabe in eine Bilddatei, aber ich konnte nicht. (Es ist nicht notwendig, sie auf JFrame zu sehen) Soweit ich durch die Suche gelernt habe, kann ich die Zeichnung erstellen und auf JFrame zeigen, aber ich konnte diese Ausgabe nicht in einer Datei speichern.Wie zeichne ich Punkte und speichere das Ausgabebild in Java?

public static void main(String[] args) { 
try { 
     final JFrame frm = new JFrame("Points"); 
     final Panel pnl = new Panel(); 
     pnl.setPreferredSize(new Dimension(1000, 1000)); 
     frm.setContentPane(pnl); 
     frm.pack(); 
     frm.setVisible(true); 
     frm.repaint(); 
     Image img; 
     img = frm.createImage(1000, 1000); 
     ImageIO.write((RenderedImage) img, "jpeg", new File("C:/.../p.jpeg")); 
     frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    } catch (final Exception e) { 
     e.printStackTrace(); 
    } 
} 


public static class Panel extends JPanel { 

    @Override 
    public void paintComponent(final Graphics g) { 
     g.setColor(Color.RED); 
     for (final Point p : CandidatePoints) { 
      g.fillRect((int) p.getX() * 10, (int) p.getY() * 10, 20, 20); 
     }} 

Außerdem habe ich die beliebte Lösung von BufferedImage mit ImageIO versucht, aber in diesem Fall konnte ich nicht ein Koordinatensystem erstellen, anstatt bekam ich ein schwarzes Rechteck in Bilddatei.

public static void main(String[] args) { 
BufferedImage bimage = new BufferedImage(200, 200, 
       BufferedImage.TYPE_BYTE_INDEXED); 

     Graphics2D g2d = bimage.createGraphics(); 

     g2d.setColor(Color.red); 
     for (final Point p : CandidatePoints) { 
      g2d.fillRect((int) p.getX() * 10, (int) p.getY() * 10, 20, 20); 
      ImageIO.write(bimage, "jpeg", new File("C:/.../p.jpeg")); 
      g2d.dispose(); 
     }} 

Vielen Dank im Voraus

+1

Für bessere Hilfe, früher, ein [MCVE] oder [kurze, unabhängige, korrekte Beispiel] (http://www.sscce.org/). –

+2

Sie sollten das Bild _inside_ nicht in die Schleife, sondern _nach der Schleife schreiben, d. – Thomas

+0

Außerdem funktioniert 'TYPE_BYTE_INDEXED' nicht gut mit JPEG. – haraldK

Antwort

3

Sie brauchen keine Swing-Komponenten, ein Bild zu erstellen und als Datei speichern.

Hier ist ein kleines Beispiel für Kreis zeichnen und sie in der Datei zu speichern:

public class ImageExample 
{ 
    public static void main (String[] args) throws IOException 
    { 
     final BufferedImage image = new BufferedImage (1000, 1000, BufferedImage.TYPE_INT_ARGB); 
     final Graphics2D graphics2D = image.createGraphics(); 
     graphics2D.setPaint (Color.WHITE); 
     graphics2D.fillRect (0,0,1000,1000); 
     graphics2D.setPaint (Color.BLACK); 
     graphics2D.drawOval (0, 0, 1000, 1000); 
     graphics2D.dispose(); 

     ImageIO.write (image, "png", new File ("C:\\image.png")); 
    } 
} 

Möglicherweise müssen Sie spielen, um mit Bildtyp, wenn Sie genau auf der Ausgabe JPEG-Bild benötigen.

Der Grund, warum Sie ein schwarzes Rechteck erhalten, ist die Tatsache, dass Sie keinen Hintergrund mit irgendetwas füllen und das JPEG-Format keine transparenten Bilder unterstützt - wenn Sie Ihr Bild transparent machen möchten, verwenden Sie stattdessen PNG. Oder Sie füllen einfach den Bildhintergrund mit einer beliebigen Farbe aus, die Sie dort haben möchten. Auch wie es in Kommentaren erwähnt wurde - funktionieren nicht alle Bildtypen gut mit verschiedenen Ausgabebildformaten.

Auch nur für den Fall - Koordinaten auf allen Bildern und Komponenten beginnen in der oberen linken Ecke ([0,0] Koordinate).

Und wenn Sie einen Teil Ihrer Desktop-Swing-Anwendung UI in Bilddatei speichern möchten, müssen Sie Methoden von Swing-Komponenten verwenden, um sie auf Grafiken zu malen, die aus dem Bild abgerufen werden.

+0

aufrufen Das ist, was ich brauchte. Vielen Dank, – Kadir

Verwandte Themen