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,一经查实,立即删除!

相关文章

推荐一款开源数据库设计工具,比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…

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;在代码中添…

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

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

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

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

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…

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

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

innerHTML、innerText和outerHTML、outerText的区别

1、区别描述如下&#xff1a; innerHTML 设置或获取位于对象起始和结束标签内的 HTMLouterHTML 设置或获取对象及其内容的 HTML 形式innerText 设置或获取位于对象起始和结束标签内的文本outerText 设置(包括标签)或获取(不包括标签)对象的文本innerText和outerText在获取时是相…

Socket粘包问题终极解决方案—Netty版(2W字)!

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;上一篇我们写了《Socket粘包问题的3种解决方案》&#xff0c;但没想到评论区竟然炸了。介于大家的热情讨论&#xff0c;以及…

Java高质量代码之 — 泛型与反射

在Java5后推出了泛型,使我们在编译期间操作集合或类时更加的安全,更方便代码的阅读,而让身为编译性语言的Java提供动态性的反射技术,更是在框架开发中大行其道,从而让Java活起来,下面看一下在使用泛型和反射需要注意和了解的事情 1.Java的泛型是类型擦除的 Java中的泛型是…

Redis 消息队列的三种方案(List、Streams、Pub/Sub)

现如今的互联网应用大都是采用 分布式系统架构 设计的&#xff0c;所以 消息队列 已经逐渐成为企业应用系统 内部通信 的核心手段&#xff0c;它具有 低耦合、可靠投递、广播、流量控制、最终一致性 等一系列功能。当前使用较多的 消息队列 有 RabbitMQ、RocketMQ、ActiveMQ、K…

c struct 对齐_C中的struct大小| 填充,结构对齐

c struct 对齐What we know is that size of a struct is the sum of all the data members. Like for the following struct, 我们知道的是&#xff0c; 结构的大小是所有数据成员的总和 。 对于以下结构&#xff0c; struct A{int a;int* b;char c;char *d;};Size of the st…

超3000岗位!腾讯产业互联网新年大扩招!

虽然离春节仅剩 1 个月的时间&#xff0c;大厂依旧没有停止招人。就在上周&#xff0c;腾讯官宣新年大扩招&#xff0c;放出 3000 多个岗位需求&#xff01;我们查看了腾讯的招聘数据发现&#xff0c;除了大量招聘运营人员&#xff0c;你猜&#xff0c;他们还在批量招聘什么岗位…

骚操作,IDEA防止写代码沉迷插件 !

当初年少懵懂&#xff0c;那年夏天填志愿选专业&#xff0c;父母听其他长辈说选择计算机专业好。从那以后&#xff0c;我的身上就有了计院深深的烙印。从寝室到机房&#xff0c;从机房到图书馆&#xff0c;C、C、Java、只要是想写点自己感兴趣的东西&#xff0c;一坐就是几个小…

css属性 content

对css一直没有很系统得学习过,练习得也不是很多,纯小白.今天在写一个页面的时候,遇到一个问题,就是如何让外面的盒子适应里面的盒子大小,完美地把小盒子包在里面. 由于里面是一个列表 ul,为了让元素横排,我使用了float:right这个属性,所以列表悬浮了.如图: 其实当然可以直接给外…

一文汇总 JDK 5 到 JDK 15 中的牛逼功能!

前言JDK 16 马上就要发布啦&#xff08;预计 2021.3.16 日发布&#xff09;&#xff0c;所以在发布之前&#xff0c;让我们先来回顾一下 JDK 5-15 的新特性吧&#xff0c;大家一起学起来~Java 5 新特性1. 泛型泛型本质是参数化类型&#xff0c;解决不确定具体对象类型的问题。L…

Tomcat 6.0 简介

本片翻译来自&#xff1a;http://tomcat.apache.org/tomcat-6.0-doc/introduction.html 介绍 无论是开发者还是tomcat管理员在使用前都需要了解一些必要的信息&#xff0c;本篇简单的介绍tomcat中的一些术语和概念。比如context是web应用的意思。CATALINA_HOME 在文档中&#x…

Docker部署SpringBoot的两种方法,后一种一键部署超好用!

作者 | LemonSquash来源 | cnblogs.com/npeng/p/14267007.html1.手工方式1.1.准备Springboot jar项目将项目打包成jar1.2.编写DockerfileFROM java:8 VOLUME /tmp ADD elk-web-1.0-SNAPSHOT.jar elk.jar EXPOSE 8080 ENTRYPOINT ["java","-Djava.security.egdfi…