如何调整图像大小而不加载到内存中?

时间:2011-05-17 00:28:49

标签: java graphics 2d javax.imageio

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

3 个答案:

答案 0 :(得分:3)

结帐im4javaJMagick。两者都使用一种非常有效的外部工具ImageMagick进行图像处理。 Im4Java调用命令行应用程序(确实在单独的进程中工作),JMagick通过JNI在同一进程中调用它。

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

希望这有帮助!

答案 1 :(得分:3)

我之前使用过jmagick并获得了出色的效果,但是在不同的环境中工作(将罐子放在正确的位置,确保你有正确的imagemagick构建等)可能很繁琐。 / p>

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

答案 2 :(得分:1)

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

相关问题