【问题标题】:How to resize an image without loading into memory?如何在不加载到内存的情况下调整图像大小?
【发布时间】:2011-08-26 20:48:39
【问题描述】:

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

【问题讨论】:

    标签: java graphics 2d javax.imageio


    【解决方案1】:

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

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

    希望这会有所帮助!

    【讨论】:

    • 谢谢本。我将查看适用于 Java 的 ImageMagick 库。
    • 同意本;如果高效是您需要的方式,那么使用本机解决方案并使用 Java 调用可能是唯一可行的方式。调整图像大小实际上是一种重采样操作;你无法避免它。重采样需要一个缩减算法来挑选和平均像素值;在 Java 中的“块”中执行此操作将需要大量自定义代码在 ImageReadParam 之上一次拉入部分,对它们进行采样并有效地组合结果。简而言之,它会suck
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • “45MB 也不算多”...取决于您的目标平台。
      • 听听! 45MB 对于高并发和内存受限的设备来说是不行的!
      • 真的。如果您的目标平台不允许您加载 45 MB,您可以考虑在单独的服务器上进行图像缩放。
      • 如果您有单独的服务器可用。你过着被宠坏的生活,丹尼斯 :)
      • 代码将在高可用性服务器中运行。我不能冒用户尝试转换巨大图像(即比我使用的测试文件大得多)而导致整个服务器瘫痪的风险。
      猜你喜欢
      • 2010-12-05
      • 2018-05-20
      • 1970-01-01
      • 2011-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多