SpringBoot2.x 整合 thumbnailator 图片处理的示例代码

1、序

在实际项目中,有时为了响应速度,难免会对一些高清图片进行一些处理,比如图片压缩之类的,而其中压缩可能就是最为常见的。最近,阿淼就被要求实现这个功能,原因是客户那边嫌速度过慢。借此机会,阿淼今儿就给大家介绍一些一下我做这个功能时使用的 Thumbnailator 库。

Thumbnailator 是一个优秀的图片处理的 Google 开源 Java 类库,专门用来生成图像缩略图的,通过很简单的 API 调用即可生成图片缩略图,也可直接对一整个目录的图片生成缩略图。两三行代码就能够从现有图片生成处理后的图片,且允许微调图片的生成方式,同时保持了需要写入的最低限度的代码量。可毫不夸张的说,它是一个处理图片十分棒的开源框架。

支持:图片缩放,区域裁剪,水印,旋转,保持比例。

Thumbnailator 官网:https://code.google.com/p/thumbnailator/

有了这玩意,就不用在费心思使用 Image I/O API,Java 2D API 等等来生成缩略图了。

废话少说,直接上代码,先来看一个最简单的例子:

2、代码示例

2.1. 新建一个springboot项目

2.2. 引入依赖 thumbnailator

<dependency>
	<groupId>net.coobird</groupId>
	<artifactId>thumbnailator</artifactId>
	<version>0.4.8</version>
</dependency>

2.3. controller

主要实现了如下几个接口作为测试:

@RestController
public class ThumbnailsController {
	@Resource
	private IThumbnailsService thumbnailsService;

	/**
	 * 指定大小缩放
	 * @param resource
	 * @param width
	 * @param height
	 * @return
	 */
	@GetMapping("/changeSize")
	public String changeSize(MultipartFile resource, int width, int height) {
		return thumbnailsService.changeSize(resource, width, height);
	}

	/**
	 * 指定比例缩放
	 * @param resource
	 * @param scale
	 * @return
	 */
	@GetMapping("/changeScale")
	public String changeScale(MultipartFile resource, double scale) {
		return thumbnailsService.changeScale(resource, scale);
	}

	/**
	 * 添加水印 watermark(位置,水印,透明度)
	 * @param resource
	 * @param p
	 * @param shuiyin
	 * @param opacity
	 * @return
	 */
	@GetMapping("/watermark")
	public String watermark(MultipartFile resource, Positions p, MultipartFile shuiyin, float opacity) {
		return thumbnailsService.watermark(resource, Positions.CENTER, shuiyin, opacity);
	}

	/**
	 * 图片旋转 rotate(度数),顺时针旋转
	 * @param resource
	 * @param rotate
	 * @return
	 */
	@GetMapping("/rotate")
	public String rotate(MultipartFile resource, double rotate) {
		return thumbnailsService.rotate(resource, rotate);
	}

	/**
	 * 图片裁剪
	 * @param resource
	 * @param p
	 * @param width
	 * @param height
	 * @return
	 */
	@GetMapping("/region")
	public String region(MultipartFile resource, Positions p, int width, int height) {
		return thumbnailsService.region(resource, Positions.CENTER, width, height);
	}
}

3、功能实现

其实引入了这个 Thumbnailator 类库后,代码其实很少,因为我们只需要按照规则调用其 API 来实现即可。就个人而言,挺喜欢这种 API 的方式,简洁,易懂,明了。

3.1 指定大小缩放

/**
 * 指定大小缩放 若图片横比width小,高比height小,放大
 * 若图片横比width小,高比height大,高缩小到height,图片比例不变
 * 若图片横比width大,高比height小,横缩小到width,图片比例不变
 * 若图片横比width大,高比height大,图片按比例缩小,横为width或高为height
 *
 * @param resource 源文件路径
 * @param width  宽
 * @param height 高
 * @param tofile 生成文件路径
 */
public static void changeSize(String resource, int width, int height, String tofile) {
	try {
		Thumbnails.of(resource).size(width, height).toFile(tofile);
	} catch (IOException e) {
		e.printStackTrace();
	}
}

测试:

3.2 指定比例缩放

/**
 * 指定比例缩放 scale(),参数小于1,缩小;大于1,放大
 *
 * @param resource 源文件路径
 * @param scale  指定比例
 * @param tofile  生成文件路径
 */
public static void changeScale(String resource, double scale, String tofile) {
	try {
		Thumbnails.of(resource).scale(scale).toFile(tofile);
	} catch (IOException e) {
		e.printStackTrace();
	}
}

测试:

3.3 添加水印

/**
 * 添加水印 watermark(位置,水印,透明度)
 *
 * @param resource 源文件路径
 * @param p   水印位置
 * @param shuiyin 水印文件路径
 * @param opacity 水印透明度
 * @param tofile 生成文件路径
 */
public static void watermark(String resource, Positions p, String shuiyin, float opacity, String tofile) {
	try {
		Thumbnails.of(resource).scale(1).watermark(p, ImageIO.read(new File(shuiyin)), opacity).toFile(tofile);
	} catch (IOException e) {
		e.printStackTrace();
	}
}

测试:

3.4 图片旋转

/**
 * 图片旋转 rotate(度数),顺时针旋转
 *
 * @param resource 源文件路径
 * @param rotate 旋转度数
 * @param tofile 生成文件路径
 */
public static void rotate(String resource, double rotate, String tofile) {
	try {
		Thumbnails.of(resource).scale(1).rotate(rotate).toFile(tofile);
	} catch (IOException e) {
		e.printStackTrace();
	}
}

测试:

3.5 图片裁剪

/**
 * 图片裁剪 sourceRegion()有多种构造方法,示例使用的是sourceRegion(裁剪位置,宽,高)
 *
 * @param resource 源文件路径
 * @param p   裁剪位置
 * @param width  裁剪区域宽
 * @param height 裁剪区域高
 * @param tofile 生成文件路径
 */
public static void region(String resource, Positions p, int width, int height, String tofile) {
	try {
		Thumbnails.of(resource).scale(1).sourceRegion(p, width, height).toFile(tofile);
	} catch (IOException e) {
		e.printStackTrace();
	}
}

测试:

说明:

1.keepAspectRatio(boolean arg0) 图片是否按比例缩放(宽高比保持不变)默认 true

2.outputQuality(float arg0) 图片质量

3.outputFormat(String arg0) 格式转换

小结

值得注意的是,若 png、gif 格式图片中含有透明背景,使用该工具压缩处理后背景会变成黑色,这是 Thumbnailator 的一个 bug,预计后期版本会解决。

代码地址 :https://github.com/mmzsblog/mmzsblog-util/

到此这篇关于SpringBoot2.x 之整合 thumbnailator 图片处理的文章就介绍到这了,更多相关SpringBoot2.x  图片处理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • springboot整合solr的方法详解

    这一篇写一下springboot整合solr,代码已经上传到github,传送门. 1.新建core并配置schema solr create -c "book_core" ,配置分词器并且field类型定义为分词器类型. <fieldType name="ik_word" class="solr.TextField"> <analyzer type="index"> <tokenizer cla

  • Netty与Spring Boot的整合的实现

    ​ 最近有朋友向我询问一些Netty与SpringBoot整合的相关问题,这里,我就总结了一下基本整合流程,也就是说,这篇文章 ,默认大家是对netty与Spring,SpringMVC的整合是没有什么问题的.现在,就进入正题吧. Server端: 总的来说,服务端还是比较简单的,自己一共写了三个核心类.分别是 NettyServerListener:服务启动监听器 ServerChannelHandlerAdapter:通道适配器,主要用于多线程共享 RequestDispatcher:请求分

  • springboot整合redis集群过程解析

    简介 在springboot使用搭建好的redis集群 添加redis和连接池依赖 <!--redis连接池 start--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency> <!--redis连接池 end--> <!--redis start-

  • SpringBoot整合支付宝APP支付

    前言 现在是移动端产品疯狂的年代,随之,移动端支付也是热门小技能,最近本公司在做一个移动端,要接入微信支付和支付宝支付,老习惯,功能做完之后做个复盘记录,这边主要讲解支付宝APP支付 所需条件 1.创建蚂蚁金服开放平台公司账号 2.选择开发中心---->移动应用 3.选择支付接入 4.创建应用 5.查看应用appId 6.添加功能 两个功能:支付宝授权功能和APP支付功能 7.功能签约 开发流程 引入支付宝支付SDK <!-- 支付宝支付 SDK --> <dependency&g

  • SpringBoot整合MyBatis实现乐观锁和悲观锁的示例

    本文以转账操作为例,实现并测试乐观锁和悲观锁. 全部代码:https://github.com/imcloudfloating/Lock_Demo GitHub Page:https://cloudli.top 死锁问题 当 A, B 两个账户同时向对方转账时,会出现如下情况: 时刻 事务 1 (A 向 B 转账) 事务 2 (B 向 A 转账) T1 Lock A Lock B T2 Lock B (由于事务 2 已经 Lock A,等待) Lock A (由于事务 1 已经 Lock B,等

  • SpringBoot整合Spring Data Elasticsearch的过程详解

    Spring Data Elasticsearch提供了ElasticsearchTemplate工具类,实现了POJO与elasticsearch文档之间的映射 elasticsearch本质也是存储数据,它不支持事物,但是它的速度远比数据库快得多, 可以这样来对比elasticsearch和数据库 索引(indices)--------数据库(databases) 类型(type)------------数据表(table) 文档(Document)---------------- 行(ro

  • SpringBoot整合Elasticsearch7.2.0的实现方法

    Spring boot 2.1.X整合Elasticsearch最新版的一处问题 新版本的Spring boot 2的spring-boot-starter-data-elasticsearch中支持的Elasticsearch版本是2.X,但Elasticsearch实际上已经发展到7.2.X版本了,为了更好的使用Elasticsearch的新特性,所以弃用了spring-boot-starter-data-elasticsearch依赖,而改为直接使用Spring-data-elastics

  • SpringBoot2.x 整合 thumbnailator 图片处理的示例代码

    1.序 在实际项目中,有时为了响应速度,难免会对一些高清图片进行一些处理,比如图片压缩之类的,而其中压缩可能就是最为常见的.最近,阿淼就被要求实现这个功能,原因是客户那边嫌速度过慢.借此机会,阿淼今儿就给大家介绍一些一下我做这个功能时使用的 Thumbnailator 库. Thumbnailator 是一个优秀的图片处理的 Google 开源 Java 类库,专门用来生成图像缩略图的,通过很简单的 API 调用即可生成图片缩略图,也可直接对一整个目录的图片生成缩略图.两三行代码就能够从现有图片

  • java poi导出图片到excel示例代码

    本文实例为大家分享了java使用poi导出图片到Excel的具体代码,供大家参考,具体内容如下 代码实现 Controller /** * 导出志愿者/人才数据 * @param talent_type * @return */ @RequestMapping("/exportData") public void exportData(Integer talent_type, HttpServletResponse response) { String fileId = UUID.ra

  • 鼠标滚轮改变图片大小的示例代码

    鼠标滚轮改变图片大小的示例代码<script> function onWheelZoom(obj){         zoom = parseFloat(obj.style.zoom);         tZoom = zoom + (event.wheelDelta>0 ? 0.05 : -0.05);         if( tZoom > 1 || tZoom<0.1 ) return true;         obj.style.zoom=tZoom;       

  • vue实现图片滚动的示例代码(类似走马灯效果)

    上次写了一个简单的图片轮播,这个相当于在上面的一些改进.这个组件除了可以进行图片滚动外,也可以嵌入任何内容的标签进行滚动,里面用了slot进行封装. 父: <template> <div id="app"> <er-carousel-index :typeNumber=2 :pageNumber=3 :timeSpace=2 :duration=2 :isOrNotCircle="true" url="/src/js/inde

  • Java实现动态获取图片验证码的示例代码

    本文介绍了Java实现动态获取图片验证码的示例代码,分享给大家,具体如下: import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.UnsupportedEncodingEx

  • Js逆向实现滑动验证码图片还原的示例代码

    本文列举两个例子:某象和某验的滑动验证 一.某验:aHR0cHM6Ly93d3cuZ2VldGVzdC5jb20vZGVtby9zbGlkZS1mbG9hdC5odG1s 未还原图像: 还原后的图: 从服务端请求来的图片是打乱后的,给用户看的时候是完整的,这个过程肯定是运行了某段js代码,将打乱的图片进行还原操作.所以我们需要找到这段js,然后还原它的代码逻辑,实现图片的还原操作,找到缺口距离,实现滑动操作. 如果你仔细观察的话,你会发现还原后的图它是canvas生成出来的 那你应该会想到,那段

  • SpringBoot2.3集成ELK7.1.0的示例代码

    最近想用ELK做日志分析,所以先写了Demo来实验一下! 1.安装ELK(Elasticsearch+Logstash+Kibana),具体安装教程百度 2.查看是否安装成功,输入localhost:9200,localhost:5601,如下页面则安装成功 3.pom包依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM

  • C# 进行图片压缩的示例代码(对jpg压缩效果最好)

    直接上代码 public static class ImageCompress { /// <summary> /// 图片压缩 /// </summary> /// <param name="imagePath">图片文件路径</param> /// <param name="targetFolder">保存文件夹</param> /// <param name="qualit

  • vue使用exif获取图片经纬度的示例代码

    我上一篇文章写了怎么压缩图片和旋转.这篇写一下怎么看图片的经纬度 注意!!! 只有原图有大量的元数据信息.通过拍照软件如:b612等,拍摄的照片是软件处理过的,所以一定要使用原图来擦查询 下面贴以下代码. <template> <div> <input type="file" id="upload" accept="image" @change="upload" /> <span>

  • 基于Java的MathML转图片的方法(示例代码)

    Maven依赖: <dependency> <groupId>de.rototor.jeuclid</groupId> <artifactId>jeuclid-core</artifactId> <version>3.1.14</version> </dependency> 示例: @Test public void testMathMlToImg() throws IOException { //MathML

随机推荐