【Thumbnailator】图片压缩、水印、格式修改一网打尽

 前言:

        对于javaweb服务端开发人员,图片资源的管理总是绕不开的一环。很多网站上都会提供上传图片这个功能,而现代数码设备拍摄出来的都是高清图片,分辨率很高,占用的空间也很大。物理存储的问题还算容易解决,但是网络带宽太紧张了。一个页面动则就几十M,那加载速度,想想也是够了,所以图片的压缩就必不可少了,对于图片的加工,前后端都可以实现,这里讲解一下后端实现图片加工的工具库——Thumbnailator


简介:

        Thumbnailator 是一个用来生成图像缩略图的 Java 类库,通过很简单的代码即可生成图片缩略图,也可直接对一整个目录的图片生成缩略图。

        Thumbnailator 能做什么?

        Thumbnailator是一款高性能的java缩略图类库。 支持的处理操作:图片缩放,区域裁剪,水印,旋转,保持比例。


快速入门:

引入依赖:

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

API示例:

图片压缩

方式一:等比例压缩
Thumbnails.of("原图文件的路径").scale(0.5) // 压缩的比例.toFile("压缩后文件的路径");
方式二:指定px值的等比例压缩(不会破坏图片比例,因此如果px值不成比例会与预期有小差距)
Thumbnails.of("原图文件的路径").size(100, 75) // 长宽的px值.toFile("压缩后文件的路径"); 
方式三:非等比例压缩(会破坏图片比例,即图片会受指定的比例变型
Thumbnails.of("原图文件的路径").scale(1.0, 0.5)  // 长宽的比例,非等比例,会导致图片变型.toFile("压缩后文件的路径");

图片旋转

        注意:这里的图片旋转要伴随着一个图片的压缩变量,如果仅仅只是实现图片旋转,可以把压缩比例写为 1

Thumbnails.of("原图文件的路径").scale(0.8) // 等比例缩放的比例.rotate(90) // 旋转的角度,顺时针.toFile("转换后文件的路径");
Thumbnails.of(“原图文件的路径”).size(40,40) // 等比例缩放的具体长宽px值.rotate(90)  // 顺时针旋转的角度.toFile(“转换后文件的路径”);

scale,size 必须有一个有值


加水印 

File image = new File("水印图片地址");
Thumbnails.of("原图文件的路径").scale(0.8)  // 原图压缩的比例// Watermark:添加水印 watermark(位置,水印图,透明度).watermark(Positions.BOTTOM_RIGHT, ImageIO.read(image), 0.5f).toFile("转换后文件的路径");

修改文件格式

Thumbnails.of(“原图文件的路径”).scale(1f) // 原图等比例缩放的比例,1f表示不缩放,不能省略.outputFormat(“jpg”) // 转换后的格式.toFile(“转换后文件的路径”);  // 这里要注意哦,路径最后要写上“生成的文件名.后缀”

        outputFormat:设置转换后图片格式,之前听说该属性设置为png时,scale缩放属性无效,测试用0.4.8的版本已经能正常缩放了


不改变宽高,压缩大小 

Thumbnails.of("原图文件的路径").scale(1f) // 原图等比例缩放的比例,1f表示不缩放,不能省略 .outputQuality(0.5f) // 输出的图片质量,范围:0.0~1.0,1为最高质量,大小最大.toFile("压缩后文件的路径");

综合实战:

import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;
import net.coobird.thumbnailator.name.Rename;
import net.coobird.thumbnailator.resizers.configurations.ScalingMode;
import org.apache.pdfbox.tools.imageio.ImageIOUtil;import javax.imageio.ImageIO;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;/*** @author wzx* @version 1.0* @description 生成缩略图和水印非常好用,具体帮助文档 https://github.com/coobird/thumbnailator/wiki/Maven*              缩略图*              水印*              选择*              格式转换* @Create 2023/8/22*/
public class ThumbnailatorDmo {/*** 使用给定的图片生成指定大小的图片*/private static void generateFixedSizeImage(){try {Thumbnails.of("data/meinv.jpg").size(80,80).toFile("data/newmeinv.jpg");} catch (IOException e) {System.out.println("原因: " + e.getMessage());}}/*** 对原图加水印,然后顺时针旋转90度,最后压缩为80%保存*/private static void generateRotationWatermark(){try {Thumbnails.of("data/2016010208.jpg").size(160,160). // 缩放大小rotate(90). // 顺时针旋转90度watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File("data/newmeinv.jpg")),0.5f). //水印位于右下角,半透明outputQuality(0.8). // 图片压缩80%质量toFile("data/2016010208_new.jpg");} catch (IOException e) {System.out.println("原因: " + e.getMessage());}}/*** 转换图片格式,将流写入到输出流*/private static void generateOutputstream(){try(OutputStream outputStream = new FileOutputStream("data/2016010208_outputstream.png")) { //自动关闭流Thumbnails.of("data/2016010208.jpg").size(500,500).outputFormat("png"). // 转换格式toOutputStream(outputStream); // 写入输出流} catch (IOException e) {System.out.println("原因: " + e.getMessage());}}/*** 按比例缩放图片*/private static void generateScale(){try {Thumbnails.of("data/2016010208.jpg").//scalingMode(ScalingMode.BICUBIC).scale(0.8). // 图片缩放80%, 不能和size()一起使用outputQuality(0.8). // 图片质量压缩80%toFile("data/2016010208_scale.jpg");} catch (IOException e) {System.out.println("原因: " + e.getMessage());}}/*** 生成缩略图到指定的目录*/private static void generateThumbnail2Directory(){try {Thumbnails.of("data/2016010208.jpg","data/meinv.jpg").//scalingMode(ScalingMode.BICUBIC).scale(0.8). // 图片缩放80%, 不能和size()一起使用toFiles(new File("data/new/"), Rename.NO_CHANGE);//指定的目录一定要存在,否则报错} catch (IOException e) {System.out.println("原因: " + e.getMessage());}}/*** 将指定目录下所有图片生成缩略图*/private static void generateDirectoryThumbnail(){try {Thumbnails.of(new File("data/new").listFiles()).//scalingMode(ScalingMode.BICUBIC).scale(0.8). // 图片缩放80%, 不能和size()一起使用toFiles(new File("data/new/"), Rename.SUFFIX_HYPHEN_THUMBNAIL);//指定的目录一定要存在,否则报错} catch (IOException e) {System.out.println("原因: " + e.getMessage());}}
}

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

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

相关文章

机器学习---最大似然估计和贝叶斯参数估计

1. 估计 贝叶斯框架下的数据收集&#xff0c;在以下条件下我们可以设计一个可选择的分类器 : P(wi) (先验)&#xff1b;P(x | wi) (类条件密度) 但是。我们很少能够完整的得到这些信息! 从一个传统的样本中设计一个分类器&#xff1a; ①先验估计不成问题 ②对类条件密度…

苹果企业签名失败常见的问题

苹果企业签名失败的常见问题主要有以下几种&#xff1a; 证书过期或无效&#xff1a;苹果开发者需要定期更新他们的签名证书&#xff0c;以确保其有效性。一旦证书过期&#xff0c;相关应用将无法正常工作。证书不匹配&#xff1a;如果使用的证书与应用程序的Bundle ID不匹配&…

WT588F02B-8S语音芯片支持PWM音频输出的特征优势及应用前景

随着科技的飞速发展&#xff0c;语音芯片作为人机交互的核心组件&#xff0c;在各个领域的应用越来越广泛。而在这些语音芯片中&#xff0c;支持PWM音频输出的特性日益受到关注。本文将探讨语音芯片支持PWM音频输出的特征优势以及其在各个领域的应用前景。 一、特征优势 1、高…

git本地账户如何从一台电脑迁移到另外一台

为了表述方便&#xff0c;我们此处用旧电脑、新电脑指代。 在新电脑上安装git 例如&#xff0c;我旧电脑上安装的git版本是2.33.1版本&#xff0c;新电脑安装git的版本是2.43.0&#xff0c;这不妨碍迁移。 将git的全局配置文件从旧电脑拷贝到新电脑 Git的全局配置文件&…

“关爱零距离.情暖老人心”主题活动

为提高社区老年人的生活质量&#xff0c;促进邻里间的互动与友谊&#xff0c;以及弘扬尊老爱幼的社区精神&#xff0c;11月21日山东省潍坊市金阳公益服务中心、重庆市潼南区同悦社会工作服务中心在潼南区桂林街道东风社区共同在潼南区桂林街道东风社区举办了“关爱零距离.情暖老…

22款奔驰S400L升级原厂360全景影像 高清环绕 无死角

360全景影像影像系统提升行车时的便利&#xff0c;不管是新手或是老司机都将是一个不错的配置&#xff0c;无论是在倒车&#xff0c;挪车以及拐弯转角的时候都能及时关注车辆所处的环境状况&#xff0c;避免盲区事故发生&#xff0c;提升行车出入安全性。 360全景影像包含&…

自学编程,用好这几个网站就够了!

如果你要自学编程&#xff0c;一定要收藏好这7个网站&#xff0c;上面免费的优质教程很多&#xff0c;完全可以省去你上万块钱的学费&#xff01; 话不多说&#xff0c;直接上干货&#xff01; 第一个&#xff0c;W3school 一个主打图文教程的网站&#xff0c;不管是前端开发…

怎样将带表格的图片批量合并转换成word表格?

注&#xff1a;本功能适用于V3.66以上版本的金鸣表格文字识别大师 在日常的办公场景中&#xff0c;我们常常会遇到需要将带有表格类的图片识别成excel的需求。我们知道&#xff0c;普通的OCR软件并不具备识别中文表格的功能&#xff0c;即使有&#xff0c;效果也强差人意&…

JSP:MVC

Web应用 一个好的Web应用&#xff1a; 功能完善 易于实现和维护 易于扩展等 的体系结构 一个Web应用通常分为两个部分&#xff1a; m 1. 由界面设计人员完成的 表示层 &#xff08;主要做网页界面设计&#xff09; m 2. 由程序设计人员实现的 行为层 &#xff08;主要完成本…

SELinux零知识学习二十五、SELinux策略语言之类型强制(10)

接前一篇文章:SELinux零知识学习二十四、SELinux策略语言之类型强制(9) 二、SELinux策略语言之类型强制 3. 访问向量规则 AV规则就是按照对客体类别的访问许可指定具体含义的规则,SELinux策略语言目前支持四类AV规则: allow:表示允许主体对客体执行允许的操作。neveral…

2015年7月8日 Go生态洞察:Go、开源与社区

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

C#面试题3

1.请解释一下C#中的并发编程和线程安全性。 并发编程是指在多线程环境下编写代码以实现并发执行的能力。C#提供了一些机制来支持并发编程&#xff0c;如线程、任务和并行循环等。线程安全性是指在多线程环境下&#xff0c;代码能够正确地处理共享数据并保持一致性。线程安全的代…

基于springboot实现大学生就业服务平台系统项目【项目源码】计算机毕业设计

基于springboot实现大学生就业服务平台系统演示 Java技术 Java是由SUN公司推出&#xff0c;该公司于2010年被oracle公司收购。Java本是印度尼西亚的一个叫做爪洼岛的英文名称&#xff0c;也因此得来java是一杯正冒着热气咖啡的标识。Java语言在移动互联网的大背景下具备了显著…

企业必看的大数据安全极速传输解决方案

在这个大数据时代&#xff0c;企业在享受大数据带来的便利同时&#xff0c;也面临着巨大的挑战&#xff0c;其中最主要的问题就是数据安全方面和传输方面&#xff0c;为了更好地满足企业大数据传输的需求&#xff0c;小编将深入分析企业对于大数据传输面临的挑战和风险以及大数…

【elementui】el-popover在列表里循环使用,取消的doClose无效解决办法

目录 一、需求效果二、代码详情html方法接口 一、需求效果 在使用elementui的Popover 弹出框时&#xff0c;需求是在table列表里使用&#xff0c;循环出来&#xff0c;无法取消。 二、代码详情 html <el-table-column v-if"checkPermission([admin,user:resetPass…

【C++】标准模板库STL作业(其二)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

C 语言文件读写

C 语言文件读写 在本教程中&#xff0c;您将学习如何在C语言中处理文件。您将通过示例学习在C语言中使用fprintf()、fscanf()、fread()、fwrite()、fseek()等处理标准I/O。 文件是计算机存储设备中用于存储数据的容器。 为什么需要文件&#xff1f; 当程序终止时&#xff0…

vue2,vue3使用vuex

vuex vue的状态管理器 1引入vuex npm install vuex2.创建store/index.js文件 在main.js引入 import { createStore } from vuexconst store createStore({state: () > ({})}) export default store3.state 核心, 用于定义数据 state: () > ({count: 0,name: 陆青,age:…

Py之wikipedia-api:wikipedia-api的简介、安装、使用方法之详细攻略

Py之wikipedia-api&#xff1a;wikipedia-api的简介、安装、使用方法之详细攻略 目录 wikipedia-api的简介 wikipedia-api的安装 wikipedia-api的使用方法 1、 创建 Wikipedia并进行查询 wikipedia-api的简介 Wikipedia-API是一个易于使用的Python封装&#xff0c;用于访…

计算机是如何执行指令的

计算机组成 现在所说的计算机基本上都是冯诺依曼体系的计算机。其核心原理&#xff1a; 冯诺依曼计算的核心思想是将程序指令和数据以二进制形式存储存储在同一存储器中&#xff0c;并使用相同的数据格式和处理方式来处理它们。这种存储程序的设计理念使得计算机能够以可编程…