答案 1
Phil,我不知道你最终选择了哪种解决方案,但是如果你:
- 避免使用 JDK 不能很好地支持的 BufferedImage 类型。
- 使用增量扩展
- 使用增量扩展时坚持使用双三次
我已经用这些方法做了相当多的测试,增量缩放以及坚持支持良好的图像类型是关键 - 我看到亚历山大提到他仍然没有得到好运气,这是一个令人沮丧的事情。
大约6个月前,我发布了imgscalr库(Apache 2),以解决“我想要这个图像的好看的缩放副本,现在就做!”的问题,在阅读了SO上的10个类似问题之后。
标准用法如下所示:
BufferedImage img = ImageIO.read(...); // load image
BufferedImage scaledImg = Scalr.resize(img, 640);
第二个参数是imgscalr将用于缩放图像的边界宽度和高度 - 即使您在无效维度中传递,也保持其比例正确 - 有许多更详细的方法,但这是最简单的用法。
您想要的用例,例如,如果Facebook将图像限制为800x600像素,将如下所示:
BufferedImage img = ImageIO.read(...); // load image
BufferedImage scaledImg = Scalr.resize(img, Method.QUALITY, 800, 600);
这将确保图像保持在最佳支持的图像类型中,并使用Java可以聚集的最高质量方法进行缩放。
在我自己的高分辨率测试中,我没有注意到使用此库/这些方法缩放图像的任何巨大差异,除非您的图像被ImageIO加载程序放入支持不佳的图像类型中 - 例如,GIF经常发生这种情况。如果你像这样离开它们,不把它们从那些支持不足的类型中解救出来,它最终会看起来非常犹豫不决和可怕。
这样做的原因是,Java2D团队实际上为JDK可以处理的所有不同类型的BufferedImages提供了不同的硬件加速管道 - 这些不太常见的图像类型的子集都回退到在Java2D的掩护下使用相同的软件渲染管道,导致图像看起来很差,有时看起来完全不正确。这是一个这样的PIA来解释和尝试弄清楚,我只是将这个逻辑直接写入了图书馆。
两种最受支持的类型是BufferedImage.TYPE_INT_RGB,如果您好奇,_ARGB。
推荐
-
-
如何在Java中从URL中读取图像? 我的Web应用程序中有servlet来提供图像,当我访问那些带有浏览器图像的URL时,服务器是正确的。然后我有另一个调整图像大小的servlet,想法是在调整大小servlet中访问通过URL获取图像,然后调整
-
在 Java 中缩放图像的最佳方法是什么? 我有一个用Java编写的Web应用程序(Spring,Hibernate / JPA,Struts2),用户可以在其中上传图像并将其存储在文件系统中。我想缩放这些图像,以便它们具有一致的大小,以便在网站上显示。哪些库
-
-
将 JPanel 图形导出到.png、.gif或.jpg 我正在尝试使用Java开发某种油漆。 我有一个位于JPanel内部的JComponent。 我已经可以在JComponent中绘制线条和矩形。 现在,如何将此图形导出为图像(png,gif,jpg)? 我试过这个: