如何在不加载到内存的情况下调整图像大小?

我想检查图像的尺寸,然后在宽度超过给定阈值时调整尺寸。 当我使用ImageIO.read()加载6MB JPEG图像时,BufferedImage会分配大约45MB的堆空间。 有没有办法在不将所有数据加载到内存中的情况下调整直通图像大小? 我尝试传递ImageIO.read()一个File对象,认为它会从磁盘流式传输数据,但它没有帮助。

看看im4java和JMagick 。 两者都使用名为ImageMagick的极其高效的外部工具进行图像处理。 Im4Java调用命令行应用程序(确实在单独的进程中工作),JMagick通过JNI在同一进程中调用它。

如果我正在进行简单的图像处理(resize,缩放,旋转等),我宁愿让ImageMagick为我做。 与在相似时间内实现的任何内容相比,它将更快,更可靠并且消耗更少的内存。

希望这可以帮助!

我之前使用过jmagick并取得了很好的效果,但是要让它在不同的环境中工作(将jar放在正确的位置,确保你有正确的imagemagick构建等)可能很繁琐。

您可能需要考虑使用imgscalr(http://www.thebuzzmedia.com/software/imgscalr-java-image-scaling-library)。 它是Apache 2.0许可下提供的开源纯Java图像处理库。 很多(很多……)比那些可怕的Java2D东西更容易使用和更快。

您可以使用ImageInfo检查图像的宽度和高度,而无需将其加载到内存中。 我不知道一个库,它允许你重新resize而不在内存中加载图像。 45MB真的不是那么多内存。 你能增加你的堆大小吗?