强大!Spring Boot 图片处理工具,实现缩放,水印,旋转等功能仅需一行代码

开发 开发工具
在Web项目开发中,对用户上传的图片进行处理是非常有必要的。对于图片的处理,常见的需求包括缩放、添加水印等。

环境: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对象,直接直接将该对象进行输出,最终效果:

图片图片

责任编辑:武晓燕 来源: Spring全家桶实战案例源码
相关推荐

2023-01-12 08:07:03

Python代码版权

2010-03-09 19:19:40

Python图像处理

2020-08-19 10:30:25

代码Python多线程

2024-05-31 14:04:18

2020-09-28 12:34:38

Python代码开发

2023-09-21 15:10:55

2022-04-09 09:11:33

Python

2016-12-02 08:53:18

Python一行代码

2022-05-13 09:36:06

Python水印命令

2021-04-22 11:27:24

Python命令水印

2020-02-21 16:51:58

前端可视化传染病

2021-09-16 14:22:06

微软WinUI 2.7InfoBadge

2016-11-09 18:41:47

PHP图片存储yii

2021-11-05 06:57:50

架构工具代码

2013-11-12 10:46:04

ChromeChrome32 be

2019-04-24 16:12:59

iOSSiriMacOS

2021-06-08 11:31:11

WineWaylandVulkan

2021-02-04 17:04:22

Python编程语言代码

2023-11-07 07:07:23

2023-10-06 19:21:49

Initializr应用Spring
点赞
收藏

51CTO技术栈公众号