0

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

无论如何,当我尝试转换收到的字符串时,一切似乎都正常,但返回了 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;
}
4

1 回答 1

0

文档中:

返回一个 BufferedImage 作为使用从当前注册的那些中自动选择的 ImageReader 解码提供的 InputStream 的结果。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,并使用该阅读器执行读取代码(如上所示)。

于 2013-07-24T13:36:24.460 回答