图像调整大小质量(Java)

14 java jpeg resize photo image

我有一个开源应用程序,可以将照片上传到Facebook.为了节省带宽,照片会在上传前自动调整大小(Facebook规定了最大大小限制).有些人抱怨照片质量,事实上你可以看到差异(对于一些演示图像,请参阅此问题).

所以我的问题是,在不降低质量的情况下缩小Java中的图像(即照片)的"最佳"方法是什么,或者至少在质量损失/伪影最小的情况下?

您可以在此处查看我当前的代码(通过此页面调整代码大小).

Riy*_*lla 16

Phil,我不知道你最终选择了哪种解决方案,但是如果您:使用Java缩放图像看起来相当不错:

  • 避免使用JDK不支持的BufferedImage类型.
  • 使用增量缩放
  • 使用增量缩放时,请坚持使用bicubic

我已经做了这些方法和增量扩展一起坚持以及支持的图像类型的测试的公平份额的关键所在 - 我看到亚历山大提到他仍然没有得到它的好运气这是一个令人失望.

我大约6个月前发布了imgscalr库(Apache 2),以解决"我想要这个图像的好看的缩放副本,现在就做好!"的问题.在读完类似10个这样的问题之后.

标准用法如下:

BufferedImage img = ImageIO.read(...); // load image
BufferedImage scaledImg = Scalr.resize(img, 640);
Run Code Online (Sandbox Code Playgroud)

第二个参数是边界宽度和高度imgscalr将使用缩放图像-保持它的比例,即使你在尺寸无效传递正确的-还有很多更详细的方法,但是这是最简单的用法.

您想要的用例,例如,如果Facebook限制图像为800x600像素,将如下所示:

BufferedImage img = ImageIO.read(...); // load image
BufferedImage scaledImg = Scalr.resize(img, Method.QUALITY, 800, 600);
Run Code Online (Sandbox Code Playgroud)

这将确保图像保持最佳支持的图像类型,并使用Java可以集合的最高质量方法进行缩放.

在我自己的高分辨率测试中,我没有注意到使用此库/这些方法与缩放图像之间存在任何差距.例如,当您的图像被ImageIO加载器放入支持不良的图像类型时 - 例如,GIF会发生这种情况很多.如果你这样离开他们,并且不让他们脱离那些支持不好的类型,它最终看起来真的很眩晕和可怕.

这样做的原因是Java2D团队实际上为JDK可以处理的所有不同类型的BufferedImages提供了不同的硬件加速流水线 - 这些不常见的图像类型的子集都可以归结为使用相同的软件渲染管道.覆盖Java2D,导致图像质量差,有时完全不正确.这是一个PIA来解释并试图找出我刚刚将该逻辑直接写入库中.

如果您好奇,两个最受支持的类型是BufferedImage.TYPE_INT_RGB和_ARGB.

  • @WowBow啊!是的我想我知道发生了什么...我讨厌imgscalr还没有将它从开发中抽象出去,但是它对原始像素值进行操作 - 当你用ImageIO将图像写回来时,它正在使用DEFAULT JPG编码器设置,设置为75%质量我相信 - 你必须谷歌"java ImageIO JPEG质量"的例子代码如何设置,说95%.测试是否是这种情况的"便宜又简单"的方法,将图像写成PNG(losssles格式) - 如果它看起来"更好",那就是它. (2认同)

Ale*_*ing 12

我已经尝试了所有这些 - 包括这里的技巧,而且我可以说你最好在任何界面上使用ImageMagick,Javas成像库在这方面都不合适.您需要支持如此多的格式和算法才能使其正确.

  • 这也是我的结论!Java 图像 API 太糟糕了!我可以解决缓慢的问题,但糟糕的图像质量是无法接受的!我确实希望相关的 api 能够与 JavaFX 2.0 一起获得一些急需的 tlc。 (2认同)

pat*_*ckf 6

目前专门用于java中图像大小调整的两个最流行的开源库是:

Additonal有Java的JDK方式Graphics2D(参见关于如何做的这个问题),这种方法很难创建不好的结果,尤其是降尺度.ImageMagick还有一个Java接口,这里将省略它,因为它需要一个外部工具.

视觉质量

这是对580x852png 调整大小/缩减结果的比较145x213.作为参考,使用Photoshop CS5"save for web"调整大小.注意:结果是1:1 libs创建的只是复制在一起的内容.缩放不使用任何过滤,只是一个简单的最近邻居算法. 在这里你可以找到原始图像.

对照

  1. Thumbnailator 0.4.8具有默认设置,无尺寸调整
  2. Photoshop CS5采用双三次算法
  3. imgscalr 4.2,ULTRA_QUALITY设置,无尺寸调整
  4. Graphics2D(Java 8),带渲染提示VALUE_INTERPOLATION_BICUBIC,VALUE_RENDER_QUALITY,VALUE_ANTIALIAS_ON

我留给读者选择最好的结果,因为这是主观的.一般情况下,都有着良好的除外输出Graphics2D.Thumbnailator生成更清晰的图像,非常类似于Photoshop输出,而imgscalr的输出则相当柔和.对于图标/文本等,您需要更清晰的输出,对于图片,您可能需要更柔和的输出.

计算时间

以下是使用此工具的非科学基准测试和114幅图像,尺寸从大约96x962560x1440425%的图像创建:100%,150%,200%,300%和400%缩放版本(所以114*5缩放操作).所有库都使用与质量比较相同的设置(因此可能具有最高质量).时间只是缩放而不是整个过程.在i5-2520M上完成8GB Ram和5次运行.

  • Thumbnailator:7003.0ms | 6581.3ms | 6019.1ms | 6375.3ms | 8700.3ms
  • imgscalr:25218.5ms | 25786.6ms | 25095.7ms | 25790.4ms | 29296.3ms
  • Graphics2D:7387.6ms | 7177.0ms | 7048.2ms | 7132.3ms | 7510.3ms

以下是此基准测试中使用的代码.

有趣的是,Thumbnailator也是最快的,平均时间为6.9秒,其次是Java2D,7.2秒,留下imgscalr,差26.2秒.这可能是不公平的,因为imgscalr设置为ULTRA_QUALITY似乎非常昂贵; 与QUALITY在一个更具有竞争力11.1秒设置它的平均值.


小智 5

要使用自定义质量调整图像大小,请使用thumbnailator.jar.

示例代码 http://code.google.com/p/thumbnailator/wiki/Examples