2013-11-16 5 views
3

У меня есть код Java на стороне сервера, который получает массив байтов от клиента. Чтобы сделать некоторую обработку изображения, мне нужно преобразовать массив байтов в BufferedImage. У меня есть код, который должен сделать это здесь:Как преобразовать массив байтов в буферное изображение

public void processImage(byte[] data) { 
    ByteArrayInputStream stream = new ByteArrayInputStream(data); 
    BufferedImage bufferedImage; 
    bufferedImage = ImageIO.read(stream); 

    // bufferedImage is null 
    //... 
} 

Но это не работает; bufferedImage - null. не Согласно документации ImageIO:

Если не зарегистрировано ImageReader требования, чтобы иметь возможность читать результирующий поток, null возвращается.

Как сообщить ImageReader, какой тип изображения он есть. Например, если я знаю, что изображение будет JPEG (что это, в моем случае), что я должен делать?

EDIT: Благодарим за предположение, что файл, скорее всего, не находится в формате JPEG. Это код на стороне клиента я, который отправляет данные в виде строки на сервер:

import org.json.JSONObject; 

// Client-side code that sends image to server as String 
public void sendImage() { 
    FileInputStream inputStream = new FileInputStream(new File("myImage.jpg")); 
    ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); 
    byte[] b = new byte[1024]; 
    while ((bytesRead = inputStream.read(b)) != -1) { 
     byteStream.write(b,0,bytesRead); 
    } 
    byte[] byteArray = byteStream.toByteArray(); 

    JSONObject jsonObject = new JSONObject(); 
    jsonObject.put("data",new String(byteArray)); 

    // ... more code here that sends jsonObject in HTTP post body 
} 

И это код на стороне сервера, который вызывает функцию processImage():

// Server-side code that calls processImage() function 
public void handleRequest(String jsonData) { 
    JSONObject jsonObject = new JSONObject(jsonData); 
    processImage(jsonObject.getString("data").getBytes()); 
} 
+2

Для более эффективной помощи, отправьте сообщение [SSCCE] (http://sscce.org/). –

+0

Вы уверены, что массив байтов имеет хорошие данные? Пробовали ли вы простой тест с программой, которая читает изображение, преобразует его в массив байтов и затем преобразует этот массив байтов в изображение. – NormR

+1

ImageIO распознает правильный JPEG, используя код, который вы опубликовали. Таким образом, скорее всего, изображение не в формате JPEG. Легкий способ тестирования - выгрузить массив данных на диск и посмотреть, как он выглядит. Попробуйте открыть его в другом программном обеспечении или посмотрите на него в шестнадцатеричном редакторе. Возможно, массив данных содержит декодированные пиксели из файла JPEG? – haraldK

ответ

4

Наиболее вероятным объяснением является то, что массив байтов не содержит, содержащий изображение в формате JPEG. (Например, если вы только что попытались загрузить его, у вас может быть документ HTML, дающий диагностическую ошибку). Если это так, вам нужно найти причину этого и исправить его.

Однако, если вы «знаете», что массив содержит изображение с заданным форматом, вы могли бы сделать что-то вроде этого:

  1. Используйте ImageIO.getImageReadersByFormatName или ImageIO.getImageReadersByMIMEType получить Iterator<ImageReader>.
  2. Потяните первый ImageReader от Iterator.
  3. Создайте MemoryCacheImageInputStream для упаковки типов ByteArrayInputStream.
  4. Используйте ImageReader.setInput для подключения считывателя к ImageInputStream.
  5. Используйте ImageReader.read, чтобы получить BufferedImage.
+0

Спасибо, возможно, клиент не отправляет законное изображение JPEG. Я добавил код на стороне клиента – baekacaek

+0

Оказалось, что массив байтов не может быть превращен в строку без его развращения.Таким образом, в итоге данные были повреждены и не содержали изображение в формате JPEG. – baekacaek

+1

Yup ... Я видел это раньше. 'new String (byte [])' и т. д. являются потерями, когда байты не были должным образом закодированы символьными данными. –

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