在 Java 中缩放图像的最佳方法是什么?

我有一个用Java编写的Web应用程序(Spring,Hibernate / JPA,Struts2),用户可以在其中上传图像并将其存储在文件系统中。我想缩放这些图像,以便它们具有一致的大小,以便在网站上显示。哪些库或内置函数将提供最佳结果?在做出决定时,我将考虑以下标准(按此顺序):

  • 免费/开源(必备)
  • 易于实施
  • 结果质量
  • 性能
  • 可执行文件的大小

答案 1

我真的建议给imgscalr一个看。

它是在Apache 2许可证下发布的,托管在GitHub上,已经部署在少数几个Web应用程序中,具有非常简单但有学问的API,其代码可以围绕JDK中的2个主要图像错误透明地工作,只有当你在缩放操作或可怕的结果后突然开始获得“黑色”图像时,你才会注意到, 为您提供Java中最好的结果,可通过Maven和ZIP获得,并且只是一个类。

基本用法如下所示:

BufferedImage img = ImageIO.read(...); // load image
BufferedImage scaledImg = Scalr.resize(img, 320);

这是最简单的调用,其中库将对质量进行最佳猜测,尊重图像比例,并将结果拟合到320x320边界框中。请注意,边界框只是使用的最大W / H,由于您的图像比例是可取的,因此生成的图像仍将遵循该比例,例如320x200。

如果您想覆盖自动模式并强制它为您提供最好看的结果,甚至对结果应用非常温和的抗锯齿过滤器,使其看起来更好(特别是对于缩略图),则该调用将如下所示:

BufferedImage img = ImageIO.read(...); // load image
BufferedImage scaledImg = Scalr.resize(img, Method.QUALITY, 
                                       150, 100, Scalr.OP_ANTIALIAS);

这些都只是示例,API很广泛,涵盖了从超级简单的用例到非常专业的所有内容。您甚至可以将自己的BufferedImageOps传递到图像中(并且该库会自动为您修复6年的BufferedImageOp JDK错误!

在 Java 中成功缩放映像比库对您执行的操作要多得多,例如,在对映像进行操作时始终将映像保留在最受支持 RGB 或 ARGB 映像类型之一。在幕后,如果用于任何图像操作的映像类型支持不力,Java2D 图像处理管道将回退到较差的软件管道。

如果这一切听起来像是很多头痛,那有点像......这就是为什么我编写了库并开源了它,这样人们就可以调整图像的大小并继续他们的生活,而不必担心它。

希望有所帮助。


答案 2

查看用于读取/写入映像的 Java 映像 I/O API。然后使用 AffineTransform 调整大小。

另外,这里有一个使用java.awt.Image的完整示例。


推荐