2017-02-16 82 views
1

我想用x和y座標繪製點並將輸出保存到圖像文件,但我不能。 (沒有必要在JFrame上看到它們) 據我所知,我可以創建繪圖並在JFrame上顯示它,但是我無法將此輸出保存到文件中。如何在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); 
     }} 

而且,我已經試過BufferedImage的流行的解決方案與ImageIO的,但在這種情況下,我無法創建一個座標系,而不是我在圖像文件中的黑色矩形。

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

預先感謝您

+1

爲了更好地幫助越早,張貼[MCVE]或[簡要,獨立的,正確的示例](http://www.sscce.org/)。 –

+2

你應該寫_不_圖像_inside_的循環,但_after_循環,即先填寫,然後將圖像寫入和處置。 – Thomas

+0

另外,'TYPE_BYTE_INDEXED'在JPEG下無法正常工作。 – haraldK

回答

3

你不需要任何Swing組件創建的圖像並保存到文件中。

這裏是繪製圓並將其保存到文件的一個小例子:

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

您可能需要玩的圖像類型,如果你需要在輸出準確JPEG圖像。

你得到黑色矩形的原因是你不用任何東西填充背景,JPEG格式不支持透明圖像 - 如果你希望圖像透明,使用PNG代替。或者你可以用任何你想要的顏色填充圖像背景。也正如評論中提到的那樣 - 並非所有的圖像類型都能很好地處理不同的輸出圖像格式。

此外,萬一 - 上的所有圖像和組件開始在左上角的座標([0,0]的座標)。

如果你想節省您的桌面Swing應用程序UI成圖像文件的一部分,您將需要使用Swing組件提供的方法將它們畫到圖形,從圖像檢索。

+0

這就是我所需要的。謝謝, – Kadir