热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

利用Thumbnailator轻松实现图片缩放、旋转与加水印

java开发中经常遇到对图片的处理,JDK中也提供了对应的工具类,不过处理起来很麻烦,Thumbnailator是一个优秀的图片处理的开源Java类库,处理效果远比JavaAPI的好,这篇文章主要介绍了利用Thumbnailator如何轻松的实现图片缩放、旋转与加水印,需要的朋友可以参考下

概述

Thumbnailator 是一个开源的 Java 项目,它提供了非常简单的 API 来对图片进行缩放、旋转以及加水印的处理。

有多简单呢?简单到一行代码就可以完成图片处理。形式如下:

Thumbnails.of(new File("path/to/directory").listFiles())
 .size(640, 480)
 .outputFormat("jpg")
 .toFiles(Rename.PREFIX_DOT_THUMBNAIL);

当然,Thumbnailator 还有一些使用细节,下面我会一一道来。

核心 API

Thumbnails

Thumbnails 是使用 Thumbnailator 创建缩略图的主入口。

它提供了一组初始化 Thumbnails.Builder 的接口。

先看下这组接口的声明:

// 可变长度参数列表
public static Builder of(String... files) {...}
public static Builder of(File... files) {...}
public static Builder of(URL... urls) {...}
public static Builder<&#63; extends InputStream> of(InputStream... inputStreams) {...}
public static Builder of(BufferedImage... images) {...}
// 迭代器(所有实现 Iterable 接口的 Java 对象都可以,当然也包括 List、Set)
public static Builder fromFilenames(Iterable files) {...}
public static Builder fromFiles(Iterable files) {...}
public static Builder fromURLs(Iterable urls) {...}
public static Builder fromInputStreams(Iterable<&#63; extends InputStream> inputStreams) {...}
public static Builder fromImages(Iterable images) {...}

很显然,Thumbnails 允许通过传入文件名、文件、网络图的URL、图片流、图片缓存多种方式来初始化构造器

因此,你可以根据实际需求来灵活的选择图片的输入方式。

需要注意一点:如果输入是多个对象(无论你是直接输入容器对象或使用可变参数方式传入多个对象),则输出也必须选用输出多个对象的方式,否则会报异常

Thumbnails.Builder

Thumbnails.Builder 是 Thumbnails 的内部静态类。它用于设置生成缩略图任务的相关参数。

注:Thumbnails.Builder 的构造函数是私有函数。所以,它只允许通过 Thumbnails 的实例化函数来进行初始化。

设置参数的函数

Thumbnails.Builder 提供了一组函数链形式的接口来设置缩放图参数。

以设置大小函数为例:

public Builder size(int width, int height)
{
 updateStatus(Properties.SIZE, Status.ALREADY_SET);
 updateStatus(Properties.SCALE, Status.CANNOT_SET);
 
 validateDimensions(width, height);
 this.width = width;
 this.height = height;
 
 return this;
}

通过返回this指针,使得设置参数函数可以以链式调用的方式来使用,形式如下:

Thumbnails.of(new File("original.jpg"))
 .size(160, 160)
 .rotate(90)
 .watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File("watermark.png")), 0.5f)
 .outputQuality(0.8)
 .toFile(new File("image-with-watermark.jpg"));

好处,不言自明:那就是大大简化了代码。

输出函数

Thumbnails.Builder 提供了一组重载函数来输出生成的缩放图。

函数声明如下:

// 返回图片缓存
public List asBufferedImages() throws IOException {...}
public BufferedImage asBufferedImage() throws IOException {...}
// 返回文件列表
public List asFiles(Iterable iterable) throws IOException {...}
public List asFiles(Rename rename) throws IOException {...}
public List asFiles(File destinationDir, Rename rename) throws IOException {...}
// 创建文件
public void toFile(File outFile) throws IOException {...}
public void toFile(String outFilepath) throws IOException {...}
public void toFiles(Iterable iterable) throws IOException {...}
public void toFiles(Rename rename) throws IOException {...}
public void toFiles(File destinationDir, Rename rename) throws IOException {...}
// 创建输出流
public void toOutputStream(OutputStream os) throws IOException {...}
public void toOutputStreams(Iterable<&#63; extends OutputStream> iterable) throws IOException {...}

工作流

Thumbnailator 的工作步骤十分简单,可分为三步:

  1. 输入:Thumbnails 根据输入初始化构造器—— Thumbnails.Builder
  2. 设置:Thumbnails.Builder 设置缩放图片的参数。
  3. 输出:Thumbnails.Builder 输出图片文件或图片流。

更多详情可以参考: Thumbnailator 官网javadoc

实战

前文介绍了 Thumbnailator 的核心 API,接下来我们就可以通过实战来看看 Thumbnailator 究竟可以做些什么。

Thumbnailator 生成什么样的图片,是根据设置参数来决定的。

安装

maven项目中引入依赖:


 net.coobird
 thumbnailator
 [0.4, 0.5)

图片缩放

Thumbnails.Builder 的 size 函数可以设置新图片精确的宽度和高度,也可以用 scale 函数设置缩放比例。

Thumbnails.of("oldFile.png")
 .size(16, 16)
 .toFile("newFile_16_16.png");

Thumbnails.of("oldFile.png")
 .scale(2.0)
 .toFile("newFile_scale_2.0.png");

Thumbnails.of("oldFile.png")
 .scale(1.0, 0.5)
 .toFile("newFile_scale_1.0_0.5.png");

oldFile.png

newFile_scale_1.0_0.5.png

图片旋转

Thumbnails.Builder 的 size 函数可以设置新图片的旋转角度。

Thumbnails.of("oldFile.png")
 .scale(0.8)
 .rotate(90)
 .toFile("newFile_rotate_90.png");

Thumbnails.of("oldFile.png")
 .scale(0.8)
 .rotate(180)
 .toFile("newFile_rotate_180.png");

newFile_rotate_90.png

加水印

Thumbnails.Builder 的 watermark 函数可以为图片添加水印图片。第一个参数是水印的位置;第二个参数是水印图片的缓存数据;第三个参数是透明度。

BufferedImage watermarkImage = ImageIO.read(new File("wartermarkFile.png"));
Thumbnails.of("oldFile.png")
 .scale(0.8)
 .watermark(Positions.BOTTOM_LEFT, watermarkImage, 0.5f)
 .toFile("newFile_watermark.png");

wartermarkFile.png

newFile_watermark.png

批量处理图片

下面以批量给图片加水印来展示一下如何处理多个图片文件。

BufferedImage watermarkImage = ImageIO.read(new File("wartermarkFile.png"));

File destinatiOnDir= new File("D:\\watermark\\");
Thumbnails.of("oldFile.png", "oldFile2.png")
 .scale(0.8)
 .watermark(Positions.BOTTOM_LEFT, watermarkImage, 0.5f)
 .toFiles(destinationDir, Rename.PREFIX_DOT_THUMBNAIL);

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用java能带来一定的帮助,如果有疑问大家可以留言交流。


推荐阅读
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 胡蜂能进行逻辑推理的研究成果
    最新研究表明,胡蜂具备一定的逻辑推理能力,能够进行传递性推理。研究人员通过实验发现,胡蜂在避免电击的测试中,能够正确选择符合逻辑的选项。这项研究成果对于了解无脊椎动物的认知能力具有重要意义,也为解析胡蜂社会结构的进化提供了线索。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • docker增加restart=always, docker重启后自动启动容器的方法
    本文介绍了在运行docker容器时如何添加参数来保证每次docker服务重启后容器也自动重启的方法,以及如何使用命令来更新已启动的容器。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 处理docker容器时间和宿主机时间不一致问题的方法
    本文介绍了处理docker容器时间和宿主机时间不一致问题的方法,包括复制主机的localtime到容器、处理报错情况以及重启容器的步骤。通过这些方法,可以解决docker容器时间和宿主机时间不一致的问题。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 本文介绍了Java的集合及其实现类,包括数据结构、抽象类和具体实现类的关系,详细介绍了List接口及其实现类ArrayList的基本操作和特点。文章通过提供相关参考文档和链接,帮助读者更好地理解和使用Java的集合类。 ... [详细]
  • 本文介绍了电流源并联合并的方法,以及谐振电路的原理。谐振电路具有很强的选频能力,通过将电感和电容连接在一起,电流和电压会产生震荡。谐振频率的大小取决于电感和电容的大小,而电路中的电阻会逐渐降低震荡的幅度。电阻和电容组成的电路中,当电容放完电后,电阻两端的电压为0,电流不再流过电容。然而,电感是一种特殊的器件,当有电流流过时,线圈会产生感应磁场,阻止电流的流动,从而使电流不会减小。 ... [详细]
  • 标题: ... [详细]
  • 单点登录原理及实现方案详解
    本文详细介绍了单点登录的原理及实现方案,其中包括共享Session的方式,以及基于Redis的Session共享方案。同时,还分享了作者在应用环境中所遇到的问题和经验,希望对读者有所帮助。 ... [详细]
author-avatar
手机用户2502855763
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有