Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Предать картинку по сети / 11 сообщений из 11, страница 1 из 1
08.08.2013, 08:50:20
    #38359100
TimRX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предать картинку по сети
Доброго времени суток


Нужно передать объект класса Image от клиента серверу через сокет.
Как передать файл как бы понятно

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
client = new Socket("server", port);
bis = new BufferedInputStream(new FileInputStream("somefile.dat"));
bos = new BufferedOutputStream(client.getOutputStream());
byteArray = new byte[8192];
while ((in = bis.read(byteArray)) != -1){
    bos.write(byteArray,0,in);
}
bis.close();
bos.close();



А вот что касается объекта класса Image не понятно ...
Хотелось бы на примере разобраться.
...
Рейтинг: 0 / 0
08.08.2013, 08:54:26
    #38359102
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предать картинку по сети
Объект класса Image может быть связан с нативными ресурсами компа. Например VolatileImage. Вообще этот класс не объявлен как serializable. Поэтому передать его куда-то по сети или сохранить в файл не предосталвяется возможным. Зато его можно перекодировать в любой формат с помощью класса ImageIO. И уже полученые данные передавать куда душе угодно.
http://docs.oracle.com/javase/tutorial/2d/images/saveimage.html
...
Рейтинг: 0 / 0
08.08.2013, 10:46:32
    #38359274
TimRX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предать картинку по сети
А к примеру если с конвертировать в массив байт

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public byte[] convertImageToByte(Image img) throws IOException{
    
    ByteArrayOutputStream baos=new ByteArrayOutputStream(); 
       
    final BufferedImage bufferedImage = createBufferedImageFrom(image);
    ImageIO.write(bufferedImage, "png", baos);
  
  
   return baos.toByteArray();
   } 



Как можно этот массив передать клиенту ?
...
Рейтинг: 0 / 0
08.08.2013, 10:48:02
    #38359279
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предать картинку по сети
...
Рейтинг: 0 / 0
08.08.2013, 10:49:22
    #38359283
TimRX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предать картинку по сети
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
private BufferedImage createBufferedImageFrom(final Image image) {
        if (image instanceof BufferedImage) {
          return (BufferedImage) image;
        } else {
          final BufferedImage bi = new BufferedImage(image.getWidth(null), image.getHeight(null),
              BufferedImage.TYPE_INT_RGB);
        final Graphics2D g2 = bi.createGraphics();
        g2.drawImage(image, 0, 0, null);
        return bi;
    }
   
 } 
...
Рейтинг: 0 / 0
11.08.2013, 08:10:01
    #38362161
Ronib3
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предать картинку по сети
TimRX,

Кодируешь картинку в Base64 и передаешь как обычный String на другом конце раскодируешь обратно. Правда размер строки получаетсяв два раза больше чем картинка.
i.e.
http://ben-bai.blogspot.ca/2012/08/java-convert-image-to-base64-string-and.html
...
Рейтинг: 0 / 0
14.08.2013, 08:38:53
    #38365595
TimRX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предать картинку по сети
Спасибо всем за помощь. Картинку конвертирую в байты и передаю серверу.
Сервер получает и записывает в ByteArrayOutputStream. Далее создаю картинку и рисую Jpanel.
Рисую так
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        Graphics2D g2d = (Graphics2D) g;
          if(image != null){
            g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
          }
    }

    @Override
    public void update(Observable o, Object o1) {
         repaint();
    }



Но проблема в том что картинку не видно пока мышкой не делаешь ресайс формы.
...
Рейтинг: 0 / 0
14.08.2013, 10:34:18
    #38365722
maxkar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предать картинку по сети
TimRX,

repaint вызовите после того, как картинка пришла/загрузилась/распаковалась. Читайте Painting in AWT and Swing .
...
Рейтинг: 0 / 0
20.08.2013, 11:40:10
    #38371680
TimRX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предать картинку по сети
Не получается отобразить картинку на JPanel.
Опишу подробнее.

Я писал выше , что клиент пересылает картинку серверу ... на самом деле наоборот, но я думаю это не важно.

При соединении клиента сервер передает массив байт клиенту. Клиент лови и создает на основе массива картинку.
Картинка записывается в модель
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
public class model extends Observable{
        private Image image;

        public Image getImage(){
            return image;
        }

       public void setImage(Image img){
           image = img;
           notifyView();
       } 

       public void notifyView(){
           setChanged();
           notifyObservers();
       }
}



Есть представление (view) которое выводит полученную картинку при изменении модели
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
public class view extends JPanel implements Observer{
    private model model;
    
    public view(model cl){
        model= cl;
        model.addObserver(this);
   } 
    
    @Override 
    public void paint(Graphics g) {
        super.paint(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.drawImage(model.getImage(), 0, 0, getWidth(), getHeight(), null);
    }

    @Override
    public void update(Observable observable,Object object){
        repaint(); 
    }
}



view размещен на JFrame
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
public class frame extends JFrame  {
      private view jPanel;
      private model model;
         
      public frame()  {

            model = new model(); 
            jPanel = new view(model);
            threadTrans trans = new threadTrans(model);
            trans.start();
            controller controller = new controller(trans);
            JButton button = new JButton();
            button.addActionListener(controller.getActionListener());
            setLayout(new BorderLayout());
            add(jPanel,BorderLayout.CENTER);
            add(button,BorderLayout.SOUTH);
      }
}



В классе frame создается и запускается поток который соединяется и ловит картинки от сервера и останавливается при событии нажатия на кнопку button в поведении (controller).
Класс потока
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
public class threadTrans extends Thread{
    private controller controller;
    private model model;
     public threadTrans(model mdl){
         model = mdl;
         controller = new controller(null);
      }
    
    @Override
    public void run(){
       
      while (true) {  
      
       if (!Thread.interrupted()) {   
        try {
            controller.beginTransScreen(model);
        } catch (IOException ex) {
            Logger.getLogger(threadTrans.class.getName()).log(Level.SEVERE, null, ex);
        }
       }
       else 
         return;
      }
     }
 }



Нажатие кнопки
Код: java
1.
2.
3.
4.
5.
6.
7.
buttonAction = new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent ae) {
        trans.interrupt();
    }
};



В результате картинку видно если делать ресайз формы. Подскажите пожалуйста , что мне необходимо обновлять для отображения картинки.
...
Рейтинг: 0 / 0
21.08.2013, 09:10:39
    #38372716
TimRX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предать картинку по сети
И еще вопрос ... я знаю что запускать поток из конструктора плохо.
Код: java
1.
trans.start();



Как сделать правельно ?
...
Рейтинг: 0 / 0
21.08.2013, 09:25:10
    #38372727
Паша01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предать картинку по сети
TimRXИ еще вопрос ... я знаю что запускать поток из конструктора плохо.
Код: java
1.
trans.start();



Как сделать правельно ?

Ну а как бы ты сам сделал, куда ещё засунул?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Предать картинку по сети / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]