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

Поиск:

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


Штурман
****


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

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



Занес данный раздел в FAQ а потом решил, что здесь быстрее наткнутся.

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

Таких вопросов появляется немало и найдя вариант решения подобной задачи захотелось поделиться. Основная идея в следующем:
- создать 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   Вверх
Vofka
Дата 28.6.2006, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 21.6.2006

Репутация: нет
Всего: 1



А почему именно setBounds помоему можно просто сделать revalidate компонента и тогда он перерисуется или я не прав? 
PM MAIL   Вверх
AntonSaburov
Дата 28.6.2006, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


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

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



Цитата(Vofka @  28.6.2006,  14:08 Найти цитируемый пост)
А почему именно setBounds помоему можно просто сделать revalidate компонента и тогда он перерисуется или я не прав? 

Так размеры будут установлены только либо руками (setBounds), либо в случае реально прорисовки компонента.

Может быть ситуация, когда компонент вообще не будет показан - его даже на форму не положат, т.к. даже формы нет (это в случае серверного приложения вполне может быть). И тогда размеров у него не будет (точнее они будут 0 х 0). 

Вот пример:

Код

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
{
  MyComp pnl = new MyComp();

  public test()
  {
    pnl.setBounds(0,0,400,300);  // убери эту строку и получишь ошибку. А с это строкой ничего на экране не видно, а картинка в файле :)
    saveFile();
  }

  public static void main(String args[])
  {
    test t = new test();
    t.saveFile();
  }

  public void saveFile()
  {
    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();
    }
    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   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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