gpt4 book ai didi

java - 如何在 Java 中从大图像中删除图像元数据而不导致内存不足

转载 作者:行者123 更新时间:2023-12-02 07:38:12 24 4
gpt4 key购买 nike

我需要从图像中删除元数据,但当图像太大时,我会遇到 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 类)。

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

有什么想法可以做到这一点而不导致内存不足吗?

最佳答案

您可以通过流式传输复制图像来尝试,并在流式传输期间应用过滤器来删除元数据。

复制可以按如下方式完成:

    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并使用它。

关于java - 如何在 Java 中从大图像中删除图像元数据而不导致内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37062959/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com