使用 Java 库 imgsclr 调整大小的图像质量问题

Image quality issues using Java library imgsclr to RESIZE

当我仅尝试使用 imgsclr 4.2(http://www.thebuzzmedia.com/imgscalr-3-2-released/comment-page-1/#comment-650387).

将图像调整为特定的宽度和高度时,我遇到了质量问题

我有一张 240X320 的图片,我必须将其大小调整为 50X75 和 120X180。我使用以下代码分别尝试了两者(我使用的是 imgscalr 4.2)。

image=resize(image,Method.ULTRA_QUALITY, 50,75, OP_ANTIALIAS, OP_BRIGHTER);
saveImage(image, ImageFormatTypes.JPEG, DESTINATION + RESIZED_IMAGE + “.”+ImageFormatTypes.JPEG);

我有两个问题。与我用来手动调整图像大小的其他内部工具相比,#1 的质量非常低。 #2。输出的宽度从 50 增加到 56,从 120 增加到 135,这很奇怪。

你知道为什么会这样吗?我感谢您的帮助。

我认为核心问题不在于imgsclr,而在于选择jpg。请记住,jpg 使用基于损失的算法,转储部分图像以减小其大小。

为了对比,下面两张图是用同样的方法制作的,但是左边是用jpg输出,右边是用png输出(用ImageIO API)

所以最上面的图片是同一张主图片。

第二行是使用 ULTRA_QUALITYAUTOMATICBALANCEDQUALITY 方法的 imgsclr。第二行的最后一张图片使用 SPEED

最后一行是一系列 "other" 缩放方法。前两个使用分而治之的方法,将图像除以 2,直到达到所需的大小,演示 here。第一个是 "to fill",另一个是 "to fit"(一个会溢出可用的 space,一个会适合)。第三张图片使用的是 Image#getScaledInstance 我好像在某处引入了 alpha 通道,因此 jpg 版本是红色的,但我是在比较质量 ;)

尺寸增加的原因可能归结为 imgsclr 试图保持图像的纵横比

最后...

这个比较BufferedImageOp,从右到左使用OP_BRIGHTEROP_ANTIALIASOP_BRIGHTEROP_ANTIALIAS、none...

这些以 PNG 格式输出