springboot整合thumbnailator实现图片压缩
前言
最近由于首页产品列表图片显示太慢,经过研究发现是用户上传的图片太大。
针对这个问题,想到的解决方案是:
1、 产品上传时,限定图片上传大小不超过2m
2、 上传成功后将产品图片进行压缩,但是保留原图片,压缩后的图片名称添加后缀”-thumbnail”
3、 对已经上传的产品图片全部进行压缩
4、 前端只有在点击查看产品大图时显示原图,其他情况均显示缩略图
实现
根据需求,找到的解决方法是使用net.coobird.thumbnailator依赖包,实现图片压缩和将指定目录下的图片全部压缩的功能
引入maven依赖
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
</dependency>
具体实现
ImageUtil类
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; /**
* 图片压缩工具类
*
* @author lnj
* createTime 2018-10-19 15:31
**/
public class ImageUtil { // 图片默认缩放比率
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;
}
}
测试
import org.junit.Test; import java.io.IOException;
import java.util.List; /**
* @author lnj
* createTime 2018-10-19 15:39
**/
public class ImageUtilTest { /**
* 测试在指定目录下生成缩略图
*/
@Test
public void testGenerateThumbnail2Directory() throws IOException {
String path = "D:\\workspace\\idea\\individual\\springboot-learn\\springboot-thumbnail\\image";
String[] files = new String[]{
"image/1.jpg",
"image/2.jpg"
}; List<String> list = ImageUtil.generateThumbnail2Directory(path, files);
System.out.println(list);
} /**
* 将指定目录下的图片生成缩略图
*/
@Test
public void testGenerateDirectoryThumbnail() throws IOException {
String path = "D:\\workspace\\idea\\individual\\springboot-learn\\springboot-thumbnail\\image";
ImageUtil.generateDirectoryThumbnail(path);
}
}
代码下载地址
https://github.com/linj6/springboot-learn/tree/master/springboot-thumbnail
参考资料
https://juejin.im/post/5b138045f265da6e603934ab#comment
springboot整合thumbnailator实现图片压缩的更多相关文章
-
Thumbnailator java图片压缩,加水印,批量生成缩略图
地址:http://code.google.com/p/thumbnailator/ 1.指定大小进行缩放 //size(宽度, 高度) /* * 若图片横比200小,高比300小,不变 * 若图片横 ...
-
SpringBoot整合FastDFS实现图片的上传
文件的上传和预览在web开发领域是随处可见,存储的方式有很多,本文采用阿里巴巴余庆大神开发的FastDFS进行文件的存储,FastDFS是一个分布式文件存储系统,可以看我上一篇博文,有安装和配置教程 ...
-
Java使用google开源工具Thumbnailator实现图片压缩
<dependency> <groupId>net.coobird</groupId> <artifactId>thumbnailator</ar ...
-
玩转 SpringBoot2.x 之整合 thumbnailator 图片处理
1.序 在实际项目中,有时为了响应速度,难免会对一些高清图片进行一些处理,比如图片压缩之类的,而其中压缩可能就是最为常见的.最近,阿淼就被要求实现这个功能,原因是客户那边嫌速度过慢.借此机会,阿淼今儿 ...
-
四:Java使用google的thumbnailator工具对图片压缩水印等做处理
Thumbnailator是一个非常好的图片开源工具 使用方法: 在pom中加入以下jar包 <!-- 图片缩略图 图片压缩 水印 start--> <dependency>& ...
-
分布式文件系统FastDFS简介、搭建、与SpringBoot整合实现图片上传
之前大学时搭建过一个FastDFS的图片服务器,当时只是抱着好奇的态度搭着玩一下,当时搭建采用了一台虚拟机,tracker和storage服务在一台机器上放着,最近翻之前的博客突然想着在两台机器上搭建 ...
-
很详细的SpringBoot整合UEditor教程
很详细的SpringBoot整合UEditor教程 2017年04月10日 20:27:21 小宝2333 阅读数:21529 版权声明:本文为博主原创文章,未经博主允许不得转载. https: ...
-
Java后端实现图片压缩技术
今天来说说图片压缩技术,为什么要使用图片压缩,图片上传不就完事了吗?对的,这在几年前可以这么说,因为几年前还没有现在这么大的并发,也没有现在这么关注性能. 如今手机很多,很多人都是通过手机访问网络或者 ...
-
SpringBoot整合Jsp和Thymeleaf (附工程)
前言 本篇文章主要讲述SpringBoot整合Jsp以及SpringBoot整合Thymeleaf,实现一个简单的用户增删改查示例工程.事先说明,有三个项目,两个是单独整合的,一个是将它们整合在一起的 ...
随机推荐
-
Java 13 字符串
1 String对象不可变 每一个修改String值的方法 实际上都是创建一个全新的String对象 public class Immutable { public static String upc ...
-
基础框架Fundation和UIkit框架的定义和使用
Foundation 框架为所有应用程序提供基本的系统服务 您的应用程序以及 UIKit 和其他框架,都建立在 Foundation 框架的基础结构之上.Foundation 框架提供许多基本的对象类 ...
-
学习C++ Primer 的个人理解(一)
<C++ Primer>这本书可以说是公认的学习C++最好的书,但我觉得不是特别适合作为教材,书中内容的顺序让人有些蛋疼.我个人认为初学此书是不能跳着看的.如果急于上手的话,我更推荐< ...
-
1、什么是Lucene,Lucene能干什么
1.什么是lucene Lucene是一个全文搜索框架,而不是应用产品.因此它并不像http://www.baidu.com/ 或者google Desktop那么拿来就能用,它只是提供了一种工具让 ...
-
(白书训练计划)UVa 120 Stacks of Flapjacks(构造法)
题目地址:UVa 120 水题. 从最大的開始移,每次都把大的先翻到最上面,再翻到以下. 代码例如以下: #include <iostream> #include <cstdio&g ...
-
Matlab.NET混合编程技巧之——找出Matlab内置函数
原文:[原创]Matlab.NET混合编程技巧之--找出Matlab内置函数 Matlab与.NET的混合编程,掌握了基本过程,加上一定的开发经验和算法基础,肯定不难.反之,有时候一个小错误,可能抓破 ...
-
大赛获奖选手专访 | 冷燕冰:最佳设计奖TIMING里的时机和时序
Mockplus三周年原型设计大赛,从筹备到11月21日完美落幕,50余天的时光,已成为过去.这场近千人参赛的原型设计大赛,我想,无论是于主办方,于参赛选手,于专家评委,还是于每一个关注和参与的人,都 ...
-
JMETER content-type增加
Jmeter—3 http请求—content-type与参数 本文讲三种content-type以及在Jmeter中对应的参数输入方式 第一部分:目前工作中涉及到的content-type 有三种: ...
-
键盘键码Key Code
来源:https://www.cambiaresearch.com/articles/15/javascript-char-codes-key-codes Key Code backspace 8 t ...
-
gentoo raid1
参考 gentoo wiki,和其他网页,实现两个硬盘组成 raid1. 两个硬盘一个是 sdc,一个是 sdd,都是 4T容量. 首先内核开启 Autodetect RAID arrays duri ...