【问题标题】:exception: I/O error reading PNG header! for image reading size异常:读取 PNG 标头的 I/O 错误!图像读取尺寸
【发布时间】:2017-05-26 04:01:06
【问题描述】:

这是我的代码:

private Rectangle getImageUriImageSize(String uri) {
        Matcher matcher = dataUriPattern.matcher(uri);
        if (!matcher.find()) return null;
        byte[] bytes = DatatypeConverter.parseBase64Binary(matcher.group(2));
        ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
        Rectangle rectangle = null;
        try {
            BufferedImage bufferedImage = ImageIO.read(inputStream);
            if (bufferedImage != null) {
                rectangle = new Rectangle(0, 0, bufferedImage.getWidth(), bufferedImage.getHeight());
            }
        } catch (IOException e) {
            logger.warn("Error occurred when reading base64 Data URI: '{}'", e.getMessage());
        } finally {
            IOUtils.closeQuietly(inputStream);
        }
        return rectangle;
    }

报错

exception: I/O error reading PNG header!

的建议下我改成了这个

https://stackoverflow.com/a/27108892

private Rectangle getImageUriImageSize(String uri) {
    Matcher matcher = dataUriPattern.matcher(uri);
    if (!matcher.find()) return null;
    byte[] bytes = DatatypeConverter.parseBase64Binary(matcher.group(2));

    InputStream in = new ByteArrayInputStream(bytes);


  //  ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
    Rectangle rectangle = null;
    try {
        BufferedImage bufferedImage = ImageIO.read(in);
        if (bufferedImage != null) {
            rectangle = new Rectangle(0, 0, bufferedImage.getWidth(), bufferedImage.getHeight());
        }
    } catch (IOException e) {
        logger.warn("Error occurred when reading base64 Data URI: '{}'", e.getMessage());
    } finally {
        IOUtils.closeQuietly(in);
    }
    return rectangle;


}

但这次我遇到了错误。我使用 docker 并且这个容器退出了。

那该怎么办?

还有这个

 public Rectangle getImageSize(String currentMerchant, String relativeUrl) {logger.info("getImageSize");
        String imageUrl = getImageUrl(currentMerchant, relativeUrl);
        Rectangle rect = null;
        FileImageInputStream imageInputStream = null;
        try {
            File downloadedImageFile = restTemplate.execute(
                imageUrl,
                HttpMethod.GET,
                null,
                response -> {
                    InputStream inputStream = response.getBody();
                    String fileName = getFileName(relativeUrl);
                    return saveInputStreamAs(inputStream, fileName);
                }
            );

            Iterator<ImageReader> imageReaders = getImageReaders(downloadedImageFile);
            if (!imageReaders.hasNext()) {
                logger.warn("Cannot find any image reader for file {}", downloadedImageFile);
            }
            ImageReader imageReader = imageReaders.next();
            imageInputStream = new FileImageInputStream(downloadedImageFile);
            imageReader.setInput(imageInputStream, true, true);
            rect = new Rectangle(0, 0, imageReader.getWidth(0), imageReader.getHeight(0));
        } catch (HttpStatusCodeException ex) {
            logger.warn("Error getting image resource from url '{}', status: {}, message: {}", imageUrl, ex.getStatusCode(), ex.getResponseBodyAsString());
        } catch (IOException ex) {
            logger.warn("Could not read image by url '{}', exception: {}", imageUrl, ex.getMessage(), ex);
        } finally {
            IOUtils.closeQuietly(imageInputStream);
        }
        return rect;
    }

错误在这里

catch (IOException ex) {
        logger.warn("Could not read image by url '{}', exception: {}", imageUrl, ex.getMessage(), ex);
    }

【问题讨论】:

  • 请编辑您的问题,并添加完整的堆栈跟踪和指向导致异常的图像的链接。另外,我不清楚为什么你需要 3 种不同的方式来做到这一点......它们是否都因相同的异常而失败?第 3 版将是最快的,因为它只需要读取标题,而不是解码像素数据.
  • PS:查看源代码PNGImageReader,好像是PNG损坏了。您应该从堆栈跟踪中获得更多信息。它可能是原始的源文件,也可能是由于文件下载代码中的错误。
  • 请添加图片链接。您可能需要更改代码,以便将堆栈跟踪打印到日志中,而不仅仅是异常消息。
  • 听起来您的图像实际上是被错误标记为 PNG 的 JPEG。前几个字节是什么样的(xxd file.png | head -10 的结果)?
  • @GlennRanders-Pehrson 看来你很准。但是,我不明白该文件如何产生PNGImageReader 中提到的异常,因为ImageIO 将通过检查字节来查找合适的阅读器,not 按文件扩展名。在那些看起来像 PNG 的字节中没有任何内容。

标签: java spring-boot png bufferedimage javax.imageio


【解决方案1】:

请检查您传递的文件扩展名。应该是 PNG。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    相关资源
    最近更新 更多