问题描述
我想将图像从239x210缩放到22x19,我正在使用Thumbnailator:
public BufferedImage process(BufferedImage bufferedImage,CanvasData canvasData) {
int imageSize = (canvasData.getDensity() * canvasData.getSize()) / 10;
try {
bufferedImage = Thumbnails.of(bufferedImage)
.imageType(BufferedImage.TYPE_INT_RGB)
.size(imageSize,imageSize)
.outputQuality(1)
.asBufferedImage();
} catch (IOException e) {
e.printstacktrace();
}
return bufferedImage;
}
Gimp ||| Original ||| Thumnailator
我希望获得与gimp相同的输出,但是我不知道该如何实现。
解决方法
正如乔普(Joop)在评论中提到的那样,图像质量较差的主要原因是因为与GIMP的输出相比,compression artifacts有很多。
这是因为您正在使用outputQuality
方法来控制输出的压缩率,但不是将缩略图写入文件,而是通过{{1}写入BufferedImage
}方法。
如果您仔细查看outputQuality
method的文档,会发现它提到此方法对最终图像没有任何影响。
因此,您有两个选择:
-
使用Thumbnailator的一种输出方法写入
asBufferedImage
或File
,以便获得JPEG流,该格式遵循OutputStream
设置。outputQuality(1.0)
,toFile
,asFile
,toOutputStream
方法将是您使用此选项的方法。 -
如果必须输出到
asOutputStream
,则需要配置任何内容,如果实际写那个BufferedImage
来以较低的压缩率写JPEG -这是在外部发生的您提供的代码段中的一个。
我建议使用选项1,因为似乎是在向Thumbnailator传达您想要最小压缩的JPEG的意图,因此让Thumbnailator将JPEG写入文件或流中很有意义。
免责声明:我是Thumbnailator库的维护者。