分享

谈谈thumbnails的用法

 贪挽懒月 2022-06-20 发布于广东

前言:

thumbnails是Java一个优秀的图像处理库,可以对图片进行压缩、加水印、裁剪、更改格式等功能。下面为大家介绍使用这个图像处理库。

thumbnails的使用:

一、引入依赖:

  1. <!-- 图片处理 -->

  2.        <dependency>

  3.            <groupId>net.coobird</groupId>

  4.            <artifactId>thumbnailator</artifactId>

  5.            <version>0.4.8</version>

  6.        </dependency>

二、编写工具类:

说明:这个类第一个方法就是设置上传的图片保存的很路径,比如上传的图片都保存在 E:/download/image/目录下;第二个方法就是设置图片保存的子目录,子目录是根据传入的shopId生成的,然后将根目录与子目录拼接起来就是图片的保存路径。1、PathUtil.java:

  1. public class PathUtil {

  2.    // 获取分隔符

  3.    private static String separator = System.getProperty("file.separator");

  4.    /**

  5.     * 图片保存的根目录

  6.     * @return

  7.     */

  8.    public static String getImgBasePath() {

  9.        // 获取操作系统

  10.        String os = System.getProperty("os.name");

  11.        String basePath = "";

  12.        if (os.toLowerCase().startsWith("win")) {

  13.            // "/home/xiangze/image/"

  14.            basePath = "E:/download/image/";

  15.        } else {

  16.            basePath = "/home/ftpuser/images/";

  17.        }

  18.        // 将斜杆替换成分隔符,这样就能保证路径是有效的

  19.        basePath = basePath.replace("/", separator);

  20.        return basePath;

  21.    }

  22.    /**

  23.     * 图片保存的子目录:</br>

  24.     * upload/meilianMall/shop/" + shopId

  25.     * @param shopId

  26.     * @return

  27.     */

  28.    public static String getShopImagePath(long shopId) {

  29.        //  "/upload/item/shop/"+shopId+"/"

  30.        String imagePath = "upload/meilianMall/shop/" + shopId + "/";

  31.        return imagePath.replace("/", separator);

  32.    }

  33. }

说明:这个类就是用thumbnails来处理图片的,进行压缩,然后加水印,然后把经过了处理的图片保存到dest目标路径下。2、ImageUtil.java:

  1. public class ImageUtil {

  2.    // 设置时间格式

  3.    private static final SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");

  4.    // 生成随机数对象

  5.    private static final Random r = new Random();

  6.    // 水映图片位置

  7.    private static String basePath = Thread.currentThread().getContextClassLoader().getResource("").getPath();

  8.    // 日志相关

  9.    private static Logger logger = LoggerFactory.getLogger(ImageUtil.class);

  10.    /**

  11.     * 对图片进行压缩并加水印

  12.     * @param thumbnail

  13.     * @param targetAddr 目标路径

  14.     * @return

  15.     */

  16.    public static String generateThumbnail(File uploadFile,String targetAddr) {

  17.        // 传过来的图片可能是重名的,因此系统随机生成不重复名字

  18.        String realFileName = getRandomFileName();

  19.        // 获取图片扩展名,如jpg,png等

  20.        String extension = getFileExtension(uploadFile);

  21.        // 目标路径可能不存在,不存在就创建

  22.        makeDirPath(targetAddr);

  23.        // 获取图片相对路径(目标路径+随机名+扩展名)

  24.        String relativeAddr = targetAddr + realFileName + extension;

  25.        logger.debug("current relativeAddr is:" + relativeAddr);

  26.        // 新生成文件路径(根路径+targetAddr + realFileName + extension)

  27.        File dest = new File(PathUtil.getImgBasePath() + relativeAddr);

  28.        logger.debug("current complete addr is:" + PathUtil.getImgBasePath() + relativeAddr);

  29.        // 创建缩略图并加水映

  30.        try {

  31.            Thumbnails.of(uploadFile).size(600, 600)

  32.                    .watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File(basePath + "/watermark1.jpg")), 0.25f)

  33.                    .outputQuality(0.8f).toFile(dest);

  34.        } catch (IOException e) {

  35.            logger.error(e.toString());

  36.            e.printStackTrace();

  37.        }

  38.        return relativeAddr;

  39.    }

  40. /**

  41.     * 将CommonsMultipartFile转换成File,</br>

  42.     * 因为springmvc会自动把前端图片封装成CommonsMultipartFile,</br>

  43.     * 上面压缩图片加水映方法可以直接传入CommonsMultipartFile,但是不方便测试,</br>

  44.     * 所以上面方法是用的File,然后用这个方法把前端传入的CommonsMultipartFile转为File

  45.     * @param cFile

  46.     * @return

  47.     */

  48.    public static File transferCommonsMultipartFileToFile(CommonsMultipartFile cFile) {

  49.        File newFile = new File(cFile.getOriginalFilename());

  50.        try {

  51.            cFile.transferTo(newFile);

  52.        } catch (IllegalStateException e) {

  53.            logger.error(e.toString());

  54.            e.printStackTrace();

  55.        } catch (IOException e) {

  56.            logger.error(e.toString());

  57.            e.printStackTrace();

  58.        }

  59.        return newFile;

  60.    }

  61.    /**

  62.     * 生成随机文件名,当前年月日小时分钟秒+五位随机数

  63.     * @param args

  64.     * @throws IOException

  65.     */

  66.    public static String getRandomFileName() {

  67.        // 获取随机五位数

  68.        int rannum = r.nextInt(89999) + 10000;

  69.        // 当前时间

  70.        String nowTimeStr = sDateFormat.format(new Date());

  71.        return nowTimeStr + rannum;

  72.    }

  73.    /**

  74.     * 获取输入文件流的扩展名

  75.     * @param args

  76.     * @throws IOException

  77.     */

  78.    private static String getFileExtension(File uploadFile) {

  79.        String fileName = uploadFile.getName();

  80.        return fileName.substring(fileName.lastIndexOf("."));

  81.    }

  82.    /**

  83.     * 目标路径文件夹不存在就创建

  84.     * @param args

  85.     * @throws IOException

  86.     */

  87.    private static void makeDirPath(String targetAddr) {

  88.        // 文件全路径

  89.        String realFileParentPath = PathUtil.getImgBasePath() + targetAddr;

  90.        File dirPath = new File(realFileParentPath);

  91.        if (!dirPath.exists()) {

  92.            dirPath.mkdirs();

  93.        }

  94.    }

  95. }

三、测试:

1、把水印图片watermark1.jpg添加到 src/test/resources下面。

2、test.java:

  1.    @Test

  2.    public void testAddShop() {

  3.        File shopImg = new File("E:\\download\\image\\windows.jpg");

  4.        ImageUtil.generateThumbnail(shopImg, "\\upload\\");

  5.    }

可以看到图片已经保存在目标路径下了,并且是随机生成的名字。

打开图片可以看到水印已经加上去了,原图大小40kb,操作后的图片大小18k,也经过压缩了。

注意:真正在项目中使用的时候,ImageUtils中可以直接传入MultipartFile对象,这里传入File是为了方便测试。

总结:

thumbnails的使用很简单,就是引入依赖,然后就传一个需要进行操作的图片给它,最后用Thumbnails调方法进行各种操作。上面案例可能看起来有点麻烦,其实上面的其他方法都是准备工作,比如设置图片保存的路径、生成随机文件名、创建目标路径的文件夹等。功能也不止上面演示的那两个,需了解老铁们可以自行百度,网上很多。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约