Как преобразовать массив байтов в буферизованное изображение
-
21-12-2019 - |
Вопрос
У меня есть серверный 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-документ с диагностикой ошибки.) Если это так, вам нужно будет найти причину этого и устранить ее.
Однако, если вы "знаете", что массив байтов содержит изображение с заданным форматом, вы могли бы сделать что-то вроде этого:
- Воспользуйся
ImageIO.getImageReadersByFormatName
илиImageIO.getImageReadersByMIMEType
чтобы получитьIterator<ImageReader>
. - Потяните за первый
ImageReader
изIterator
. - Создать
MemoryCacheImageInputStream
обертываниеByteArrayInputStream
для типов. - Воспользуйся
ImageReader.setInput
для подключения считывателя кImageInputStream
. - Воспользуйся
ImageReader.read
чтобы получитьBufferedImage
.