SpringBoot集成Google开源图片处理框架,贼好用!

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 {@Resourceprivate 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,预计后期版本会解决。


往期推荐

MySQL为Null会导致5个问题,个个致命!


编程中的21个坑,你占几个?


Spring Boot集成Redis,这个坑把我害惨了!


关注我,每天陪你进步一点点!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/545071.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 方法 示例_Java语言环境getDisplayVariant()方法与示例

java 方法 示例区域设置类getDisplayVariant()方法 (Locale Class getDisplayVariant() method) Syntax: 句法&#xff1a; public final String getDisplayVariant();public String getDisplayVariant(Locale lo);getDisplayVariant() method is available in java.util pack…

推荐一款开源数据库设计工具,比PowerDesigner更好用!

最近有个新项目刚过完需求&#xff0c;正式进入数据库表结构设计阶段&#xff0c;公司规定统一用数据建模工具 PowerDesigner。但我并不是太爱用这个工具&#xff0c;因为它的功能实在是太多了&#xff0c;显得很臃肿繁琐&#xff0c;而平时设计表用的也就那么几个功能。这里找…

cocos2d-x lua 学习笔记(1) -- 环境搭建

Cocos2d-x 3.0以上版本的环境搭建和之前的Cocos2d-x 2.0 版差异较大的,同时从Cocos2d-x 3.0项目打包成apk安卓应用文件&#xff0c;搭建安卓环境的步骤有点繁琐&#xff0c;但搭建一次之后&#xff0c;以后就会非常快捷&#xff01;OK&#xff0c;现在就开始搭建环境吧&#xf…

rotateleft_Java Integer类rotateLeft()方法与示例

rotateleft整数类rotateLeft()方法 (Integer class rotateLeft() method) rotateLeft() method is available in java.lang package. rotationLeft()方法在java.lang包中可用。 rotateLeft() method is used to returns the value generated by rotating the binary 2s complem…

ORACLE删除当前用户下所有的表的方法

1、如果有删除用户的权限&#xff0c;则可以&#xff1a; drop user user_name cascade; 加了cascade就可以把用户连带的数据全部删掉。 删除后再创建该用户。 --创建管理员用户 create user 用户名 identified by 密码 default tablespace space_data&#xff08;表空间名称…

Socket粘包问题的3种解决方案,最后一种最完美!

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;在 Java 语言中&#xff0c;传统的 Socket 编程分为两种实现方式&#xff0c;这两种实现方式也对应着两种不同的传输层协议…

【万里征程——Windows App开发】控件大集合1

添加控件的方式有多种&#xff0c;大家更喜欢哪一种呢&#xff1f; 1&#xff09;使用诸如 Blend for Visual Studio 或 Microsoft Visual Studio XAML 设计器的设计工具。 2&#xff09;在 Visual Studio XAML 编辑器中将控件添加到 XAML 标记中。 3&#xff09;在代码中添…

Java Collections BinarySearch()方法与示例

集合类binarySearch()方法 (Collections Class binarySearch() method) Syntax: 句法&#xff1a; public static int binarySearch(List l, Type key_ele);public static int binarySearch(List l, Type key_ele, Comparator com);binarySearch() method is available in jav…

从String中移除空白字符的多种方式!?差别竟然这么大!

字符串&#xff0c;是Java中最常用的一个数据类型了。我们在日常开发时候会经常使用字符串做很多的操作。比如字符串的拼接、截断、替换等。这一篇文章&#xff0c;我们介绍一个比较常见又容易被忽略的一个操作&#xff0c;那就是移除字符串中的空格。其实&#xff0c;在Java中…

[JS][jQuery]清空元素html()、innerHTML= 与 empty()的区别 、remove()区别

清空元素html("")、innerHTML"" 与 empty()的区别 一、清空元素的区别 1、错误做法一&#xff1a; $("#test").html("");//该做法会导致内存泄露 2、错误做法二&#xff1a;$("#test")[0].innerHTML"&qu…

Properties文件位置

这种情况下Properties文件放在和‘当前类’同一目录下 <span style"font-size:14px;">Properties p new Properties(); InputStream in 当前类.class.getResourceAsStream("Properties文件名"); p.load(in); </span> 这种情况下Prop…

Java类class isAnnotation()方法及示例

类的类isAnnotation()方法 (Class class isAnnotation() method) isAnnotation() method is available in java.lang package. isAnnotation()方法在java.lang包中可用。 isAnnotation() method is used to check whether this Class object represents the annotation type or…

不要再用main方法测试代码性能了,用这款JDK自带工具

前言作为软件开发人员&#xff0c;我们通常会写一些测试程序用来对比不同算法、不同工具的性能问题。而最常见的做法是写一个main方法&#xff0c;构造模拟场景进行并发测试。如果细心的朋友可能已经发现&#xff0c;每次测试结果误差很大&#xff0c;有时候测试出的结果甚至与…

读书总结:周鸿祎,我的互联网方法论

目录&#xff1a;1、欢迎来到互联网时代2、互联网用户至上3、颠覆式创新4、免费时代5、体验为王6、互联网方法论第一章&#xff1a;互联网时代1、没人能打败趋势&#xff0c;趋势会导致非线性发展。2、信息的流通变快&#xff0c;商家很难利用非对称性赚钱。3、用户的体验最重要…

Java ClassLoader getResources()方法与示例

ClassLoader类的getResources()方法 (ClassLoader Class getResources() method) getResources() method is available in java.lang package. getResources()方法在java.lang包中可用。 getResources() method is used to identify all the resources with the given resource…

Java中Properties类的操作

http://www.cnblogs.com/bakari/p/3562244.html Java中Properties类的操作 知识学而不用&#xff0c;就等于没用&#xff0c;到真正用到的时候还得重新再学。最近在看几款开源模拟器的源码&#xff0c;里面涉及到了很多关于Properties类的引用&#xff0c;由于Java已经好久没用…

复盘线上的一次OOM和性能优化!

来源&#xff1a;r6d.cn/ZazN上周五&#xff0c;发布前一周的服务器小动荡????事情回顾上周五&#xff0c;通过Grafana监控&#xff0c;线上环境突然出现CPU和内存飙升的情况&#xff1a;但是看到网络输入和输入流量都不是很高&#xff0c;所以网站被别人攻击的概率不高&am…

scanf 输入十六进制_在C语言中使用scanf()输入一个十六进制值

scanf 输入十六进制Here, we have to declare an unsigned int variable and input a value in hexadecimal format. 在这里&#xff0c;我们必须声明一个无符号的int变量&#xff0c;并以十六进制格式输入一个值。 To input a value in hexadecimal format – we use "%…

阅读源码的 4 个绝技,我必须分享给你!

为什么要阅读源码&#xff1f;1.在通用型基础技术中提高技术能力在 JAVA 领域中包含 JAVA 集合、Java并发(JUC)等&#xff0c; 它们是项目中使用的高频技术&#xff0c;在各种复杂的场景中选用合适的数据结构、线程并发模型&#xff0c;合理控制锁粒度等都能显著提高应用程序的…

微信公众号开发 ssl connect error

微信获取公众号授权失败 &#xff1a;ssl connect error 本人用的是微擎&#xff0c;也是刚入手&#xff0c;碰到这个问题感觉很棘手。 通过一步步调试发现问题出在curl 认证这里&#xff0c;得到结果错误代码&#xff1a;35&#xff0c;错误信息就是&#xff1a;ssl connect …