Thumbnailator

一、简介

# Thumbnailator 是一个用java生成高质量缩略图的第三方库,可以用来
    1、生成缩略图
    2、添加水印
    3、图片旋转
    4、图片大小缩放
    5、图片压缩
# Thumbnailator是单个JAR文件,不依赖于外部库,从而使开发和部署变得简单而容易。它也可以在Maven中央存储库中找到,以便轻松包含在Maven项目中。

Maven 依赖

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

二、示例

2.1 示例一

在目录中创建图像文件的JPG缩略图,将它们全部调整为最大尺寸为640像素乘480像素,同时保留原始图像的长宽比。

package com.lzp.summary.thumbnailator;

import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.name.Rename;

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

/**
 * 示例一:在目录中创建图像文件的JPG缩略图,将它们全部调整为最大尺寸为640像素乘480像素,同时保留原始图像的长宽比。
 */
public class Example1 {
    
    /**
     * 。size(int width, int height) : 设置缩略图的大小。注意.size(int, int) 方法将缩略图将保留原始图像的纵横比。 如果缩略图应该被强制为指定的大小,则可以使用forceSize(int, int)方法代替此方法。
     *      width – 缩略图的宽度。
     *      height – 缩略图的高度。
     *      .size()与.forceSize() 不可同时存在
     * .forceSize() : 表示生成的缩略图强制为指定的大小
     * .outputFormat(String format) : 设置写入缩略图时使用的压缩格式。目前,压缩格式字符串是否有效取决于Java Image I/O API 是否将字符串识别为它支持输出的格式。 (可以通过调用ImageIO.getWriterFormatNames()方法获得有效的格式名称。)
     * .toFiles(Rename rename): 创建缩略图并使用Rename功能将它们存储到文件中以确定文件名。
     *                          如果目标文件存在,并且通过使用false调用allowOverwrite(boolean)方法禁用了覆盖文件,则不会写入目标文件已经存在的缩略图。
     *                          要调用此方法,必须通过调用of(File...)方法从文件创建缩略图。
     *
     *  Rename.SUFFIX_DOT_THUMBNAIL : 在文件扩展名之前将.thumbnail附加到文件名。 例如,给定picture.jpg ,结果是picture.thumbnail.jpg
     *  Rename.PREFIX_DOT_THUMBNAIL : 附加thumbnail. 到文件名的开头。 例如,给定picture.jpg ,结果是thumbnail.picture.jpg
     *  Rename.PREFIX_HYPTHEN_THUMBNAIL: 将thumbnail-附加到文件名的开头。 例如,给定picture.jpg ,结果是thumbnail-picture.jpg
     * .allowOverWrite(Boolean allowOverwrite) : 指定是否覆盖已存在的文件,
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
        System.out.print("有效的格式名称: ");
        for (String writerFormatName : ImageIO.getWriterFormatNames()) {
            System.out.print(writerFormatName + "\t");
        }
        String filePath = "D:\\code\\thumbnailator";
        Thumbnails.of(new File(filePath).listFiles())
                .size(640, 480)
                .outputFormat("jpg")
                .allowOverwrite(false)
                .toFiles(Rename.SUFFIX_DOT_THUMBNAIL);
    }
}

2.2 示例二:从图像文件创建缩略图

从图像文件创建缩略图

package com.lzp.summary.thumbnailator;

import net.coobird.thumbnailator.Thumbnails;

import java.io.File;
import java.io.IOException;

/**
 * 示例二:从图像文件创建缩略图
 */
public class Example2 {


    /**
     * .toFile(String outFilepath) :
     *          创建缩略图并将其写入File 。
     *          如果目标文件存在,并且通过使用false调用allowOverwrite(boolean)方法已禁用覆盖文件,
     *          则会抛出IllegalArgumentException 。
     *          要调用此方法,缩略图必须是从单一来源创建的。
     * .toFile(File outFile)
     *          创建缩略图并将其写入File 。
     *          如果目标文件存在,并且通过使用false调用allowOverwrite(boolean)方法已禁用覆盖文件,则会抛出IllegalArgumentException 。
     *          要调用此方法,缩略图必须是从单一来源创建的。
     */
    public static void main(String[] args) throws IOException {

        String filePath = "D:\\code\\thumbnailator\\微信图片_20210802134945.png";
        String newFilePath = "D:\\code\\thumbnailator\\微信图片_20210802134945.thumbnail.png";
        Thumbnails.of(new File(filePath))
                .size(640, 480)
//                .toFile(newFilePath)
                .toFile(new File(newFilePath));
    }
}

2.3 示例三:创建带有旋转和水印的缩略图

创建带有旋转和水印的缩略图

package com.lzp.summary.thumbnailator;

import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;

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

/**
 * 示例三:创建带有旋转和水印的缩略图
 */
public class Example3 {


    /**
     * .rotate(double angle) :
     *      设置要应用于缩略图的旋转量。
     *      缩略图将顺时针旋转指定的角度。
     *      可以多次调用此方法以应用多次旋转。
     *      如果要应用多个旋转,将按照调用此方法的顺序应用旋转。
     *      调用此方法设置此参数是可选的。
     * .watermark(Position position, BufferedImage image, float opacity):
     *              position – 水印的位置。
     *              image – 水印的图像。
     *              opacity – 水印的不透明度。 该值应介于0.0f和1.0f之间,其中0.0f是完全透明的,而1.0f是完全不透明的。
     *      设置要应用于缩略图的图像、不透明度和水印位置。
     *      可以多次调用此方法以应用多个水印。
     *      如果要应用多个水印,则将按照调用此方法的顺序应用水印。
     *      调用此方法设置此参数是可选的。
     * .outputQuality(double quality) :
     *      设置将缩略图写入外部目标(例如文件或输出流)时用于压缩缩略图的压缩算法的输出质量。
     *      该值是介于0.0d和1.0d之间的double 0.0d值,其中0.0d表示最低质量, 1.0d表示压缩编解码器应使用的最高质量设置。
     */
    public static void main(String[] args) throws IOException {

        String filePath = "D:\\code\\thumbnailator\\微信图片_20210802134945.png";
        String newFilePath = "D:\\code\\thumbnailator\\微信图片_20210802134945.thumbnail.png";
        String watermark = "D:\\code\\thumbnailator\\pxc.jpeg"; // 水印图片

        Thumbnails.of(new File(filePath))
                .size(640, 480)
                .rotate(60)// 旋转60°
                .watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File(watermark)), 0.5f) //水印位于右下角,半透明
                .outputQuality(0.8)// 图片压缩到80%质量
                .toFile(newFilePath);
    }
}

2.4 示例四: 创建缩略图并写入 OutputStream

创建缩略图并写入 OutputStream

package com.lzp.summary.thumbnailator;

import net.coobird.thumbnailator.Thumbnails;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

/**
 * 示例四:创建缩略图并写入 OutputStream
 * @author lizp
 * @date 2021/12/20
 */
public class Example4 {


    /**
     * 创建缩略图并将其写入OutputStream 。
     * 要调用此方法,缩略图必须是从单一来源创建的。
     * 请注意,在将缩略图写入OutputStream完成后,将不会调用OutputStream.close()方法。
     */
    public static void main(String[] args) throws IOException {

        OutputStream outputStream = new FileOutputStream("");
        String filePath = "D:\\code\\thumbnailator\\微信图片_20210802134945.png";
        Thumbnails.of(new File(filePath))
                .size(640, 480)
                .toOutputStream(outputStream);
    }
}

2.5 示例五: 创建固定大小的缩略图

创建固定大小的缩略图

package com.lzp.summary.thumbnailator;

import net.coobird.thumbnailator.Thumbnails;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

/**
 * 示例五:创建固定大小的缩略图
 */
public class Example5 {

    public static void main(String[] args) throws IOException {
        BufferedImage read = ImageIO.read(new File("D:\\code\\thumbnailator\\微信图片_20210802134945.png"));
        BufferedImage bufferedImage = Thumbnails.of(read)
                .forceSize(200, 200)
                .asBufferedImage();

        System.out.println(bufferedImage.getHeight());
        System.out.println(bufferedImage.getWidth());
    }
}

2.6 示例6:按给定因子缩放图像

按给定因子缩放图像【 按比例缩放图片 】

package com.lzp.summary.thumbnailator;

import net.coobird.thumbnailator.Thumbnails;

import java.io.IOException;

/**
 * 示例六: 按比例缩放图片
 */
public class Example6 {


    /**
     * .scale(double scale):
     *          scale – 创建缩略图时使用的缩放因子。 该值必须是大于0.0的double Double.POSITIVE_INFINITY值,而不是Double.POSITIVE_INFINITY 。
     *      设置缩略图的缩放比例。
     *      例如,要创建原始大小 50% 的缩略图,可以使用以下代码:
     * 一旦调用此方法,调用size(int, int)方法或scale(double, double)方法或keepAspectRatio(boolean)方法将导致IllegalStateException 。
     * 多次调用此方法将导致IllegalStateException 。
     */
    public static void main(String[] args) throws IOException {

        String filePath = "D:\\code\\thumbnailator\\微信图片_20210802134945.png";
        String newFilePath = "D:\\code\\thumbnailator\\微信图片_20210802134945.thumbnail3.png";

        Thumbnails.of(filePath)
                .scale(0.5)
                .toFile(newFilePath);

    }
}

2.7 示例7: 生成缩略图到指定的目录

生成缩略图到指定的目录

package com.lzp.summary.thumbnailator;

import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.name.Rename;

import java.io.File;
import java.io.IOException;

/**
 * 示例七: 生成缩略图到指定的目录
 */
public class Example7 {
    public static void main(String[] args) throws IOException {

        String filePath = "D:\\code\\thumbnailator\\微信图片_20210802134945.png";
        Thumbnails.of(filePath)
                .scale(0.5)
                .toFiles(new File("D:\\code\\thumbnailator\\"), Rename.SUFFIX_DOT_THUMBNAIL);
    }
}


2.8 示例8: 将指定目录下所有图片生成缩略图

示例1中有体现