2013-06-08 4 views
1

Я проверил несколько примеров того, как конвертировать byte[] в BufferedImage, но я не могу заставить его работать. Преобразовать изображение в массив байтов с:Преобразование ImageByteArray в BufferedImage

 BufferedImage b = null, c=null; 
     try { 
      b = ImageIO.read(Main.class.getResource("res/lvl/Medieval.png")); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     byte[] imageByteArray = ((DataBufferByte) b.getRaster().getDataBuffer()).getData(); 

Тогда я пытаюсь преобразовать его обратно с:

 ByteArrayInputStream bais = new ByteArrayInputStream(imageByteArray); 

     try { 
      c = ImageIO.read(bais); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

c еще null после этого. Что я делаю не так?

+0

Я думаю, что проблема есть с письмом. – Azad

+0

Хм .. Я думаю, что ваши намерения здесь немного неясны ... Вы хотите делать манипуляции с необработанными пиксельными данными? Тогда вам не нужно создавать новое изображение из данных, изменения будут отражены на изображении. Или вы просто хотите сделать копию изображения? – haraldK

+0

Если вы просто хотите скопировать изображение, есть более простые способы. Кроме того, ваше предположение, что изображение использует 'DataBufferByte', конечно, не будет правильным для всех изображений. – haraldK

ответ

2

Код линии

byte[] imageByteArray = ((DataBufferByte) b.getRaster().getDataBuffer()).getData(); 

не создает действительный массив байтов для изображения.

Используйте этот код вместо:

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    ImageIO.write(b, "png", baos); 
    byte[] imageByteArray = baos.toByteArray(); 
+0

Да! Это сделал трюк!Спасибо – Limon

+0

Я рад, что это сработало для вас - подумайте о том, чтобы принять ответ :) –

1

То, что вы после первого преобразования является необработанные данные пикселей. Вместо использования ImageIO (который может считывать изображения в сериализованном формате) попробуйте сделать oposite-преобразование, которое вы сделали, чтобы сделать массив байтов в первую очередь.

Обычно somethig так:

DataBufferByte buffer = new DataBufferByte(bytes, bytes.length); 
    ColorModel cm = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), new int[]{8, 8, 8}, false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE); 
    return new BufferedImage(cm, Raster.createInterleavedRaster(buffer, width, height, scanline, bpp, bandOffsets, null), false, null); 

Однако изображение будет идентичным первому изображению, так что я не совсем уверен, что вы пытаетесь достичь здесь ..?

PS: Имейте в виду, что массив байтов изображения не клонирован (если вы не делаете это явно), поэтому изображения будут обмениваться данными пикселей.

+0

Я хочу, чтобы преобразовать его в массив байтов, чтобы я мог закодировать его в base64 для отправки по сокету, а затем собрать на другом конце. Таким образом, это то же самое изображение. – Limon

0

Проблема заключается в том, что запись не извлекает изображение из байтового кода, изображение должно быть написано пикселем по пикселю.
Я заинтересовался вашим коротким способом конвертировать изображение в байт массив и тиски, но, к сожалению, первое не удается.
Может быть, это метод, который я сделал для вашей поможет вам:

  • Создайте свои собственные имена классов для примера ImageConversation или любого имени.
  • Сделать все разговоры (байт [] на изображение или изображение до байта []) статическим, чтобы вы могли вызывать их по имени класса.

Этот метод преобразует выбранный файл формы FileChooser или данный файл и преобразовать его в байт [], однако это немного долго, и это не может быть лучшим способом, но это дает хороший результат, и у меня нет проблем с этим.

 public static byte [] imageToBytoArray(File file){ 

     ByteArrayOutputStream byteArray; 
     try{ 
      FileInputStream fileStream = new FileInputStream(file); 
      byteArray = new ByteArrayOutputStream(); 
      byte [] buffer = new byte [1024]; 
      for(int i ;(i=fileStream.read(buffer)) !=-1;){ 
       byteArray.write(buffer, 0, i); 
      } 
      return byteArray.toByteArray(); 

     }catch(Exception ex){ 
      JOptionPane.showMessageDialog(null, ex.getMessage()); 
     } 
     return null; 
    } 
Смежные вопросы