Thumbnailator 是 Google 开源的图片处理库,支持:图片缩放,区域裁剪,水印,旋转,保持比例。详细介绍可以百度或官网,话不多说,直接上代码,具体要结合自己的业务需要进行使用(有些复杂场景比如 旋转+缩放+裁剪+水印 难吗?)。


1 代码示例

1.1 新建一个 springboot 项目

1.2 引入依赖 thumbnailator

        <dependency>

            <groupId>net.coobird</groupId>

            <artifactId>thumbnailator</artifactId>

            <version>0.4.8</version>

        </dependency>

 

1.3 controller

@RestController

public class ThumbnailsController {

    @Resource

    private IThumbnailsService thumbnailsService;


    /**

     * 指定大小缩放

     */

    @GetMapping("/changeSize")

    public String changeSize(MultipartFile resource, int width, int height) {

        String toFile = "C:\\Users\\Administrator\\Desktop\\thumbnailator\\changeSize";

        return thumbnailsService.changeSize(resource, width, height, toFile);

    }


    /**

     * 指定比例缩放

     */

    @GetMapping("/changeScale")

    public String changeScale(MultipartFile resource, double scale) {

        String toFile = "C:\\Users\\Administrator\\Desktop\\thumbnailator\\changeScale";

        return thumbnailsService.changeScale(resource, scale, toFile);

    }


    /**

     * 添加水印 watermark(位置,水印,透明度)

     */

    @GetMapping("/watermark")

    public String watermark(MultipartFile resource, Positions center, MultipartFile watermark, float opacity) {

        String toFile = "C:\\Users\\Administrator\\Desktop\\thumbnailator\\watermark";

        return thumbnailsService.watermark(resource, Positions.CENTER, watermark, opacity, toFile);

    }


    /**

     * 图片旋转 rotate(度数),顺时针旋转

     */

    @GetMapping("/rotate")

    public String rotate(MultipartFile resource, double rotate) {

        String toFile = "C:\\Users\\Administrator\\Desktop\\thumbnailator\\rotate";

        return thumbnailsService.rotate(resource, rotate, toFile);

    }


    /**

     * 图片裁剪

     */

    @GetMapping("/region")

    public String region(MultipartFile resource, Positions center, int width, int height) {

        String toFile = "C:\\Users\\Administrator\\Desktop\\thumbnailator\\region";

        return thumbnailsService.region(resource, Positions.CENTER, width, height, toFile);

    }

}

 

2 功能实现

这是实现类里每个方法的代码+postman测试(测试结果不再贴出来了,大家可以自行测试)。


2.1 指定大小缩放

/**

 * 指定大小缩放 若图片横比width小,高比height小,放大 

 * 若图片横比width小,高比height大,高缩小到height,图片比例不变

 * 若图片横比width大,高比height小,横缩小到width,图片比例不变 

 * 若图片横比width大,高比height大,图片按比例缩小,横为width或高为height

 * 

 * @param resource  源文件路径

 * @param width     宽

 * @param height    高

 * @param tofile    生成文件路径

 */

    @Override

    public String changeSize(MultipartFile resource, int width, int height, String toFile) {

        try {

            Thumbnails.of(resource.getInputStream()).size(width, height).outputFormat("jpg").toFile(toFile);

        } catch (IOException e) {

            e.printStackTrace();

        }

        return "changeSize";

    }

 


image.png

2.2 指定比例缩放

/**

 * 指定比例缩放 scale(),参数小于1,缩小;大于1,放大

 * 

 * @param resource   源文件路径

 * @param scale      指定比例

 * @param tofile     生成文件路径

 */

    @Override

    public String changeScale(MultipartFile resource, double scale, String toFile) {

        try {

            Thumbnails.of(resource.getInputStream()).scale(scale).toFile(toFile);

        } catch (IOException e) {

            e.printStackTrace();

        }

        return "changeScale";

    }

 

image.png

2.3 添加水印

/**

 * 添加水印 watermark(位置,水印,透明度)

 * 

 * @param resource  源文件路径

 * @param center    水印位置

 * @param shuiyin   水印文件路径

 * @param opacity   水印透明度

 * @param tofile    生成文件路径

 */

    @Override

    public String watermark(MultipartFile resource, Positions center, MultipartFile watermark, float opacity, String toFile) {

        try {

            Thumbnails.of(resource.getInputStream()).scale(1).watermark(center, ImageIO.read(watermark.getInputStream()), opacity).toFile(toFile);

        } catch (IOException e) {

            e.printStackTrace();

        }

        return "watermark";

    }

 

image.png


2.4 图片旋转

/**

 * 图片旋转 rotate(度数),顺时针旋转

 * 

 * @param resource  源文件路径

 * @param rotate    旋转度数

 * @param tofile    生成文件路径

 */

    @Override

    public String rotate(MultipartFile resource, double rotate, String toFile) {

        try {

            Thumbnails.of(resource.getInputStream()).scale(1).rotate(rotate).toFile(toFile);

        } catch (IOException e) {

            e.printStackTrace();

        }

        return "rotate";

    }

 image.png


2.5 图片裁剪

/**

 * 图片裁剪 sourceRegion()有多种构造方法,示例使用的是sourceRegion(裁剪位置,宽,高)

 * 

 * @param resource  源文件路径

 * @param center    裁剪位置

 * @param width     裁剪区域宽

 * @param height    裁剪区域高

 * @param tofile    生成文件路径

 */

    @Override

    public String region(MultipartFile resource, Positions center, int width, int height, String toFile) {

        try {

            Thumbnails.of(resource.getInputStream()).scale(1).sourceRegion(center, width, height).toFile(toFile);

        } catch (IOException e) {

            e.printStackTrace();

        }

        return "region";

    }

 image.png


说明:


1.keepAspectRatio(boolean arg0) 图片是否按比例缩放(宽高比保持不变)默认 true

2.outputQuality(float arg0) 图片质量

3.outputFormat(String arg0) 格式转换

小结

需要注意的是,若 png、gif 格式图片中含有透明背景,使用该工具压缩处理后背景会变成黑色。



————————————————

版权声明:本文为CSDN博主「シ風箏」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_39168541/article/details/117436651