将Java 2d图形图像另存为.png文件

时间:2011-11-20 14:41:24

标签: java image swing graphics png

我正在绘制模拟生成的信息的图形表示。我有图表显示,但我遇到的问题是能够将其保存为.png。当它保存png时,文件全部为黑色,因此它不保存我的图形,而是创建一些空白的png文件。问题是我很难弄清楚如何在eclipse throw错误中转换为BufferedImage或RenderedImage所有的尝试,当我得到它编译时,它就像我上面描述的那样工作。有什么想法或建议吗?我已经坚持了几个星期,这或者是一个明显的解决方案,或者我无法将其保存为png。但是从我进行的研究中,可以将java 2d图形img保存为png文件,我不知道我缺少什么?一双新鲜的眼睛会受到极大的赞赏!提前感谢您,我感谢任何有关此事的建议或意见。

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

4 个答案:

答案 0 :(得分:20)

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

答案 1 :(得分:6)

请参阅此示例:Draw an Image and save to png


import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
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(String 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);
      String message = "www.java2s.com!";
      FontMetrics fontMetrics = ig2.getFontMetrics();
      int stringWidth = fontMetrics.stringWidth(message);
      int stringHeight = fontMetrics.getAscent();
      ig2.setPaint(Color.black);
      ig2.drawString(message, (width - stringWidth) / 2, height / 2 + stringHeight / 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();
    }

  }
}

答案 2 :(得分:4)

Screen Image将创建面板的缓冲图像并将图像写入文件。

答案 3 :(得分:1)

看来你实际上从未在saveGraph(..)例程中绘制到BufferedImage。

创建BufferedImage并检索该图像的Graphics对象后,调用传递该图形上下文的主类的paintComponent方法。您还创建了两个GraphDisplay对象,但从不使用任何一个。

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

此时,您的BufferedImage现在应该具有与您的面板相同的图形,并且您应该能够保存内容。