java - 如何在使用 ImageIO.read() 时解决 'java.io.EOFException: Unexpected end of ZLIB input stream'

标签 java javax.imageio eofexception

the png

我可以打开 png,但使用代码读取失败。异常(exception)的是 “java.io.EOFException:ZLIB 输入流意外结束”,第 4 行使用 ImageIO.read() 函数。

我使用相同的代码成功读取了其他png。

public static void cut(String srcImageFile, String result, int x, int y, int width, int height) {
    try {
        // 读取源图像
        BufferedImage bi = ImageIO.read(new File(srcImageFile));
        int srcWidth = bi.getHeight(); // 源图宽度
        int srcHeight = bi.getWidth(); // 源图高度
        if (srcWidth > 0 && srcHeight > 0) {
            Image image = bi.getScaledInstance(srcWidth, srcHeight, Image.SCALE_DEFAULT);
            // 四个参数分别为图像起点坐标和宽高
            // 即: CropImageFilter(int x,int y,int width,int height)
            ImageFilter cropFilter = new CropImageFilter(x, y, width, height);
            Image img = Toolkit.getDefaultToolkit()
                    .createImage(new FilteredImageSource(image.getSource(), cropFilter));
            BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            Graphics g = tag.getGraphics();
            g.drawImage(img, 0, 0, width, height, null); // 绘制切割后的图
            g.dispose();
            // 输出为文件
            ImageIO.write(tag, "PNG", new File(result));
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

请告诉我如何解决这个问题。

最佳答案

如果您在 Chrome 或其他工具中打开图像,您会看到图像的下半部分(二维码的一部分)丢失,或者只是黑色。这是因为 PNG 文件确实已损坏,或者看起来被截断。除了获取文件的新副本而不进行截断之外,没有其他方法可以“解决”此问题。

但是,可以使用 Java 来部分读取 PNG 文件,就像在其他工具中一样。它只是无法使用 ImageIO.read(...) 便捷方法来完成,因为您将收到异常并且没有返回值。

相反,请使用完整的详细代码:

BufferedImage image;

try (ImageInputStream input = ImageIO.createImageInputStream(file)) {
    ImageReader reader = ImageIO.getImageReaders(input).next(); // TODO: Handle no reader case

    try {
        reader.setInput(input);

        int width = reader.getWidth(0);
        int height = reader.getHeight(0);

        // Allocate an image to be used as destination
        ImageTypeSpecifier imageType = reader.getImageTypes(0).next();
        image = imageType.createBufferedImage(width, height);

        ImageReadParam param = reader.getDefaultReadParam();
        param.setDestination(image);

        try {
            reader.read(0, param); // Read as much as possible into image
        }
        catch (IOException e) {
            e.printStackTrace(); // TODO: Handle
        }
    }
    finally {
        reader.dispose();
    }
}

// image should now contain the parts of the image that could be read

关于java - 如何在使用 ImageIO.read() 时解决 'java.io.EOFException: Unexpected end of ZLIB input stream',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56964362/

相关文章:

java - 如何在selenium中上传多个文件进行验证?

java - 文件最后一行的 EOFException 的 datainputstream

java - 读取图像时如何保持透明度不变? ( java )

java - 如何正确测试java中的instanceof

java - 建立 SSL 连接时出现 EOFException 错误

java - string.length 在 java 中不能正常工作

java - 多次实例化默认类加载器

java - 仅在 Java 中生成随机 "dark"颜色

java - 使用 "ImageIO.write()"API 调用我得到 NullPointerException

java - ImageIO.write 不保存为 gif,但适用于 jpgs 和 pngs?