Java代码按比例缩放图片

参考:Java按比例缩放图片

最近服务端需要对上传的图片进行裁剪,在网上寻找Java代码裁剪图片的例子,找到了这个,并且用在了实际代码中,效果还不错。
摘到此处作为备份。

1.按照固定长宽进行缩放:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/**
* @param src 源文件
* @param dest 缩放后存放的目录
* @param w 缩放后的宽度
* @param h 缩放后的高度
* */
public static void zoomImage(String src, String dest, int w, int h) throws Exception {

double wr=0,hr=0;
File srcFile = new File(src);
File destFile = new File(dest);

BufferedImage bufImg = ImageIO.read(srcFile); //读取图片
Image Itemp = bufImg.getScaledInstance(w, h, bufImg.SCALE_SMOOTH);//设置缩放目标图片模板

wr=w*1.0/bufImg.getWidth(); //获取缩放比例
hr=h*1.0 / bufImg.getHeight();

AffineTransformOp ato = new AffineTransformOp(AffineTransform.getScaleInstance(wr, hr), null);
Itemp = ato.filter(bufImg, null);
try {
ImageIO.write((BufferedImage) Itemp,dest.substring(dest.lastIndexOf(".")+1), destFile); //写入缩减后的图片
} catch (Exception ex) {
ex.printStackTrace();
}
}

我们在实际项目中使用的上述的方法把大图片按照指定的宽和高进行裁剪,效果还可以。

2.按照文件的大小进行裁剪

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**
* 图片按文件大小
* @param src 原文件
* @param dest 缩放后的存放目录
* @param size 文件的大小
* */
public static void zoomImage(String src, String dest, Integer size) throws Exception {
File srcFile = new File(src);
File destFile = new File(dest);

long fileSize = srcFile.length();
if(fileSize < size * 1024) //文件大于size k时,才进行缩放
return;

Double rate = (size * 1024 * 0.5) / fileSize; // 获取长宽缩放比例

BufferedImage bufImg = ImageIO.read(srcFile);
Image Itemp = bufImg.getScaledInstance(bufImg.getWidth(), bufImg.getHeight(), bufImg.SCALE_SMOOTH);

AffineTransformOp ato = new AffineTransformOp(AffineTransform.getScaleInstance(rate, rate), null);
Itemp = ato.filter(bufImg, null);
try {
ImageIO.write((BufferedImage) Itemp,dest.substring(dest.lastIndexOf(".")+1), destFile);
} catch (Exception ex) {
ex.printStackTrace();
}
}

这个方法有一点问题,就是当图片特别大,而规定的尺寸比较小时,比如原图是1M,而小图规定20K的时候,效果不是特别好,压缩的太小了。