从图像格式8BPP创建BufferedImage

时间:2013-07-24 13:33:52

标签: java base64 bufferedimage

在我的项目中,我收到一个灰度8BPP格式的Base64编码图像。我无法将其转换为BufferedImage。当我从磁盘读取图像(f.ex png)时,我有一些代码可以工作,对它进行base64编码,反之亦然。

无论如何,当我尝试转换我收到的String时,一切似乎都有效,但返回null。它不是被调用的catch,而是返回null的ImageIO.read。

有什么建议吗?我知道base64字符串是有效的,因为我试图将其保存为原始文件并在编辑器中打开它,它可以正确显示图像。

这是我的代码:

public static BufferedImage convertBase64StringToBufferedImage(String base64String){
    byte[] pictureBytes = Base64Coder.decode(base64String);

    InputStream is = new ByteArrayInputStream(pictureBytes);

    BufferedImage image;
    try {
        image = ImageIO.read(new ByteArrayInputStream(pictureBytes));
    } catch (IOException e) {
        log.error(e.getMessage(), e);
        return null;
    }
    return image;
}

1 个答案:

答案 0 :(得分:0)

来自documentation

  

作为解码提供的InputStream的结果返回BufferedImage       从当前的那些中自动选择ImageReader       注册。 InputStream包装在ImageInputStream中。 如果没有已注册的ImageReader声称能够读取生成的流,则返回null。

以下是执行的代码:

public static BufferedImage read(ImageInputStream stream)
    throws IOException {
    if (stream == null) {
        throw new IllegalArgumentException("stream == null!");
    }

    Iterator iter = getImageReaders(stream);
    if (!iter.hasNext()) {
        return null;                  // <~~~~~ here's your null
    }

    ImageReader reader = (ImageReader)iter.next();
    ImageReadParam param = reader.getDefaultReadParam();
    reader.setInput(stream, true, true);
    BufferedImage bi;
    try {
        bi = reader.read(0, param);
    } finally {
        reader.dispose();
        stream.close();
    }
    return bi;
}

也许您可以尝试根据适当的mime类型显式获取ImageReader,并使用该阅读器执行读取代码(如上所示)。