Как преобразовать массив байтов в буферизованное изображение

StackOverflow https://stackoverflow.com//questions/20013980

Вопрос

У меня есть серверный 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 (каковым оно и является в моем случае), что я должен делать?

РЕДАКТИРОВАТЬ: Спасибо за предположение, что файл, скорее всего, не в формате 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());
}
Это было полезно?

Решение

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

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

  1. Воспользуйся ImageIO.getImageReadersByFormatName или ImageIO.getImageReadersByMIMEType чтобы получить Iterator<ImageReader>.
  2. Потяните за первый ImageReader из Iterator.
  3. Создать MemoryCacheImageInputStream обертывание ByteArrayInputStream для типов.
  4. Воспользуйся ImageReader.setInput для подключения считывателя к ImageInputStream.
  5. Воспользуйся ImageReader.read чтобы получить BufferedImage.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top