SpringBoot实现图片压缩

最近博客刚开始上线,用java代码开发不是很熟,对于文章的图片上传仅仅只是上传了,没有对图片进行处理,导致博客的页面图片加载太慢太大,今天打算优化一下,在上传图片的时候进行图片压缩,这样虽然破环了原图片的清晰度,单数不影响图片的美感,博客用来作为缩略图正好。今天我们来看一下SpringBoot使用thumbnailator对图片进行压缩。

1.在pom.xml引入thumbnailator依赖

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

2.编写一个工具类这个工具类是为了方便调用,后期可以重复利用PictureUtil类


import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.name.Rename;import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;/*** 图片压缩工具类**/
public class PictureUtil {// 图片默认缩放比率private static final double DEFAULT_SCALE = 0.8d;// 缩略图后缀private static final String SUFFIX = "-thumbnail";/*** 生成缩略图到指定的目录** @param path  目录* @param files 要生成缩略图的文件列表* @throws IOException*/public static List<String> generateThumbnail2Directory(String path, String... files) throws IOException {return generateThumbnail2Directory(DEFAULT_SCALE, path, files);}/*** 生成缩略图到指定的目录** @param scale    图片缩放率* @param pathname 缩略图保存目录* @param files    要生成缩略图的文件列表* @throws IOException*/public static List<String> generateThumbnail2Directory(double scale, String pathname, String... files) throws IOException {Thumbnails.of(files)// 图片缩放率,不能和size()一起使用.scale(scale)// 缩略图保存目录,该目录需存在,否则报错.toFiles(new File(pathname), Rename.SUFFIX_HYPHEN_THUMBNAIL);List<String> list = new ArrayList<>(files.length);for (String file : files) {list.add(appendSuffix(file, SUFFIX));}return list;}/*** 将指定目录下所有图片生成缩略图** @param pathname 文件目录*/public static void generateDirectoryThumbnail(String pathname) throws IOException {generateDirectoryThumbnail(pathname, DEFAULT_SCALE);}/*** 将指定目录下所有图片生成缩略图** @param pathname 文件目录*/public static void generateDirectoryThumbnail(String pathname, double scale) throws IOException {File[] files = new File(pathname).listFiles();compressRecurse(files, pathname);}/*** 文件追加后缀** @param fileName 原文件名* @param suffix   文件后缀* @return*/public static String appendSuffix(String fileName, String suffix) {String newFileName = "";int indexOfDot = fileName.lastIndexOf('.');if (indexOfDot != -1) {newFileName = fileName.substring(0, indexOfDot);newFileName += suffix;newFileName += fileName.substring(indexOfDot);} else {newFileName = fileName + suffix;}return newFileName;}private static void compressRecurse(File[] files, String pathname) throws IOException {for (File file : files) {// 目录if (file.isDirectory()) {File[] subFiles = file.listFiles();compressRecurse(subFiles, pathname + File.separator + file.getName());} else {// 文件包含压缩文件后缀或非图片格式,则不再压缩String extension = getFileExtention(file.getName());if (!file.getName().contains(SUFFIX) && isImage(extension)) {generateThumbnail2Directory(pathname, file.getAbsolutePath());}}}}/*** 根据文件扩展名判断文件是否图片格式** @param extension 文件扩展名* @return*/public static boolean isImage(String extension) {String[] imageExtension = new String[]{"jpeg", "jpg", "gif", "bmp", "png"};for (String e : imageExtension) if (extension.toLowerCase().equals(e)) return true;return false;}public static String getFileExtention(String fileName) {String extension = fileName.substring(fileName.lastIndexOf(".") + 1);return extension;}
}

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

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

相关文章

小红书算法岗面试,面试官还是很喜欢拷打的。。。

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、算法项目落地经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 总结链接如…

Stream练习

运用点&#xff1a; 流内数据类型转换(map)、filter、limit、skip、concat(让两个流合并) 题目&#xff1a; 操作1、2&#xff1a; ArrayList<String> manList new ArrayList<>();ArrayList<String> womanList new ArrayList<>();Collections.addAl…

多模态MLLM都是怎么实现的(11)--从SadTalker到快手LivePortait

我之前出差带休假差不多两个礼拜吧&#xff0c;今天回北京更新一篇 我确实找到了一个有意思的东西&#xff0c;LivePortrait 这东西开源了&#xff0c;你可以认为是目前做得最好的"Sadtalker"&#xff0c;国内也有dream-talker&#xff0c;EMO之类的。 我之前看EMO的…

ETag:Springboot接口如何添加Tag

ETag简介 在Web开发中&#xff0c;ETag&#xff08;Entity Tag&#xff09;是一种HTTP头字段&#xff0c;用于标识特定版本的资源。ETag的主要用途是缓存控制和优化&#xff0c;通过比较客户端和服务器资源的ETag值&#xff0c;可以判断资源是否发生变化&#xff0c;从而避免不…

C++——模板详解(下篇)

一、非类型模板参数 模板参数分为类型形参与非类型形参。 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之后的参数类型名称。 非类型形参&#xff0c;就是用一个常量作为类&#xff08;函数&#xff09;模板的一个参数&#xff0c;在类&#…

kfree_rcu实现浅析

文章http://t.csdnimg.cn/9sS23和http://t.csdnimg.cn/0wa6h分析了rcu的基本实现原理。不过在阅读内核代码的过程中&#xff0c;我们经常能看到函数kfree_rcu()的使用。那么kfree究竟是怎么和rcu联系在一起的呢&#xff1f; 本文分析基于linux内核4.19.195 直接上代码。 /*** …

使用Java实现分布式日志系统

使用Java实现分布式日志系统 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在分布式系统中&#xff0c;日志记录是一项至关重要的任务。它不仅用于故障排查和…

kubernetes集群部署:node节点部署和CRI-O运行时安装(三)

关于CRI-O Kubernetes最初使用Docker作为默认的容器运行时。然而&#xff0c;随着Kubernetes的发展和OCI标准的确立&#xff0c;社区开始寻找更专门化的解决方案&#xff0c;以减少复杂性和提高性能。CRI-O的主要目标是提供一个轻量级的容器运行时&#xff0c;它可以直接运行O…

Mysql--基础知识点--87--分库、分表、分区的情景

MySQL中的分库、分表和分区是数据库优化的重要手段&#xff0c;用于解决数据量增长、性能瓶颈以及高并发等问题。下面将分别说明何时进行分库、分表和分区&#xff1a; 一、分库 何时分库&#xff1a; 并发量高&#xff1a;当数据库的连接数达到上限&#xff0c;且通过调整配…

Docker学习笔记(三)Dockerfile

一、什么是Dockerfile Dockerfile 是一个用于自动化构建 Docker 镜像的文本文件&#xff0c;其中包含了从一个基础镜像开始&#xff0c;到最终形成所需定制镜像的所有指令集。这个文件中的每一条指令都对应着构建镜像过程中的一个步骤或一层&#xff0c;指导 Docker 如何安装软…

【无标题】Jenkins 配置项目打包,基于已有的项目

加粗样式 1.新建任务 德达一体化->新建任务 输入任务名称&#xff08;不可重名&#xff09;&#xff0c;下面任务类型选择复制已有的项目 2.配置任务 2-1. 描述 写该任务的描述 打包记录保存设置 2-2. 源码管理 指定Gitlab地址以及登录用户 指定分支&#xff1a; 例如&a…

PHP智慧门店微信小程序系统源码

&#x1f50d;【引领未来零售新风尚】&#x1f50d; &#x1f680;升级启航&#xff0c;智慧零售新篇章&#x1f680; 告别传统门店的束缚&#xff0c;智慧门店v3微信小程序携带着前沿科技与人性化设计&#xff0c;正式启航&#xff01;这个版本不仅是对过往功能的全面优化&a…

从GREE格力看如何起全球商标名称!

有些主体需要走出去出口到国外&#xff0c;普推商标知产老杨看到在一些海外电商平台的出售产品&#xff0c;也会需要英文商标&#xff0c;有的会申请申请注册中英结合商标&#xff0c;在国外申请注册也是比较方便。 格力开始想用“GLEE”(快乐)这个词作为商标名称&#xff0c;但…

【JavaWeb程序设计】JSP编程II

目录 一、输入并运行下面的import_test.jsp页面 1.1 代码运行结果 1.2 修改编码之后的运行结果 二、errorPage属性和isErrorPage属性的使用 2.1 下面的hello.jsp页面执行时将抛出一个异常&#xff0c;它指定了错误处理页面为errorHandler.jsp。 2.1.2 运行截图 2.2 下面…

医疗器械FDA | FDA如何对医疗器械网络安全认证进行审查?

FDA医械网络安全文件出具​https://link.zhihu.com/?targethttps%3A//www.wanyun.cn/Support%3Fshare%3D24315_ea8a0e47-b38d-4cd6-8ed1-9e7711a8ad5e FDA对医疗器械的网络安全认证进行审查时&#xff0c;主要关注以下几个方面&#xff0c;以确保医疗器械在网络环境中的安全性…

模板语句——02

模板语句的数据来源 1.谁可以给模板语句提供数据支持&#xff1f; data选项 2.data选项的类型是什么&#xff1f; Object | Function (对象或者函数) 3.data配置项的专业叫法&#xff1a;vue 实例的数据对象。&#xff08;data实际上是给整个&#xff09;vue实例提供数据的来…

2 极/2 零 (2P2Z) 补偿器

极/2 零 &#xff08;2P2Z&#xff09; 补偿器是模拟 II 型控制器的数字实现。它是一种滤波器&#xff0c;通过考虑两个极点和一个零点&#xff0c;将特定的增益和相位升压引入系统。您必须战略性地选择每个极点和零点的频率位置&#xff0c;这将有助于实现所需的系统性能。在该…

团队编程:提升代码质量与知识共享的利器

目录 前言1. 什么是团队编程&#xff1f;1.1 团队编程的起源1.2 团队编程的工作流程 2. 团队编程的优势2.1 提高代码质量2.2 促进知识共享2.3 增强团队协作2.4 提高开发效率 3. 团队编程的挑战3.1 开发成本较高3.2 需要良好的团队协作3.3 个人风格和习惯的差异3.4 长时间的集中…

[C++][CMake][生成可执行文件][下]详细讲解

目录 1.搜索文件1.aux_source_directory2.file 2.包含头文件3.变量操作1.追加1.使用set拼接2.使用list拼接 2.字符串移除3.list其他操作 4.宏定义5.预定义宏 1.搜索文件 如果一个项目里边的源文件很多&#xff0c;在编写CMakeLists.txt文件的时候不可能将项目目录的各个文件一…

大数据期末复习——hadoop、hive等基础知识

一、题型分析 1、Hadoop环境搭建 2、hadoop的三大组件 HDFS&#xff1a;NameNode&#xff0c;DataNode&#xff0c;SecondaryNameNode YARN&#xff1a;ResourceManager&#xff0c;NodeManager &#xff08;Yarn的工作原理&#xff09; MapReduce&#xff1a;Map&#xff0…