Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Запомнить изображение в файл


Автор: AntonSaburov 28.6.2006, 12:56
Чаще всего люди спрашивают следующее:
"У меня компонент рисует нечто на своей поверхности и хотелось бы запомнить данное изображение в файл или еще куда-нибудь".

Таких вопросов появляется немало и найдя вариант решения подобной задачи захотелось поделиться. Основная идея в следующем:
- создать BufferedImage
- получить от него его Graphics
- передать данный Graphics в компонент в качестве параметра к методу paint

Ниже приведен код, который рисует на панели несложную картинку и при нажатии кнопки записывает изображение в файл.

Важно: В процессе экспериментов оказалось, что если Вы хотите что-то нарисовать на "скрытом" компоненте (например вы создали эту самую панель, но показывать ее не хотите, то надо вызывать setBounds для данного компонента и тогда все получится.

Код приведен ниже. Enjoy smile

Код

import java.io.*;

import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.image.*;

import javax.swing.*;
import javax.imageio.*;



public class test extends JFrame implements ActionListener
{
  MyComp pnl = new MyComp();
  JButton btn = new JButton("Make graph");

  public test()
  {
    getContentPane().add(pnl, BorderLayout.CENTER);

    btn.addActionListener(this);
    getContentPane().add(btn, BorderLayout.SOUTH);

    setBounds(100,100,400,300);
  }

  public static void main(String args[])
  {
    test t = new test();
    t.setDefaultCloseOperation(EXIT_ON_CLOSE);
    t.setVisible(true);
  }

  public void actionPerformed(ActionEvent e)
  {
    try {
      BufferedImage bi = 
        new BufferedImage(pnl.getWidth(), pnl.getHeight(), BufferedImage.TYPE_INT_RGB);
      Graphics g = bi.getGraphics();                  
      pnl.paint(g);
      FileOutputStream os = new FileOutputStream("test.png");
      ImageIO.write(bi, "png", os);
      os.close();
      JOptionPane.showMessageDialog(this, "Image is saved to file 'test.png'");
    }
    catch(Exception ex) {
      ex.printStackTrace();
    }
    
  }
}

class MyComp extends JPanel
{
  public void paintComponent(Graphics g)
  {
    super.paintComponent(g);

    int w = getWidth();
    int h = getHeight();
    int od = 10;
    int rd = 3;

    g.setColor(Color.WHITE);
    g.fillRect(0, 0, w, h);

    g.setColor(Color.BLACK);
    g.drawLine(0, 0, w, h);
    g.drawLine(0, h, w, 0);

    g.setColor(Color.BLUE);
    g.drawOval(w/od, h/od, w-2*w/od, h-2*h/od);

    g.setColor(Color.GREEN);
    g.fillRect(w/rd, h/rd, w-2*w/rd, h-2*h/rd);
  }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)