如何在没有Java内存的情况下从大图像中删除图像元数据

时间:2016-05-06 01:47:38

标签: java

我需要从图像中删除元数据,但是当图像太大时我会得到OOM。 现在我正在使用ImageIO。

BufferedImage image = ImageIO.read(new File("image.jpg"));
ImageIO.write(image, "jpg", new File("image.jpg"));

问题是 ImageIO.read(...)会将整个文件读入内存,当我处理太大的图像时会导致OutOfMemory。

我可以尝试使用CommonsImaging(https://commons.apache.org/proper/commons-imaging/sampleusage.html),但看起来它只支持JPEG(ExifRewriter类)。

更改VM的内存配置不是一个选项,我需要支持的不仅仅是JPEG文件。

任何想法如何做到这一点,而不会导致内存不足?

1 个答案:

答案 0 :(得分:-1)

您可以通过流媒体制作图像副本来尝试,在流式传输过程中应用过滤器来删除元数据。

复制可以按如下方式进行:

    InputStream is = null;
    OutputStream os = null;
    try {
        // Source and Destination must be different 
        is = new FileInputStream(new File("path/to/img/src"));
        os = new FileOutputStream(new File("path/to/img/dest"));

        // Limit buffer size further is necessary!
        byte[] buffer = new byte[1024];
        int length;
        while ((length = is.read(buffer)) > 0) {
            // Apply removal of metadata here!!!
            os.write(buffer, 0, length);
        }
    } finally {
        is.close();
        os.close();
    }

请注意原始版本和克隆版本可以相同,因此可能需要删除原始文件并在之后重命名目标文件(如果您希望它们相同)。

您可以创建自己的outputstream而不是正常的FilteredOutputstream,而是使用它。