天天看點

Thumbnailator圖檔處理與封裝【源碼】

pom.xml檔案中加載jar包(非maven項目直接下載下傳thumbnailator.jar放入項目路徑下的lib檔案中即可)

<!-- 圖檔處理 -->
		<!-- https://mvnrepository.com/artifact/net.coobird/thumbnailator -->
		<dependency>
			<groupId>net.coobird</groupId>
			<artifactId>thumbnailator</artifactId>
			<version>0.4.8</version>
		</dependency>
		
           

建立class檔案 PathUtil.java

public class PathUtil {
	private static String seperator = System.getProperty("file.separator");
	public static String getImgBasePath() {
		String os = System.getProperty("os.name");
		String basePath = "";
		//如果目前作業系統為Windows作業系統
		if (os.toLowerCase().startsWith("win")) {
			basePath = "D:/projectdev/image";
		} else {
			basePath = "/Users/baidu/work/image";
		}
		basePath = basePath.replace("/", seperator);
		return basePath;
	}
}
           

建立class檔案 ImageUtil.java

package com.imooc.o2o.util;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;

import javax.imageio.ImageIO;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import com.imooc.o2o.dto.ImageHolder;

import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;

public class ImageUtil {
	private static String basePath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
	private static final SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
	private static final Random r = new Random();
	private static Logger logger = LoggerFactory.getLogger(ImageUtil.class);

	/**
	 * 将CommonsMultipartFile轉換成File類
	 * 
	 * @param cFile
	 * @return
	 */
	public static File transferCommonsMultipartFileToFile(CommonsMultipartFile cFile) {
		File newFile = new File(cFile.getOriginalFilename());
		try {
			cFile.transferTo(newFile);
		} catch (IllegalStateException e) {
			logger.error(e.toString());
			e.printStackTrace();
		} catch (IOException e) {
			logger.error(e.toString());
			e.printStackTrace();
		}
		return newFile;
	}

	/**
	 * 處理縮略圖,并傳回新生成圖檔的相對值路徑
	 * 
	 * @param thumbnail
	 * @param targetAddr
	 * @return
	 */
	public static String generateThumbnail(File thumbnail, String targetAddr) {
		// 擷取不重複的随機名
		String realFileName = getRandomFileName();
		// 擷取檔案的擴充名如png,jpg等
		String extension = getFileExtension(thumbnail);
		// 如果目标路徑不存在,則自動建立
		makeDirPath(targetAddr);
		// 擷取檔案存儲的相對路徑(帶檔案名)
		String relativeAddr = targetAddr + realFileName + extension;
		logger.debug("current relativeAddr is :" + relativeAddr);
		// 擷取檔案要儲存到的目标路徑
		File dest = new File(PathUtil.getImgBasePath() + relativeAddr);
		logger.debug("current complete addr is :" + PathUtil.getImgBasePath() + relativeAddr);
		logger.debug("basePath is :" + basePath);
		// 調用Thumbnails生成帶有水印的圖檔
		try {
			Thumbnails.of(thumbnail).size(200, 200)
					.watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File(basePath + "/watermark.jpg")), 0.25f)
					.outputQuality(0.8f).toFile(dest);
		} catch (IOException e) {
			logger.error(e.toString());
			throw new RuntimeException("建立縮略圖失敗:" + e.toString());
		}
		// 傳回圖檔相對路徑位址
		return relativeAddr;
	}


	/**
	 * 建立目标路徑所涉及到的目錄,即/home/work/xiangze/xxx.jpg, 那麼 home work xiangze
	 * 這三個檔案夾都得自動建立
	 * 
	 * @param targetAddr
	 */
	private static void makeDirPath(String targetAddr) {
		String realFileParentPath = PathUtil.getImgBasePath() + targetAddr;
		File dirPath = new File(realFileParentPath);
		if (!dirPath.exists()) {
			dirPath.mkdirs();
		}
	}

	/**
	 * 擷取輸入檔案流的擴充名
	 * 
	 * @param thumbnail
	 * @return
	 */
	private static String getFileExtension(File file) {
		return file.getName().substring(file.getName().lastIndexOf("."));
	}

	/**
	 * 生成随機檔案名,目前年月日小時分鐘秒鐘+五位随機數
	 * 
	 * @return
	 */
	public static String getRandomFileName() {
		// 擷取随機的五位數
		int rannum = r.nextInt(89999) + 10000;
		String nowTimeStr = sDateFormat.format(new Date());
		return nowTimeStr + rannum;
	}

	

	/**
	 * storePath是檔案的路徑還是目錄的路徑, 如果storePath是檔案路徑則删除該檔案,
	 * 如果storePath是目錄路徑則删除該目錄下的所有檔案
	 * 
	 * @param storePath
	 */
	public static void deleteFileOrPath(String storePath) {
		File fileOrPath = new File(PathUtil.getImgBasePath() + storePath);
		if (fileOrPath.exists()) {
			if (fileOrPath.isDirectory()) {
				File files[] = fileOrPath.listFiles();
				for (int i = 0; i < files.length; i++) {
					files[i].delete();
				}
			}
			fileOrPath.delete();
		}
	}
	public static void main(String[] args) throws IOException {
		//String basePath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
		Thumbnails.of(new File("E:/桌面檔案夾/swing 素材/btn/keybtn.png"))// 檔案路徑
				.size(80, 50) // 圖檔大小
				.watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File(basePath + "/watermark.jpg")), 0.25f)// 三個參數分别是 水印的位置,水印圖檔的路徑,透明度
				.outputQuality(0.8f)// 壓縮圖檔的比例
				.toFile("E:/桌面檔案夾/swing 素材/btn/keybtn2.png");//輸出路徑
	}
}