在 Spring Boot 开发过程中,常常遇到图片处理的情况,我推荐使用 Thumbnailator 图片处理库。
Thumbnailator 是一个优秀的图片处理的开源 Java 类库,处理效果极好,从API提供现有的图像文件和图像对象的类中简化了处理过程,两三行代码就能够从现有图片生成处理后的图片,且允许微调图片的生成方式,同时保持了需要写入的最低限度的代码量。还支持对一个目录的所有图片进行批量处理操作,下边就和大家分享一下 Spring 框架下使用 Thumbnailator 做图片各种处理的方法。
首先放上需要处理的两张原图:umbrella_1366x768.jpg 和 mark.png
pom.xml 中引入依赖包
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
</dependency>
编写测试类:
@Test
public void a() throws IOException {
// 原图
String path1 = "D:/temp/umbrella_1366x768.jpg";
/**
* 按比例,指定大小进行缩放
* 若图片横比200小,高比300小,不变
* 若图片横比200小,高比300大,高缩小到300,图片比例不变
* 若图片横比200大,高比300小,横缩小到200,图片比例不变
* 若图片横比200大,高比300大,图片按比例缩小,横为200或高为300
*/
Thumbnails.of(path1).size(300, 200).toFile("D:/temp/umbrella_300x200.jpg");
/**
* 不按照比例,指定大小进行缩放
* keepAspectRatio(false) 默认是按照比例缩放的
*/
Thumbnails.of(path1)
.size(300, 200)
.keepAspectRatio(false)
.toFile("D:/temp/umbrella_300x200F.jpg");
/**
* 单个图片等比例缩放
* 3.0是一个double类型的数字,缩放比例,大于1就是变大,小于1就是缩小
*/
Thumbnails.of(new FileInputStream(path1))
.scale(3.0)
.toFile("D:/temp/umbrella_scalex3.jpg");
Thumbnails.of(new FileInputStream(path1))
.scale(0.5)
.toFile("D:/temp/umbrella_scalex0.5.jpg");
/**
* 控制图片质量,图片尺寸不变
*/
Thumbnails.of(path1)
.scale(1f)
.outputQuality(0.25f)
.toFile("D:/temp/umbrella_qualityx0.25.jpg");
/**
* 给图片加水印
* watermark(位置,水印图,透明度)
*/
Thumbnails.of(path1)
.scale(1f)
.watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File("D:/temp/mark.png")), 0.5f)
.toFile("D:/temp/umbrella_watermark.jpg");
/**
* 旋转图片
*/
Thumbnails.of(path1).scale(1f).rotate(180).toFile("D:/temp/umbrella_rotate.jpg");
/**
* 裁剪图片
*/
// 图片右下400*400的区域
Thumbnails.of(path1)
.sourceRegion(Positions.BOTTOM_RIGHT, 400, 400)
.size(200, 200)
.keepAspectRatio(false)
.toFile("D:/temp/umbrella_right1.jpg");
// 指定坐标
Thumbnails.of(path1)
.sourceRegion(600, 500, 400, 400)
.size(200, 200)
.keepAspectRatio(false)
.toFile("D:/temp/umbrella_right2.jpg");
/**
* 图像的格式转换
* outputFormat(图像格式)
*/
Thumbnails.of(path1)
.size(400, 300)
.outputFormat("png")
.toFile("D:/temp/umbrella_output.png");
Thumbnails.of(path1)
.size(400, 300)
.outputFormat("gif")
.toFile("D:/temp/umbrella_output.gif");
// 输出到BufferedImage
BufferedImage img = Thumbnails.of(path1)
.size(400, 300)
.asBufferedImage();
}
D:/temp 目录生成的图片如下:
测试类中最后一个 BufferedImage 类型: