服務器端對圖片進行處理的過程可分爲圖片上傳和圖片保存,當服務器端拿到圖片後需要進行處理並保存到服務器上。通過使用thumbnailator庫可以便捷地實現對圖片的操作。如下所示通過maven引入該依賴
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.11</version>
</dependency>
如下所示,在ImageUtil類中,實現generateThumbnail()方法來形成一個縮略圖並保存到服務器,首先調用makeDir創建保存圖片的目標文件夾,makeDir()會拼接出保存圖片的絕對路徑,如果該文件夾不存在則創建。然後調用FileUtil的getRandomFilename()生成隨意文件名字符串,這樣做是爲了防止同名圖片文件。通過getFileExtension()獲得文件擴展名並和targetAddr、filename拼接爲文件的相對路徑,再加上ImgFolder得到絕對路徑。
之後調用Thumbnails對象對圖片進行操作:of()獲取原圖片源,size()調整圖片大小,outputQuality()對圖片進行壓縮、watermark添加水印,toFile()保存圖片結果。
package com.tory.shop.util;
import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class ImageUtil {
public static String generateThumbnail(CommonsMultipartFile imgFile,String targetAddr){
makeDir(targetAddr); //創建保存圖片的目標文件夾
String filename=FileUtil.getRandomFilename(); //返回隨機文件名
String extension=FileUtil.getFileExtension(imgFile); //獲得文件擴展名
String relativePath=targetAddr+filename+extension;
String absolutePath=FileUtil.getImgFolder()+relativePath; //拼接得到存儲文件的絕對路徑
try {
BufferedImage watermark= ImageIO.read(new File(FileUtil.getImgFolder()+"watermark.png"));
Thumbnails.of(imgFile.getInputStream()) //獲取原圖片
.size(200,200) //調整圖片大小
.outputQuality(0.25) //壓縮圖片大小
.watermark(Positions.BOTTOM_RIGHT,watermark,0.25f) //添加水印
.toFile(new File(absolutePath)); //輸出目標文件
} catch (IOException e) {
throw new RuntimeException("創建縮略圖失敗:" + e.toString());
}
return relativePath; //返回生成圖片的相對路徑
}
//創建保存圖片的目標文件夾
private static void makeDir(String targetAddr){
String absolutePath=FileUtil.getImgFolder()+targetAddr;
File targetFile=new File(absolutePath);
if (!targetFile.exists())
targetFile.mkdirs();
}
}
如下所示爲實現ImageUtil方法時用到的FileUtil類,隨機文件名是指通過Random生成五位隨機數,然後再拼接上時間字符串來保證圖片名不會相同衝突。
文件擴展名即文件名最後一個“."之後的字符串
getImgFolder()用於返回圖片根目錄,不同服務器的圖片存放位置可能不同,而且Windows和Linux文件分隔符可能也不一樣,Windows是“\”,Linux是“/”,因此要針對不同服務器進行替換處理。
package com.tory.shop.util;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
public class FileUtil {
private static String fileSeparator = System.getProperty("file.separator");
//返回隨機文件名
public static String getRandomFilename() {
int randomNum = new Random().nextInt(9999) + 10000; //生成五位的隨機數
String timeStr = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
return timeStr + randomNum;
}
//獲取文件擴展名
public static String getFileExtension(CommonsMultipartFile file) {
String filename = file.getOriginalFilename();
return filename.substring(filename.lastIndexOf('.'));
}
//返回項目圖片存放根目錄
public static String getImgFolder() {
String imgFolder = "";
if (System.getProperty("os.name").toLowerCase().startsWith("win"))
imgFolder = "D:/Java/Web/ShopDemo/images/";
imgFolder = imgFolder.replace("/", fileSeparator); //根據不同系統替換文件分割符
return imgFolder;
}
}