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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> BufferedImage сделать как Serialized, Быстрое решение. 
V
    Опции темы
val
  Дата 16.2.2006, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Program developer
**


Профиль
Группа: Участник Клуба
Сообщений: 992
Регистрация: 14.1.2003
Где: г. Киев

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



Привет всем!
Хочу отправить в сеть объект AWT BufferedImage. Дело ясное, что для того, чтобы отправить в сеть объект, он должен быть Serializable, но, увы BufferedImage не таков. Следовательно, надо писать wrapper, котый бы включал в себя данные из BufferedImage и мог бы быть Serializable. Вот 2 штуки таковых:
Код

public class BufferedImageWrap implements Serializable {
   final int width;
   final int height;
   int[][] colors = null;    
   
   public BufferedImageWrap(BufferedImage image){    
       this.width = image.getWidth();
       this.height = image.getHeight();
       this.colors = new int[width][height];
       for (int x = 0; x < width; x++)
           for (int y = 0; y < height; y++)
               colors[x][y]=image.getRGB(x, y);
   }
    
   
   public BufferedImage getImage() {
       BufferedImage result = new BufferedImage(width,
               height, BufferedImage.TYPE_INT_RGB);    
       for (int i=0;i<width;i++) 
           for (int j=0;j<height;j++) 
               result.setRGB(i,j,colors[i][j]);
       
       return result;    
   }

}

//////////////////////////////////////////////////////////////////////////////////////

public class BufferedImageWrapper implements Serializable {
    private final int top;
    private final int left;
    private byte image[] = null;
    // Constuctor.
    public BufferedImageWrapper(BufferedImage bufImage, int left, int top) {
        this.top = top;
        this.left = left;
        this.image = toByteArray(bufImage, "bmp");
    }
   
     private BufferedImage fromByteArray(byte[] imagebytes) {
       try {
           if (imagebytes != null && (imagebytes.length > 0)) {
               BufferedImage im = ImageIO.read(new ByteArrayInputStream(imagebytes));
               return im;
           }
           return null;
       } catch (IOException e) {
           throw new IllegalArgumentException(e.toString());
       }
   }
   
   
  private byte[] toByteArray(BufferedImage o, String imageFormat) {
       if(o != null) {
           if (imageFormat == null)
               imageFormat = "bmp";
           BufferedImage image = o;
           ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
           try {
               ImageIO.write(image, imageFormat, baos);
           } catch (IOException e) {
               throw new IllegalStateException(e.toString());
           }
           byte[] b = baos.toByteArray();
           return b;
       }
       return new byte[0];
   }
   

    public int getTop() {
        return this.top;
    }
    
    public int getLeft() {
        return this.left;
    }
    
    public BufferedImage getBufferedImage() {
        return fromByteArray(image);
    }
}


Все эти wrapper(ы) работают очень медленно и занимают порядка половины секунды на рисунке 1024 * 768, что абсолютно не приемлимо... Посоветуйте, пожалуйста, как ускорить процесс сериализации объекта BufferedImage.


--------------------
Терпимость - величайшее благо человечества...
Ярчайший признак интеллекта – постоянно хорошее настроение…
PM MAIL ICQ   Вверх
Hroft
Дата 16.2.2006, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 20.10.2003
Где: Москва

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



Я, наверно, жутко туплю, но чем не устраивает
Код

public class BufferedImageWrap extends BufferedImage implements Serializable {

    public BufferedImageWrap(int width, int height, int imageType) {
        super(width, height, imageType);
    }
}

?
PM MAIL ICQ   Вверх
val
Дата 16.2.2006, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Program developer
**


Профиль
Группа: Участник Клуба
Сообщений: 992
Регистрация: 14.1.2003
Где: г. Киев

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



Hroft, так, как ты предложил, работать не будет. smile Твой класс действительно может отправиться в сеть, а приёмник его создать не сможет, выпадет в exception, что объект не сереализируемый...

Это сообщение отредактировал(а) val - 16.2.2006, 19:29


--------------------
Терпимость - величайшее благо человечества...
Ярчайший признак интеллекта – постоянно хорошее настроение…
PM MAIL ICQ   Вверх
Nobody
Дата 16.2.2006, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 25.8.2003
Где: Россия, Москва

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



А что именно занимает полсекунды? Сериализация? Или ещё и отправка по сети + десериализация?


--------------------
Алгоритм помещения вопросов на форуме
Выражаем спасибо вот ТАК
Use the Source, Luke!
PM MAIL WWW ICQ   Вверх
kkorsakoff
Дата 17.2.2006, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ИМХО, такой способ не пройдет. Не претендую на единственно правильное решение, но я при помощи ImageIO писал картинку в массив byte и передавал его по сети. Затем на стороне клиента создавал BufferedImage из этого массива. Я сжимал в jpeg, но можно передавать и в png. Скорость была вполне приемлимая. Сама запись картинки в массив - практически мгновенно.
PM MAIL WWW ICQ   Вверх
val
Дата 17.2.2006, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Program developer
**


Профиль
Группа: Участник Клуба
Сообщений: 992
Регистрация: 14.1.2003
Где: г. Киев

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



Цитата

А что именно занимает полсекунды? Сериализация?


Да, превращение BufferedImage в сериализирумый объект.

Цитата

Скорость была вполне приемлимая. Сама запись картинки в массив - практически мгновенно.


Кой был размер у картинки?


--------------------
Терпимость - величайшее благо человечества...
Ярчайший признак интеллекта – постоянно хорошее настроение…
PM MAIL ICQ   Вверх
Nobody
Дата 17.2.2006, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 25.8.2003
Где: Россия, Москва

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



val, а в каких форматах? Просто если bmp, то это картинка на несколько мегабайт, что довольно много.


--------------------
Алгоритм помещения вопросов на форуме
Выражаем спасибо вот ТАК
Use the Source, Luke!
PM MAIL WWW ICQ   Вверх
val
Дата 17.2.2006, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Program developer
**


Профиль
Группа: Участник Клуба
Сообщений: 992
Регистрация: 14.1.2003
Где: г. Киев

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



Цитата

val, а в каких форматах? Просто если bmp, то это картинка на несколько мегабайт, что довольно много.


Ага, BMP. И по-другому никак, так как картинка не должна быть искажена. smile


--------------------
Терпимость - величайшее благо человечества...
Ярчайший признак интеллекта – постоянно хорошее настроение…
PM MAIL ICQ   Вверх
Nobody
Дата 17.2.2006, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 25.8.2003
Где: Россия, Москва

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



val, Думаю ты с этим ничего не сделаешь.


--------------------
Алгоритм помещения вопросов на форуме
Выражаем спасибо вот ТАК
Use the Source, Luke!
PM MAIL WWW ICQ   Вверх
LSD
Дата 17.2.2006, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 38
Всего: 538



val, а тебе вообще какое веремя нужено?

У меня картинка 1600x1200x24BPP перегоняется в BMP за 200-250 мсек.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
val
Дата 20.2.2006, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Program developer
**


Профиль
Группа: Участник Клуба
Сообщений: 992
Регистрация: 14.1.2003
Где: г. Киев

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



Странно, у меня 1024*768*24 перегоняется за 300 мсек.
Какой у тебя JDK и как ты перегоняешь картинку?


--------------------
Терпимость - величайшее благо человечества...
Ярчайший признак интеллекта – постоянно хорошее настроение…
PM MAIL ICQ   Вверх
val
Дата 20.2.2006, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Program developer
**


Профиль
Группа: Участник Клуба
Сообщений: 992
Регистрация: 14.1.2003
Где: г. Киев

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



Правда это еще от производительности процессора и типа памяти зависит, у меня самый обычный Celeron 1.8 с 512 метрами на борту...


--------------------
Терпимость - величайшее благо человечества...
Ярчайший признак интеллекта – постоянно хорошее настроение…
PM MAIL ICQ   Вверх
LSD
Дата 20.2.2006, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 38
Всего: 538



JDK 1.5, перегоняю так:
Код
BufferedImage img = ImageIO.read(new File("EbonHeart.jpeg"));
ByteArrayOutputStream byteOut = new ByteArrayOutputStream(4 * 1024 * 1024);
for(int i = 1; i <= 10 ; i++)
{
  long time = System.currentTimeMillis();
  ImageIO.write(img, "BMP", byteOut);
  //byteOut.writeTo(socketOutputStream);
  time = System.currentTimeMillis() - time;
  System.out.println("Pass #" + i + ", time: " + time + " msec");
}


Сегодня для рисунка 1280x1024x24BPP на P4 3.0ГГц получил следующие результаты:
Код
Pass #1, time: 235 msec
Pass #2, time: 140 msec
Pass #3, time: 94 msec
Pass #4, time: 94 msec
Pass #5, time: 93 msec
Pass #6, time: 94 msec
Pass #7, time: 125 msec
Pass #8, time: 94 msec
Pass #9, time: 94 msec
Pass #10, time: 93 msec



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
val
Дата 20.2.2006, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Program developer
**


Профиль
Группа: Участник Клуба
Сообщений: 992
Регистрация: 14.1.2003
Где: г. Киев

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



Ну, вобщем-то понятно, машинка у тебя, конечно, побыстрее будет, но и то, не совсем так, как хотелось. smile
Смотри, мне надо захватывать содержимое экрана и отправлять его содержимое в сеть.
При самом пройстой реализации этой задачки имеем:
1. Захват экрана в объект BuffredImage длиться примерно 100 мсек.
2. Конвертация - 100 мсек.

Имеем - 200 мсек, то есть такая операция даже на твоей мощной машинке возможна только 5 раз в секунду, что, конечно, крайне неприятно. smile Я уж не говорю, про слабенькие компьютеры уровня Селерон 1.3.

В любом случае, спасибо, мне приятно знать, что я всё делаю правильно. smile


--------------------
Терпимость - величайшее благо человечества...
Ярчайший признак интеллекта – постоянно хорошее настроение…
PM MAIL 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.0586 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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