Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запомнить изображение в файл 
:(
    Опции темы
AntonSaburov
Дата 28.6.2006, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



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

Таких вопросов появляется немало и найдя вариант решения подобной задачи захотелось поделиться. Основная идея в следующем:
- создать 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);
  }
}

PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0542 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.