5

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

4

3 回答 3

3

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

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

希望这可以帮助!

于 2011-05-17T00:44:33.613 回答
3

我以前使用过 jmagick 并取得了很好的效果,但是让它在不同的环境中工作可能很麻烦(把罐子放在正确的地方,确保你有正确的 imagemagick 构建等)。

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

于 2012-03-30T14:16:40.930 回答
1

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

于 2011-05-17T00:38:22.733 回答