Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 异常:读取PNG头时发生I/O错误!用于图像读取大小_Java_Spring Boot_Png_Bufferedimage_Javax.imageio - Fatal编程技术网

Java 异常:读取PNG头时发生I/O错误!用于图像读取大小

Java 异常:读取PNG头时发生I/O错误!用于图像读取大小,java,spring-boot,png,bufferedimage,javax.imageio,Java,Spring Boot,Png,Bufferedimage,Javax.imageio,这是我的代码: private Rectangle getImageUriImageSize(String uri) { Matcher matcher = dataUriPattern.matcher(uri); if (!matcher.find()) return null; byte[] bytes = DatatypeConverter.parseBase64Binary(matcher.group(2)); ByteAr

这是我的代码:

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!
我改变了这个建议

但这次我犯了错误。我使用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;
    }

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

请编辑您的问题,并添加完整的堆栈跟踪和导致异常的图像链接。还有,我不清楚为什么你需要3种不同的方法来做这件事。。。它们是否都因相同的异常而失败?第三个版本将是最快的,因为它只需要读取标题,而不需要解码像素数据。PS:检查了源代码PNGImageReader,PNG似乎已损坏。您应该从堆栈跟踪中获得更多信息。它可能是原始源文件,也可能是由于文件下载代码中的错误。请添加图像链接。您可能需要更改代码,以便它将堆栈跟踪打印到日志中,而不仅仅是异常消息。听起来您的图像实际上是一个JPEG错误标记为PNG。xxd file.png | head-10的前几个字节看起来像什么?@GlennRanders Pehrson似乎你是对的。但是,我不理解该文件如何产生PNGImageReader中提到的异常,因为ImageIO将通过检查字节而不是文件扩展名来查找合适的读取器。这些字节中没有任何内容看起来像PNG。
 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);
    }