如何将字节数组转换为缓冲图像
-
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 为空。根据 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
.
不隶属于 StackOverflow