2016-06-14 7 views
2

Я ищу, чтобы отправить объект с BufferedImage через сокет. BufferedImage не является сериализуемым, поэтому его необходимо преобразовать в сериализуемый тип данных, а затем снова вернуться. Я много смотрел в Интернете, и байт [], похоже, идет, чтобы отправить только BuffereImage, но я пытаюсь отправить весь объект, поэтому я больше склоняюсь к int []. Мне показалось, что я столкнулся с ответом, который объяснил это здесь несколько недель назад, но после 2,5 часов поиска я не смог его найти. Я пробовал Java Oracle, но быстро заблудился.Как преобразовать BufferedImage в int []?

Если есть лучший способ, пожалуйста, извините мое невежество, поскольку я не очень много работал с сокетами и манипуляциями BufferedImage.

+0

почему вы не используете 'байт []' – Ramanlfc

+0

, потому что большинство случаев я вижу, что используется посылает только сотрясаться изображение, а не весь объект , через сокет ... Если я не ошибаюсь – Dak31

+0

Когда вы говорите «весь объект», какие дополнительные поля вы имеете в виду? Очевидно, что есть изображение (массив байтов), но вы имеете в виду ширину и высоту и т. Д.? Палитра? Проблема возникает, когда вы пытаетесь использовать многобайтовое значение между различными платформами: отправка 'int' over networks беспорядочна ... –

ответ

1

Отправить изображение поперек как PNG:

// BufferedImage -> byte sequence 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
ImageIO.write(img, "PNG", baos); 
byte[] imageData = baos.toByteArray(); 
// byte sequence -> BufferedImage 
ByteArrayInputStream bais = new ByteArrayInputStream(imageData); 
BufferedImage img = ImageIO.read(bais); 
1

В основном BufferedImage - это массив. Пиксели сохраняются в DataBuffer, который является массивом.

BufferedImage source = //... 
switch (source.getType()) 
    { 
    case BufferedImage.TYPE_BYTE_GRAY : 
    case BufferedImage.TYPE_3BYTE_BGR : 
    case BufferedImage.TYPE_4BYTE_ABGR : 
     final byte[] bb = ((DataBufferByte)source.getRaster().getDataBuffer()).getData() ; 
     //... 
     break ; 
    case BufferedImage.TYPE_USHORT_GRAY : 
     final short[] sb = ((DataBufferUShort)source.getRaster().getDataBuffer()).getData() ; 
     //... 
     break ; 
    case BufferedImage.TYPE_INT_RGB : 
    case BufferedImage.TYPE_INT_BGR : 
    case BufferedImage.TYPE_INT_ARGB : 
     final int[] ib = ((DataBufferInt)source.getRaster().getDataBuffer()).getData() ; 
     break ; 
    // etc. 
    } 

Вам также необходимо отправить размеры изображения, а также количество каналов.

+0

Недостаток наличия большого массива (и * не * зная размер самого изображения), который должен быть передан по сети (по сравнению с сжатыми данными PNG), уже упоминался в комментариях. Кроме того, получение данных буфера данных, подобных этому, приводит к тому, что изображение становится «непонятным» (иногда называемым «неуправляемым») и может значительно снизить производительность изображения для этого изображения. Кроме того, это разумный ответ на вопрос, независимо от того, является ли подход, который был предназначен для искателя, лучшим или нет ... – Marco13

+0

Да, я отвечал на основной вопрос «преобразовать изображение в int [] ». И да, отправить сжатые данные будет намного быстрее. – FiReTiTi

Смежные вопросы