thumbnails图像处理库的使用

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

thumbnails的使用:


一、引入依赖:

<!-- 图片处理 -->
        <dependency>
            <groupId>net.coobird</groupId>
            <artifactId>thumbnailator</artifactId>
            <version>0.4.8</version>
        </dependency>


二、编写工具类:


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


1、PathUtil.java:

public class PathUtil {
    // 获取分隔符
    private static String separator = System.getProperty("file.separator");
    /**
     * 图片保存的根目录
     * @return
     */
    public static String getImgBasePath() {
        // 获取操作系统
        String os = System.getProperty("os.name");
        String basePath = "";
        if (os.toLowerCase().startsWith("win")) {
            // "/home/xiangze/image/"
            basePath = "E:/download/image/";
        } else {
            basePath = "/home/ftpuser/images/";
        }
        // 将斜杆替换成分隔符,这样就能保证路径是有效的
        basePath = basePath.replace("/", separator);
        return basePath;
    }
    /**
     * 图片保存的子目录:</br>
     * upload/meilianMall/shop/" + shopId
     * @param shopId
     * @return
     */
    public static String getShopImagePath(long shopId) {
        //  "/upload/item/shop/"+shopId+"/"
        String imagePath = "upload/meilianMall/shop/" + shopId + "/";
        return imagePath.replace("/", separator);
    }
}


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


2、ImageUtil.java:

public class ImageUtil {
    // 设置时间格式
    private static final SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
    // 生成随机数对象
    private static final Random r = new Random();
    // 水映图片位置
    private static String basePath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
    // 日志相关
    private static Logger logger = LoggerFactory.getLogger(ImageUtil.class);
    /**
     * 对图片进行压缩并加水印
     * @param thumbnail
     * @param targetAddr 目标路径
     * @return
     */
    public static String generateThumbnail(File uploadFile,String targetAddr) {
        // 传过来的图片可能是重名的,因此系统随机生成不重复名字
        String realFileName = getRandomFileName();
        // 获取图片扩展名,如jpg,png等
        String extension = getFileExtension(uploadFile);
        // 目标路径可能不存在,不存在就创建
        makeDirPath(targetAddr);
        // 获取图片相对路径(目标路径+随机名+扩展名)
        String relativeAddr = targetAddr + realFileName + extension;
        logger.debug("current relativeAddr is:" + relativeAddr);
        // 新生成文件路径(根路径+targetAddr + realFileName + extension)
        File dest = new File(PathUtil.getImgBasePath() + relativeAddr);
        logger.debug("current complete addr is:" + PathUtil.getImgBasePath() + relativeAddr);
        // 创建缩略图并加水映
        try {
            Thumbnails.of(uploadFile).size(600, 600)
                    .watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File(basePath + "/watermark1.jpg")), 0.25f)
                    .outputQuality(0.8f).toFile(dest);
        } catch (IOException e) {
            logger.error(e.toString());
            e.printStackTrace();
        }
        return relativeAddr;
    }
/**
     * 将CommonsMultipartFile转换成File,</br>
     * 因为springmvc会自动把前端图片封装成CommonsMultipartFile,</br>
     * 上面压缩图片加水映方法可以直接传入CommonsMultipartFile,但是不方便测试,</br>
     * 所以上面方法是用的File,然后用这个方法把前端传入的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 args
     * @throws IOException
     */
    public static String getRandomFileName() {
        // 获取随机五位数
        int rannum = r.nextInt(89999) + 10000;
        // 当前时间
        String nowTimeStr = sDateFormat.format(new Date());
        return nowTimeStr + rannum;
    }
    /**
     * 获取输入文件流的扩展名
     * @param args
     * @throws IOException
     */
    private static String getFileExtension(File uploadFile) {
        String fileName = uploadFile.getName();
        return fileName.substring(fileName.lastIndexOf("."));
    }
    /**
     * 目标路径文件夹不存在就创建
     * @param args
     * @throws IOException
     */
    private static void makeDirPath(String targetAddr) {
        // 文件全路径
        String realFileParentPath = PathUtil.getImgBasePath() + targetAddr;
        File dirPath = new File(realFileParentPath);
        if (!dirPath.exists()) {
            dirPath.mkdirs();
        }
    }
}


三、测试:


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


2、test.java:

@Test
    public void testAddShop() {
        File shopImg = new File("E:\\download\\image\\windows.jpg");
        ImageUtil.generateThumbnail(shopImg, "\\upload\\");
    }


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


image.png

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


image.png


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


总结:


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




相关文章
|
存储 Java API
阿里高级技术专家谈开源DDD框架:COLA4.1,分离架构和组件(下)
阿里高级技术专家谈开源DDD框架:COLA4.1,分离架构和组件(下)
11077 8
阿里高级技术专家谈开源DDD框架:COLA4.1,分离架构和组件(下)
|
缓存 Linux 开发工具
CentOS 7- 配置阿里镜像源
阿里镜像官方地址http://mirrors.aliyun.com/ 1、点击官方提供的相应系统的帮助 :2、查看不同版本的系统操作: 下载源1、安装wget yum install -y wget2、下载CentOS 7的repo文件wget -O /etc/yum.
255388 0
|
12月前
|
安全 网络安全 数据安全/隐私保护
Docker Swarm网络配置
【10月更文挑战第8天】
455 1
|
11月前
|
Kubernetes 监控 Java
如何设置 Kubernetes的垃圾回收策略为定期
如何设置 Kubernetes的垃圾回收策略为定期
|
SQL 缓存 安全
深入解析MyBatis-Plus LambdaQueryWrapper与QueryWrapper:高效数据查询的秘密
深入解析MyBatis-Plus LambdaQueryWrapper与QueryWrapper:高效数据查询的秘密
13045 2
|
Docker 容器
Docker安装及镜像源修改
本文介绍了Docker的安装过程和如何修改Docker镜像源以加速下载。包括更新系统包、安装所需软件包、设置yum源、安装Docker以及验证安装是否成功。接着,提供了修改Docker镜像源的步骤,包括创建配置文件、编辑配置文件以设置镜像加速地址,并提供了几个常用的国内镜像源地址。最后,通过重启Docker服务和检查配置是否生效来完成镜像源的修改。
Docker安装及镜像源修改
|
消息中间件 存储 Kubernetes
k8s快速部署rocketMq及rocketMq-console-ng
k8s快速部署rocketMq及rocketMq-console-ng
1330 0
|
测试技术 Python Java
《手把手教你》系列技巧篇(六十一)-java+ selenium自动化测试 - 截图三剑客 -下篇(详细教程)
【6月更文挑战第2天】本文介绍了使用Java + Selenium进行自动化测试时如何截图指定元素或目标区域。通过访问百度首页,点击设置并进入搜索设置页面,然后调用截图类截取并保存该页面的特定部分。代码示例展示了如何捕获元素的图像,并提供了截图功能的实现。最终,文章还展示了代码运行后的控制台输出、保存的截图以及浏览器的实际操作效果。
196 0
|
弹性计算 缓存 运维
Nginx 安装 SSL 配置 HTTPS 超详细完整教程全过程
说到 Nginx 服务器,最大特点就是轻量级和高性能。通过在几台不同的服务器上进行测试,发现它的并发能力特别强,并且相对而言吃的内存少很多。目前已是绝大多数站长的首选 HTTP 和反向代理服务器。
69931 2
|
Java 调度 Docker
Spring Boot 3 整合 xxl-job 实现分布式定时任务调度,结合 Docker 容器化部署(图文指南)
Spring Boot 3 整合 xxl-job 实现分布式定时任务调度,结合 Docker 容器化部署(图文指南)
Spring Boot 3 整合 xxl-job 实现分布式定时任务调度,结合 Docker 容器化部署(图文指南)