图片处理
在项目开发中,我们总是会遇到一些情况,需要接受客户端上传的图片,而客户端上传的图片总是格式不一致,为了方便存储,我们需要对图片进行一些统一处理,如大小压缩,质量压缩,透明度处理,添加水印等等操作。
这时候我们就需要一个工具来帮助我们完成这些事情,而thumbnailator就一个这样的工具。
thumbnailator简介
Thumbnailator 是一个优秀的图片处理的Google开源Java类库。处理效果远比Java API的好。从API提供现有的图像文件和图像对象的类中简化了处理过程,两三行代码就能够从现有图片生成处理后的图片,且允许微调图片的生成方式,同时保持了需要写入的最低限度的代码量。还支持对一个目录的所有图片进行批量处理操作。
支持的处理操作:图片缩放,区域裁剪,水印,旋转,保持比例。
springboot整合thumbnailator
1.引入maven依赖
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
</dependency>
2.编写工具类
package cn.lzx.university_shop.utils;
import cn.lzx.university_shop.dto.ImageTemp;
import net.coobird.thumbnailator.Thumbnails;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
/**
* 图片处理工具类
*/
public class ImageUtils {
private static final SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
private static final Random r = new Random();
private static Logger logger = LoggerFactory.getLogger(ImageUtils.class);
//将前端传来的CommonsMultipartFile转换成File
public static File transToFile(MultipartFile cfile){
String filename = cfile.getOriginalFilename();
File file = new File(filename);
try {
cfile.transferTo(file);
} catch (IOException e) {
e.printStackTrace();
logger.error("图片转换失败:"+e.toString());
}
return file;
}
//上传图片
public static String saveImg(ImageTemp imageTemp, String targetAddr) throws IOException {
//对新生成的文件进行相应处理 规范文件名
String newFileName = getRandomFileName();
String extension = getFileExtension(imageTemp.getImgName());
makeDirPath(targetAddr);
String realAddr = targetAddr + newFileName + extension;
//目标文件
File dest = new File(PathUtils.getImgBasePath()+realAddr);
Thumbnails.of(imageTemp.getInputStream()).size(200,200)
.outputQuality(0.8f)
.toFile(dest);
return PathUtils.getImgBasePath()+realAddr;
}
//删除图片
/**
* storePath是文件路径还是目录路径
* 如果是文件路径则删除该文件
* 如果是目录路径则删除该目录下所有文件
* @param storePath
*/
public static void deleteImg(String storePath){
File fileOrDire = new File(PathUtils.getImgBasePath()+storePath);
if (fileOrDire.exists()){
if (fileOrDire.isDirectory()){
//是目录路径 删除全部文件
File[] files = fileOrDire.listFiles();
for (File file : files){
file.delete();
}
}
//是文件
fileOrDire.delete();
}
}
//创建目标路径上的目录
private static void makeDirPath(String targetAddr) {
String realPath = PathUtils.getImgBasePath()+targetAddr;
File dir = new File(realPath);
if (!dir.exists()){
dir.mkdirs();
}
}
//获取文件扩展名
private static String getFileExtension(String ImageName) {
return ImageName.substring(ImageName.lastIndexOf("."));
}
//生成随机的文件名 随机五位数 + 时间
private static String getRandomFileName() {
//获取随机五位数
int randnum = r.nextInt(89999) + 10000;
String nowTime = sDateFormat.format(new Date());
return nowTime + randnum;
}
//Demo
public static void main(String[] args) throws IOException {
Thumbnails.of(new File("G:\\001.jpg"))
.size(200,200)
.outputQuality(0.8f)
.toFile("C:\\Users\\67409\\Desktop\\图片\\商品缩略图\\demo2.jpg");
}
}