环境:SpringBoot3.2.5
1. 简介
在Web项目开发中,对用户上传的图片进行处理是非常有必要的。对于图片的处理,常见的需求包括缩放、添加水印等。
缩放功能可以根据实际需求调整图片的大小,以适应不同的显示场景。通过合理的缩放,不仅可以节省存储空间,还能提升加载速度,优化用户体验。
水印功能则是一种有效的版权保护手段。通过在图片上添加文字或图标水印,可以明确标识图片的归属和来源,防止被恶意盗用。
在Java环境中创建高质量的缩略图可能颇具挑战性,要求开发者掌握Image I/O API、Java 2D API以及图像处理和缩放技术等复杂知识。然而,你无需为此担忧!本篇文章将介绍一个非常牛逼的开源组件Thumbnailator。
Thumbnailator的流畅接口(Fluent Interface)可以用来在一步简单的操作中完成相当复杂的缩略图处理任务。
准备环境,引入如下依赖:
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.20</version>
</dependency>
不依赖其它,只需引入该包即可完整各种复杂的图片出来。
2. 实战案例
2.1 创建缩略图
Thumbnails
.of(new File("d:\\images\\7.png"))
.size(160, 160)
.toFile(new File("d:\\images\\output\\7.png")) ;
该示例中,将原图大小缩放到160 * 160 然后输出到output目录下。最终图片对比如下:
虽然给定的缩放大小都是160,但是最终生成的是等比例的大小,但是不会超过160。
2.2 添加水印
Thumbnails.of(new File("d:\\images\\7.png"))
.size(200, 200)
.watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File("d:\\images\\water.png")), 0.5f)
.outputQuality(0.8)
.toFile(new File("d:\\images\\output\\7_watermark.png"));
在该示例中,首先调整了图片大小,接着在右下角放置一个半透明的水印,最后以80%的压缩质量设置保存为7_watermark.png。最终生成效果:
2.3 旋转图片
Thumbnails.of(new File("d:\\images\\7.png"))
.scale(1)
.rotate(180)
.toFile(new File("d:\\images\\output\\7_rotate.png"));
该示例中,我们将图片旋转了180°,最终效果:
2.4 强制缩略图大小
在上面的示例中,我们指定了缩放图片的大小,但是最终生成的图片还是等比例的,这样的结果是宽或高不会高出指定的大小,并没有严格的限定在指定的大小。
Thumbnails.of(new File("d:\\images\\7.png"))
.size(200, 200)
.keepAspectRatio(false)
.toFile(new File("d:\\images\\output\\7_keepratio.png"));
最终生成的效果:
严格按照指定的大小生成图片。你也可以如下操作
Thumbnails.of(new File("d:\\images\\7.png"))
.forceSize(200, 200)
.toFile(new File("d:\\images\\output\\7_keepratio.png"));
同样能按照指定的大小输出。
2.5 通过指定的因子缩放
Thumbnails.of(new File("d:\\images\\7.png"))
.scale(0.25)
.toFile(new File("d:\\images\\output\\7_scale.png"));
通过scale方法设置缩放的比,最终效果:
2.6 批量生成缩略图
我们一次性可以出来多个图片,并指定输出的目录。
File destinationDir = new File("d:\\images\\output");
Thumbnails.of("d:\\images\\1.png", "d:\\images\\2.png", "d:\\images\\3.png")
.size(200, 200)
.toFiles(destinationDir, Rename.PREFIX_DOT_THUMBNAIL);
该示例将1,2,3图片一次性按照设置生成缩略图,然后输出到output目录下,效果如下:
这里生成缩略图的命名策略是自动在原文件名前添加thumbnail.前缀,你也可以设置为:Rename.NO_CHANGE,这样图片将按照原文件名输出。
2.7 与Spring Boot整合
我们这里演示一个图片上传后生成缩略图进行输出的示例。
@PostMapping("/upload")
public void upload(MultipartFile file, HttpServletResponse response) throws Exception {
InputStream is = file.getInputStream() ;
BufferedImage bi = Thumbnails.of(is)
.size(200, 200)
.asBufferedImage() ;
response.setContentType("image/png");
response.setHeader("Content-Disposition", "inline; filename=image.png");
ImageIO.write(bi, "png", response.getOutputStream()) ;
}
该示例中,将上传的图片进行缩放后,返回BufferedImage对象,直接直接将该对象进行输出,最终效果:
图片