2013-12-05 6 views
3

У меня есть массив байтов размером 640 * 480 * 3, а его порядок байтов равен r, g, b. Я пытаюсь преобразовать его в Image. Следующий код не работает:Преобразование байтового массива в изображение

BufferedImage img = ImageIO.read(new ByteArrayInputStream(data)); 

с excepton

Exception in thread "main" java.lang.IllegalArgumentException: image == null! 
at javax.imageio.ImageTypeSpecifier.createFromRenderedImage(ImageTypeSpecifier.java:925) 
at javax.imageio.ImageIO.getWriter(ImageIO.java:1591) 
at javax.imageio.ImageIO.write(ImageIO.java:1520) 

Я также попробовал этот код:

ImageIcon imageIcon = new ImageIcon(data); 
Image img = imageIcon.getImage(); 
BufferedImage bi = new BufferedImage(img.getWidth(null),img.getHeight(null),BufferedImage.TYPE_3BYTE_BGR); //Exception 

но безуспешно:

Exception in thread "main" java.lang.IllegalArgumentException: Width (-1) and height (-1) must be > 0 

Как можно Я получаю изображение из этого массива?

ответ

2

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

int w = 640; 
int h = 480; 
BufferedImage i = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); 
for (int y=0; y<h; ++y) { 
    for (int x=0; x<w; ++x) { 
     // calculate index of pixel 
     // depends on exact organization of image 
     // sample assumes linear storage with r, g, b pixel order 
     int index = (y * w * 3) + (x * 3); 
     // combine to RGB format 
     int rgb = ((data[index++] & 0xFF) << 16) | 
        ((data[index++] & 0xFF) << 8) | 
        ((data[index++] & 0xFF)  ) | 
        0xFF000000; 
     i.setRGB(x, y, rgb); 
    } 
} 

Точная формула для индекса пикселя зависит от того, как организованы данные в массиве - что вы на самом деле не задающие точно. Prinicple всегда одно и то же, объедините значение R, G, B в значение RGB (ARGB, чтобы быть точным) и поместите его в BufferedImage с помощью метода setRGB().

+0

'Простой массив байтов не является распознанным форматом изображения. 'что является источником этой информации и почему это так? И второй случай на самом деле показывает, что у него проблема с самим изображением, он намерен прочитать – Sage

+0

@Sage Источник информации - это здравый смысл *. Что-то не указано не может быть общепризнанным форматом изображения, или он может? Существует огромное количество способов преобразования изображения в байт [] (и ОП описал его кратко 640 * 480 * 3 - это не оставляет места для * любых * метаданных, поэтому он не может быть общим форматом). По крайней мере, это очень очевидно для меня. И проблема «чтения» изображения является естественным результатом того, что формат не распознается. Все исключения приводят прямо или косвенно из нераспознаваемого формата изображения. Взгляните на Javadocs для IconImage. – Durandal

+0

спасибо, я пропустил '640 * 480 * 3' упоминание. На самом деле его второе исключение заставило меня отвлечь меня и смутить. – Sage

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