SSM到SpringBoot(校园商铺)
Thumbnailator图片处理和封装
Thumbnailator是一个用来生成图像缩略图的 Java类库,通过很简单的代码即可生成图片缩略图,也可直接对一整个目录的图片生成缩略图。
1、pom.xml中添加依赖
<!-- https://mvnrepository.com/artifact/net.coobird/thumbnailator -->
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
</dependency>
2、在工具类ImageUtil中练习简单使用Thumbnailator
//图片处理的工具类
public class ImageUtil {
//Thumbnailator的简单使用
public static void main(String[] args) throws IOException {
//classPath的绝对值路径
String basePath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
Thumbnails.of(new File("D:/Temp/headPortrait.jpg")) //要处理的图片。
.size(160, 160) //处理后的图片像素
.rotate(90) //旋转角度
//水印 1在原图的哪个区域 2水印图片位置 3清晰度
.watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File(basePath + "waterMark.png")), 0.25f)
.outputQuality(0.8f) //输出图片质量
.toFile("D:/Temp/headPortraitNew.jpg");
System.out.println("添加水印成功!");
}
}
运行main方法;
从上面我们对Thumbnailator的简单使用可以看到我们ImageUtil要用到输入图片路径和输出路径,也就是地址处理。所以我们要编写PathUtil工具类
3、PathUtil
方法一:根据操作系统提供相应的根目录
补充:
System.getPropertys()和System.getProperty()变量所有系统属性的方法。
方法二:图片存储的子路径
package com.hytxwz.o2o.util;
public class PathUtil {
private static String seperator = System.getProperty("file.seperator");
/*
* 根据不同的操作系统返回相应的根路径
*/
public static String getBasePath() {
String basePath = "";
// 获取操作系统的名称
String os = System.getProperty("os.name");
if (os.startsWith("win")) {
// 操作系统是windows
basePath = "D:/projectdev/image/";
} else { // linux or mac
basePath = "/home/hytxwz/image/";
}
// 不同系统的分隔符不同
basePath = basePath.replace("/", seperator);
return basePath;
}
// 店铺图片存储子路径
public static String getShopImagePath() {
return "/upload/item/shop" + seperator;
}
}
4、ImageUtil的基础方法
用于处理的图片是用户传入的文件流,所以方法传入对象为Spring自带的文件处理对象CommonsmultipartFile.
补充:
MultipartFile类中两个方法区别:
1、
getName: 获取表单中文件组件的名字
getOriginalFilename : 获取上传文件的原名
2、
ImageUtil的基础方法:图片处理
//classPath的绝对值路径
private static String basePath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
//日期格式
private static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
//随机数字
private static final Random r = new Random();
/**
* 图片处理方法
* @param thumbnail //传入图片对象是Spring自带的文件处理对象CommonsMultipartFile
* @param targetAddr //目标存储文件夹
* @return
*/
public static String generateThumbnail(CommonsMultipartFile thumbnail, String targetAddr) {
//处理后的图片名称
String realFileName = getRandomFileName();
//获取传入文件的后缀名
String extension = getFileExtension(thumbnail);
//target路径不存在的话创建
makeDirPath(targetAddr);
//相对路径
String relativeAddr = targetAddr + realFileName + extension;
//完整文件存储路径
String dest = PathUtil.getBasePath() + relativeAddr;
try {
Thumbnails.of(thumbnail.getInputStream())
.size(200, 200)
.watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File(basePath + "/waterMark.png")), 0.25f)
.outputQuality(0.8f).toFile(dest);;
} catch (IOException e) {
e.printStackTrace();
}
return "图片处理完成!";
}
/**
* 创建目标路径所涉及到的全部目录
* @param 目标路径
*/
private static void makeDirPath(String targetAddr) {
String realFilePath = PathUtil.getBasePath() + targetAddr;
File dirPath = new File(realFilePath);
if(!dirPath.exists()) {
dirPath.mkdirs();
}
}
/**
* 生成随机文件名 当前时间+五位随机数
* @return 生成的文件名
*/
private static String getRandomFileName() {
Integer ranNum = r.nextInt(89999) + 10000; //10000 - 99999
String currentTime = simpleDateFormat.format(new Date());
return currentTime + ranNum;
}
/**
* 返回传入文件原名
* @param cFile //传入文件
* @return
*/
private static String getFileExtension(CommonsMultipartFile cFile) {
String originalFileName = cFile.getOriginalFilename();
return originalFileName.substring(originalFileName.lastIndexOf("."));
}