Java Image Filters 提供一个用来处理图像缩放的 Filter 类:ScaleFilter,用法如下:
BufferedImage bi_src = ...;
ImageIO.write(new ScaleFilter(100,100), "jpeg", dest);
但在使用中发现图像缩小后质量比较差,有很多的锯齿,如下图所示:
打开 ScaleFilter 代码后:
public class ScaleFilter extends AbstractBufferedImageOp {
private int width;
private int height;
/**
* Construct a ScaleFilter.
*/
public ScaleFilter() {
this(32, 32);
}
/**
* Construct a ScaleFilter.
* @param width the width to scale to
* @param height the height to scale to
*/
public ScaleFilter( int width, int height ) {
this.width = width;
this.height = height;
}
public BufferedImage filter( BufferedImage src, BufferedImage dst ) {
if ( dst == null ) {
ColorModel dstCM = src.getColorModel();
dst = new BufferedImage(dstCM, dstCM.createCompatibleWritableRaster( width, height ),
dstCM.isAlphaPremultiplied(), null);
}
Image scaleImage = src.getScaledInstance( width, height, Image.SCALE_AREA_AVERAGING );
Graphics2D g = dst.createGraphics();
g.drawImage( scaleImage, 0, 0, width, height, null );
g.dispose();
return dst;
}
public String toString() {
return "Distort/Scale";
}
}
这里可以看出,它使用的是一种折中的图像质量处理方法 (Image.SCALE_AREA_AVERAGING) ,只要将这个值改为 Image.SCALE_SMOOTH,就可以质量较高的图像,而且图像文件并没有变大,如下图:
你可以重写一个 MyScaleFilter 的类进行处理,省却修改原有代码。