场景描述
为便于知识共享,经常需要在word中编写帮助文档,然后导出为html格式,发布到web服务;
如果word中有图片,导出的图片文件文件一般在500kb以上,通过web浏览时非常耗时;
一般的做法是通过QQ影像
软件,打开每一个图片进行一键美化,然后覆盖原有图片,这时文件大小一般能缩小一个数量级,一般在50kb左右,基本能够满足要求,虽然一个个打开修改比较繁琐,但是能用,就忍了;
但是,今天突然发现QQ影像
抽风,另存为时卡死,试了几次都是这样,如是终于忍无可忍;
经过一番研究,发现java通过thumbnailator
包可以实现图片压缩功能,共享实现流程如下:
技术实现
添加maven依赖
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
</dependency>
java代码实现
import java.io.File;
import java.io.IOException;
import java.util.Date;
import net.coobird.thumbnailator.Thumbnails;
/**
* 图片批量压缩
*
* @author hury
* @version 2020-03-02 15:46:03
*/
public class ImageCompressor {
public static void main(String[] args) {
batchCompress("d:/test1", "d:/test2");
System.out.println("压缩完成!");
}
/**
* 批量压缩图片
*
* @param srcFolder
* 源目录
* @param targetFolder
* 目标目录
*/
public static void batchCompress(String srcFolder, String targetFolder) {
if (srcFolder.equalsIgnoreCase(targetFolder)) {
System.out.println("出于安全原因,源路径不能与目标路径相同!");
return;
}
if (!targetFolder.endsWith("/")) {
targetFolder += "/";
}
System.out.println("源目录:" + srcFolder);
System.out.println("目标目录:" + targetFolder);
File file = new File(srcFolder);
int i = 0;
Date start = new Date();
if (file.exists()) {
File[] files = file.listFiles();
if (null != files) {
for (File f : files) {
if (f.isFile()) {
System.out.println("正在转换文件:" + (++i) + "\t" + f.getAbsolutePath());
compressImage(f.getAbsolutePath(), targetFolder + f.getName());
}
}
}
}
long duration = (new Date()).getTime() - start.getTime();
System.out.println("耗时:" + (duration) + "毫秒");
}
/**
* 压缩图片
*
* @param srcPath
* 源文件路径
* @param toPath
* 目标文件路径
*/
public static void compressImage(String srcPath, String toPath) {
try {
// scale:调整图片尺寸,1 表示图片尺寸不变;
// outputQuality:压缩图片文件质量,参数1为最高质量
Thumbnails.of(srcPath).scale(1f).outputQuality(0.25f).toFile(toPath);
} catch (IOException e) {
e.printStackTrace();
}
}
}
执行日志
小结
实际应用中,可以通过调整输出质量参数(outputQuality),达到不同的压缩比与质量。