【Thumbnailator】图片压缩、水印、格式修改一网打尽

 前言:

        对于javaweb服务端开发人员,图片资源的管理总是绕不开的一环。很多网站上都会提供上传图片这个功能,而现代数码设备拍摄出来的都是高清图片,分辨率很高,占用的空间也很大。物理存储的问题还算容易解决,但是网络带宽太紧张了。一个页面动则就几十M,那加载速度,想想也是够了,所以图片的压缩就必不可少了,对于图片的加工,前后端都可以实现,这里讲解一下后端实现图片加工的工具库——Thumbnailator


简介:

        Thumbnailator 是一个用来生成图像缩略图的 Java 类库,通过很简单的代码即可生成图片缩略图,也可直接对一整个目录的图片生成缩略图。

        Thumbnailator 能做什么?

        Thumbnailator是一款高性能的java缩略图类库。 支持的处理操作:图片缩放,区域裁剪,水印,旋转,保持比例。


快速入门:

引入依赖:


  net.coobird
  thumbnailator
  0.4.8


API示例:

图片压缩

方式一:等比例压缩
Thumbnails.of("原图文件的路径")
        .scale(0.5) // 压缩的比例
        .toFile("压缩后文件的路径");
方式二:指定px值的等比例压缩(不会破坏图片比例,因此如果px值不成比例会与预期有小差距)
Thumbnails.of("原图文件的路径")
    .size(100, 75) // 长宽的px值
    .toFile("压缩后文件的路径"); 
方式三:非等比例压缩(会破坏图片比例,即图片会受指定的比例变型
Thumbnails.of("原图文件的路径")
    .scale(1.0, 0.5)  // 长宽的比例,非等比例,会导致图片变型
    .toFile("压缩后文件的路径");

图片旋转

        注意:这里的图片旋转要伴随着一个图片的压缩变量,如果仅仅只是实现图片旋转,可以把压缩比例写为 1

Thumbnails.of("原图文件的路径")
    .scale(0.8) // 等比例缩放的比例
    .rotate(90) // 旋转的角度,顺时针
    .toFile("转换后文件的路径");
Thumbnails.of(“原图文件的路径”)
    .size(40,40) // 等比例缩放的具体长宽px值
    .rotate(90)  // 顺时针旋转的角度
    .toFile(“转换后文件的路径”);

scale,size 必须有一个有值


加水印 

File image = new File("水印图片地址");
Thumbnails.of("原图文件的路径")
    .scale(0.8)  // 原图压缩的比例
    // Watermark:添加水印 watermark(位置,水印图,透明度)
    .watermark(Positions.BOTTOM_RIGHT, ImageIO.read(image), 0.5f)
    .toFile("转换后文件的路径");

修改文件格式

Thumbnails.of(“原图文件的路径”)
    .scale(1f) // 原图等比例缩放的比例,1f表示不缩放,不能省略
    .outputFormat(“jpg”) // 转换后的格式
    .toFile(“转换后文件的路径”);  // 这里要注意哦,路径最后要写上“生成的文件名.后缀”

        outputFormat:设置转换后图片格式,之前听说该属性设置为png时,scale缩放属性无效,测试用0.4.8的版本已经能正常缩放了


不改变宽高,压缩大小 

Thumbnails.of("原图文件的路径")
        .scale(1f) // 原图等比例缩放的比例,1f表示不缩放,不能省略 
        .outputQuality(0.5f) // 输出的图片质量,范围:0.0~1.0,1为最高质量,大小最大
        .toFile("压缩后文件的路径");

综合实战:

import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;
import net.coobird.thumbnailator.name.Rename;
import net.coobird.thumbnailator.resizers.configurations.ScalingMode;
import org.apache.pdfbox.tools.imageio.ImageIOUtil;

import javax.imageio.ImageIO;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

/**
 * @author wzx
 * @version 1.0
 * @description 生成缩略图和水印非常好用,具体帮助文档 https://github.com/coobird/thumbnailator/wiki/Maven
 *              缩略图
 *              水印
 *              选择
 *              格式转换
 * @Create 2023/8/22
 */
public class ThumbnailatorDmo {

    /**
     * 使用给定的图片生成指定大小的图片
     */
    private static void generateFixedSizeImage(){
        try {
            Thumbnails.of("data/meinv.jpg").size(80,80).toFile("data/newmeinv.jpg");
        } catch (IOException e) {
            System.out.println("原因: " + e.getMessage());
        }
    }

    /**
     * 对原图加水印,然后顺时针旋转90度,最后压缩为80%保存
     */
    private static void generateRotationWatermark(){
        try {
            Thumbnails.of("data/2016010208.jpg").
                    size(160,160). // 缩放大小
                    rotate(90). // 顺时针旋转90度
                    watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File("data/newmeinv.jpg")),0.5f). //水印位于右下角,半透明
                    outputQuality(0.8). // 图片压缩80%质量
                    toFile("data/2016010208_new.jpg");
        } catch (IOException e) {
            System.out.println("原因: " + e.getMessage());
        }
    }

    /**
     * 转换图片格式,将流写入到输出流
     */
    private static void generateOutputstream(){
        try(OutputStream outputStream = new FileOutputStream("data/2016010208_outputstream.png")) { //自动关闭流
            Thumbnails.of("data/2016010208.jpg").
                    size(500,500).
                    outputFormat("png"). // 转换格式
                    toOutputStream(outputStream); // 写入输出流
        } catch (IOException e) {
            System.out.println("原因: " + e.getMessage());
        }
    }

    /**
     * 按比例缩放图片
     */
    private static void generateScale(){
        try {
            Thumbnails.of("data/2016010208.jpg").
                    //scalingMode(ScalingMode.BICUBIC).
                    scale(0.8). // 图片缩放80%, 不能和size()一起使用
                    outputQuality(0.8). // 图片质量压缩80%
                    toFile("data/2016010208_scale.jpg");
        } catch (IOException e) {
            System.out.println("原因: " + e.getMessage());
        }
    }

    /**
     * 生成缩略图到指定的目录
     */
    private static void generateThumbnail2Directory(){
        try {
            Thumbnails.of("data/2016010208.jpg","data/meinv.jpg").
                    //scalingMode(ScalingMode.BICUBIC).
                            scale(0.8). // 图片缩放80%, 不能和size()一起使用
                   toFiles(new File("data/new/"), Rename.NO_CHANGE);//指定的目录一定要存在,否则报错
        } catch (IOException e) {
            System.out.println("原因: " + e.getMessage());
        }
    }

    /**
     * 将指定目录下所有图片生成缩略图
     */
    private static void generateDirectoryThumbnail(){
        try {
            Thumbnails.of(new File("data/new").listFiles()).
                    //scalingMode(ScalingMode.BICUBIC).
                            scale(0.8). // 图片缩放80%, 不能和size()一起使用
                    toFiles(new File("data/new/"), Rename.SUFFIX_HYPHEN_THUMBNAIL);//指定的目录一定要存在,否则报错
        } catch (IOException e) {
            System.out.println("原因: " + e.getMessage());
        }
    }
}

你可能感兴趣的:(开发业务技术方案篇,java,前端)