我正在尝试使用Image Voodoo插件在JRuby / Rails应用程序中为上传的图像创建缩略图 - 问题是调整大小的缩略图看起来像......屁股。
生成缩略图的代码似乎绝对正确地将插值渲染提示设置为“bicubic”,但它并没有在我们的开发环境(OS X)或生产Web服务器上表现出来(Linux)的
我已经提取出代码来生成缩略图,将其重写为直接的Java应用程序(即从main()方法开始),插值呈现提示明确设置为“bicubic”,并且已经复制了(缺乏双三次和双线性调整大小。
正如在OS X和Linux上所预料的那样,thumbanils是丑陋和像素化的,但在Windows上,它使用双三次插值很好地调整了图像的大小。
是否有任何JVM环境设置和/或我缺少的其他库才能使其正常工作?对于这个,我正在做很多撞墙的事。
答案 0 :(得分:5)
我意识到这个问题是在不久前被问到的,但其他任何人仍然遇到这个问题。
缩略图看起来像屁股的原因是由两件事(主要是第一件)引起的:
事实证明旧的AreaAveragingScaleFilter在制作漂亮的缩略图方面做得不错,但是Java2D团队很慢并且不赞成 - 不幸的是他们并没有用任何好的替代品取而代之。这个替代方案让我们自己独立。
几年前,Chris Campbell(来自Java2D团队)使用增量扩展的概念解决了这个问题 - 而不是在一次操作中从您的起始分辨率转到目标分辨率,而是逐步完成,结果看起来如此好多了。鉴于此代码非常大,我将所有最佳实践编写到名为imgscalr的库中,并在Apache 2许可下发布。
最基本的用法如下:
BufferedImage img = ImageIO.read(...); // load image
BufferedImage scaledImg = Scalr.resize(img, 640);
在这个用例中,库使用所谓的“自动”缩放模式,并且在640x640的边界框内适合生成的图像(尊重它的比例)。因此,如果图像不是正方形并且是标准的4:3图像,它会将其大小调整为640x480 - 参数只是它的最大尺寸。
Scalr class上有许多其他方法(所有静态且易于使用),可让您控制所有内容。
对于可能的最佳缩略图,命令看起来像这样:
BufferedImage img = ImageIO.read(...); // load image
BufferedImage scaledImg = Scalr.resize(img, Method.QUALITY,
150, 100, Scalr.OP_ANTIALIAS);
Scalr.OP_ANTIALIAS是可选的,但是很多用户认为当你缩小到Java中足够小的缩略图时,像素值之间的某些过渡有点太离散并且使图像看起来“清晰”,所以很多用户都想要一种软化缩略图的方法。
这是通过ConvolveOp来完成的,如果你以前从未使用过它们,那么试图弄清楚要使用的“内核”是......痛苦的屁股。 OP_ANTIALIAS常量在类上定义它是我看到最好看的抗锯齿操作,经过一周的测试后发现,另一个用户已将imgscalr部署到他们在巴西的社交网络中(用于缩放配置文件照片)。我把它包括在内让每个人的生活变得更轻松。
此外,在所有这些示例的基础上,你可能已经注意到当你缩放GIF和一些其他类型的图像(BMP)时,有时缩放的结果看起来比原始的可怕......这是因为图像在支持不佳的BufferedImage类型和Java2D使用它的软件渲染管道而不是硬件加速管道,以获得更好的支持图像类型。
imgscalr将为您处理所有这些,并将图像保持在支持最佳的图像类型,以避免这种情况。
无论如何,这是一个非常漫长的说法,“你可以使用imgscalr为你做所有这些,而不必担心任何事情。”
答案 1 :(得分:0)
也许这是一个解决方案:
public BufferedImage resizeImage(BufferedImage source, int width, int height)
{
BufferedImage result = new BufferedImage(widht, height, BufferedImage.TYPE_INT_ARGB);
Graphics g = result.getGraphics();
g.drawImage(source, 0, 0, widht, height, null);
g.dispose();
return result;
}
答案 2 :(得分:0)
最后,升级到最新版本的ImageVoodoo似乎可以提高质量。
查看源代码,看起来他们正在做一些时髦的AWT渲染,然后将其拉出来。讨厌,但似乎有效。
仍然不如ImageMagick好,但比它好。
答案 3 :(得分:0)
@Riyad,增量扩展的代码不是“相当大”,它非常小(正如您在2007年的帖子中看到的,http://today.java.net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance.html#creating-scaled-instances)拥有一个提供其他选项的库可能会有用,但是让图书馆使用图书馆是无稽之谈。