在 Spring Boot 开发过程中,常常遇到图片处理的情况,我推荐使用 Thumbnailator 图片处理库。

Thumbnailator 是一个优秀的图片处理的开源 Java 类库,处理效果极好,从API提供现有的图像文件和图像对象的类中简化了处理过程,两三行代码就能够从现有图片生成处理后的图片,且允许微调图片的生成方式,同时保持了需要写入的最低限度的代码量。还支持对一个目录的所有图片进行批量处理操作,下边就和大家分享一下 Spring 框架下使用 Thumbnailator 做图片各种处理的方法。

首先放上需要处理的两张原图:umbrella_1366x768.jpg 和 mark.png



pom.xml 中引入依赖包

<dependency>
    <groupId>net.coobird</groupId>
    <artifactId>thumbnailator</artifactId>
    <version>0.4.8</version>
</dependency>

编写测试类:

@Test
public void a() throws IOException {
    // 原图
    String path1 = "D:/temp/umbrella_1366x768.jpg";

    /**
     * 按比例,指定大小进行缩放
     * 若图片横比200小,高比300小,不变
     * 若图片横比200小,高比300大,高缩小到300,图片比例不变
     * 若图片横比200大,高比300小,横缩小到200,图片比例不变
     * 若图片横比200大,高比300大,图片按比例缩小,横为200或高为300
     */
    Thumbnails.of(path1).size(300, 200).toFile("D:/temp/umbrella_300x200.jpg");

    /**
     * 不按照比例,指定大小进行缩放
     * keepAspectRatio(false) 默认是按照比例缩放的
     */
    Thumbnails.of(path1)
            .size(300, 200)
            .keepAspectRatio(false)
            .toFile("D:/temp/umbrella_300x200F.jpg");

    /**
     * 单个图片等比例缩放
     * 3.0是一个double类型的数字,缩放比例,大于1就是变大,小于1就是缩小
     */
    Thumbnails.of(new FileInputStream(path1))
            .scale(3.0)
            .toFile("D:/temp/umbrella_scalex3.jpg");

    Thumbnails.of(new FileInputStream(path1))
            .scale(0.5)
            .toFile("D:/temp/umbrella_scalex0.5.jpg");

    /**
     * 控制图片质量,图片尺寸不变
     */
    Thumbnails.of(path1)
            .scale(1f)
            .outputQuality(0.25f)
            .toFile("D:/temp/umbrella_qualityx0.25.jpg");

    /**
     * 给图片加水印
     * watermark(位置,水印图,透明度)
     */
    Thumbnails.of(path1)
            .scale(1f)
            .watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File("D:/temp/mark.png")), 0.5f)
            .toFile("D:/temp/umbrella_watermark.jpg");
    /**
     * 旋转图片
     */
    Thumbnails.of(path1).scale(1f).rotate(180).toFile("D:/temp/umbrella_rotate.jpg");

    /**
     * 裁剪图片
     */
    // 图片右下400*400的区域
    Thumbnails.of(path1)
            .sourceRegion(Positions.BOTTOM_RIGHT, 400, 400)
            .size(200, 200)
            .keepAspectRatio(false)
            .toFile("D:/temp/umbrella_right1.jpg");

    // 指定坐标
    Thumbnails.of(path1)
            .sourceRegion(600, 500, 400, 400)
            .size(200, 200)
            .keepAspectRatio(false)
            .toFile("D:/temp/umbrella_right2.jpg");

    /**
     * 图像的格式转换
     * outputFormat(图像格式)
     */
    Thumbnails.of(path1)
            .size(400, 300)
            .outputFormat("png")
            .toFile("D:/temp/umbrella_output.png");

    Thumbnails.of(path1)
            .size(400, 300)
            .outputFormat("gif")
            .toFile("D:/temp/umbrella_output.gif");

    // 输出到BufferedImage
    BufferedImage img = Thumbnails.of(path1)
            .size(400, 300)
            .asBufferedImage();
}

D:/temp 目录生成的图片如下:



测试类中最后一个 BufferedImage 类型: