BufferedImage 空指针异常

bufferedimage null pointer exception

提问人:FNA 提问时间:9/25/2023 最后编辑:FNA 更新时间:9/26/2023 访问量:24

问:

我有一个从 soap 返回的字符串形式的图像。我需要解码此图像并将其用作 bufferedimage。但是当我进行转换时,bufferedimage 显示为 null。我该如何解决这个问题?我在哪里犯了错误?

 String content=getContent(soapResponse);
 byte[] inputStreamResponse=content.getBytes(StandardCharsets.UTF_8);

 BufferedImage image = null;

 try {
     image = ImageIO.read(new ByteArrayInputStream(inputStreamResponse));
 } catch (IOException e) {
     e.printStackTrace();
 }
 BufferedImage scaledImg = Scalr.resize(image, 300); //300dpi


 private String getContent(SOAPMessage soapResponse)  {
    String content=null;
    if (labelelement.getLocalName().equals("content")) {
            String ss= labelelement.getLastChild().getNodeValue();
            content=   new String(Base64.getDecoder().decode(ss),StandardCharsets.UTF_8);
    }
    return content;
 }
图像 肥皂 nullpointerException 转换器 bufferedimage

评论

0赞 Harald K 9/25/2023
您的方法将 base64 数据解码为一个新字符串...这可能损坏了图像数据。相反,解码为字节数组、缓冲区或 .然后在 main 方法中读取此数组/缓冲区/流。getContentByteInputStream
0赞 Harald K 9/25/2023
PS:ImageIO内置了一组有限的格式。可以通过安装插件添加更多格式。 如果没有可用于您尝试读取的格式的插件,将返回。您可能希望为此添加测试,除非您确定 SOAP 服务仅提供受支持格式的有效图像。ImageIO.read(...)null
0赞 FNA 9/25/2023
非常感谢你,我会努力实现你说的。

答:

0赞 Harald K 9/26/2023 #1

ImageIO 支持一组有限的内置格式(自 Java 9 以来的 BMP、GIF、JPEG、PNG 和 TIFF)。可以通过安装第三方插件来添加更多格式。 如果没有可用于您尝试读取的格式的插件,将返回。这不是一个错误,而是有意的、记录在案的行为。您可能希望在代码中为此添加测试,除非您确定 SOAP 服务仅提供受支持格式的有效图像。ImageIO.read(...)null

也就是说,代码中的问题可能是将 base64 数据解码为 ...这可能损坏了图像数据。相反,解码为字节数组、缓冲区或 .然后在 main 方法中读取此数组/缓冲区/流。getContentStringByteInputStream

像这样:

byte[] content = getContent(soapResponse);

BufferedImage image = null;

try (InputStream stream = new ByteArrayInputStream(content)) {
    image = ImageIO.read(stream);
} catch (IOException e) {
    e.printStackTrace();
}

if (image == null) {
    // TODO: Handle image could not be decoded situation
}

BufferedImage scaledImg = Scalr.resize(image, 300); //300dpi


/// ...

private byte[] getContent(SOAPMessage soapResponse)  {
    if (labelelement.getLocalName().equals("content")) {
        String ss = labelelement.getLastChild().getNodeValue();
        return Base64.getDecoder().decode(ss);
    }

    return null;
 }