使用thumbnailator進行圖片處理

服務器端對圖片進行處理的過程可分爲圖片上傳和圖片保存,當服務器端拿到圖片後需要進行處理並保存到服務器上。通過使用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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章