如何将字节数组转换为缓冲图像

时间:2013-11-16 02:42:07

标签: java bufferedimage javax.imageio bytearrayinputstream

我有一个服务器端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格式。这是我将客户端代码作为String发送到服务器的代码:

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());
}

1 个答案:

答案 0 :(得分:4)

最可能的解释是字节数组包含JPEG图像。 (例如,如果您刚刚尝试下载它,则可能会有一个HTML文档提供错误诊断。)如果是这种情况,您需要查找导致此问题的原因并进行修复。

但是,如果您“知道”字节数组包含具有给定格式的图像,您可以执行以下操作:

  1. 使用ImageIO.getImageReadersByFormatNameImageIO.getImageReadersByMIMEType获取Iterator<ImageReader>
  2. ImageReader
  3. 中提取第一个Iterator
  4. 为类型创建MemoryCacheImageInputStream包裹ByteArrayInputStream
  5. 使用ImageReader.setInput将阅读器连接到ImageInputStream
  6. 使用ImageReader.read获取BufferedImage