powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Предать картинку по сети
11 сообщений из 11, страница 1 из 1
Предать картинку по сети
    #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
Предать картинку по сети
    #38359102
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объект класса Image может быть связан с нативными ресурсами компа. Например VolatileImage. Вообще этот класс не объявлен как serializable. Поэтому передать его куда-то по сети или сохранить в файл не предосталвяется возможным. Зато его можно перекодировать в любой формат с помощью класса ImageIO. И уже полученые данные передавать куда душе угодно.
http://docs.oracle.com/javase/tutorial/2d/images/saveimage.html
...
Рейтинг: 0 / 0
Предать картинку по сети
    #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
Предать картинку по сети
    #38359279
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Предать картинку по сети
    #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
Предать картинку по сети
    #38362161
Ronib3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimRX,

Кодируешь картинку в Base64 и передаешь как обычный String на другом конце раскодируешь обратно. Правда размер строки получаетсяв два раза больше чем картинка.
i.e.
http://ben-bai.blogspot.ca/2012/08/java-convert-image-to-base64-string-and.html
...
Рейтинг: 0 / 0
Предать картинку по сети
    #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
Предать картинку по сети
    #38365722
maxkar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimRX,

repaint вызовите после того, как картинка пришла/загрузилась/распаковалась. Читайте Painting in AWT and Swing .
...
Рейтинг: 0 / 0
Предать картинку по сети
    #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
Предать картинку по сети
    #38372716
TimRX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И еще вопрос ... я знаю что запускать поток из конструктора плохо.
Код: java
1.
trans.start();



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



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

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


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