图片压缩Thumbnailator工具

wen java案例 2

本文目录导读:

图片压缩Thumbnailator工具

  1. 核心依赖(Maven/Gradle)
  2. 常用压缩与缩放 API
  3. 批量处理目录下的所有图片
  4. 带水印、裁剪、旋转的高级用法
  5. 内存中处理(BufferedImage)
  6. 性能优化建议
  7. 常见问题
  8. 完整实用示例(封装工具类)

Thumbnailator 是一个非常流行的 Java 图片处理库,专门用于图片压缩、缩放、裁剪和水印等操作。

它的核心优势在于:API 设计极其简洁(使用流畅的 Builder 模式),通常只需一行代码即可完成复杂的图片处理,且底层基于 Java 的 ImageIO,不需要依赖第三方图像处理引擎(如 OpenCV 或 ImageMagick)。


核心依赖(Maven/Gradle)

Maven

<dependency>
    <groupId>net.coobird</groupId>
    <artifactId>thumbnailator</artifactId>
    <version>0.4.20</version> <!-- 建议使用最新版,截至2025年为0.4.20 -->
</dependency>

Gradle

implementation 'net.coobird:thumbnailator:0.4.20'

常用压缩与缩放 API

1 最简单的压缩(按比例缩放)

import net.coobird.thumbnailator.Thumbnails;
// 将原图按比例压缩为宽度200像素(高度自动等比缩放)
Thumbnails.of("input.jpg")
        .width(200)
        .toFile("output.jpg");

2 指定宽高(强制拉伸/裁剪)

// 强制缩放到200x200,不保持比例(可能导致变形)
Thumbnails.of("input.jpg")
        .size(200, 200)
        .keepAspectRatio(false)
        .toFile("output.jpg");

3 高质量压缩(控制输出质量)

Thumbnails.of("input.jpg")
        .size(800, 600)
        .outputQuality(0.8)       // 0.0 ~ 1.0,0.8表示80%质量
        .outputFormat("jpg")      // 指定输出格式
        .toFile("output_compressed.jpg");

4 按比例缩放 (scale)

// 缩放为原来的一半
Thumbnails.of("input.jpg")
        .scale(0.5)
        .toFile("output.jpg");
// 放大2倍
Thumbnails.of("input.jpg")
        .scale(2.0)
        .toFile("output.jpg");

批量处理目录下的所有图片

// 将 inputDir 下所有图片转为 200x200 并输出到 outputDir
Thumbnails.of(new File("inputDir").listFiles())
        .size(200, 200)
        .outputFormat("jpg")
        .toFiles(new File("outputDir"), Rename.PREFIX_DOT_THUMBNAIL);
        // 或使用 .toFiles(new File("outputDir"), (name) -> "thumb_" + name);

带水印、裁剪、旋转的高级用法

1 添加水印

import net.coobird.thumbnailator.geometry.Positions;
Thumbnails.of("input.jpg")
        .size(800, 600)
        .watermark(Positions.BOTTOM_RIGHT,   // 水印位置:右下角
                   ImageIO.read(new File("watermark.png")), 
                   0.5f)                     // 水印透明度 0.5
        .toFile("output_with_watermark.jpg");

2 裁剪 (sourceRegion)

// 从原图中心裁剪300x300区域
Thumbnails.of("input.jpg")
        .sourceRegion(Positions.CENTER, 300, 300)
        .size(200, 200)
        .toFile("cropped.jpg");

3 旋转

// 旋转90度
Thumbnails.of("input.jpg")
        .size(800, 600)
        .rotate(90)   // 90, 180, 270
        .toFile("rotated.jpg");

内存中处理(BufferedImage)

适合网络请求、上传等不需要写入磁盘的场景:

// 输入:BufferedImage
BufferedImage original = ImageIO.read(new File("input.jpg"));
// 处理并返回 BufferedImage
BufferedImage compressed = Thumbnails.of(original)
        .size(400, 300)
        .outputQuality(0.7)
        .asBufferedImage();
// 直接写入输出流 (Response)
Thumbnails.of(original)
        .size(400, 300)
        .outputFormat("jpg")
        .toOutputStream(response.getOutputStream());

性能优化建议

场景 建议
大图压缩 (>10MB) 先用 scale(0.5) 缩小,再用 outputQuality(0.8)
批量处理 使用 asBufferedImages() 批量加载到内存再处理
高并发服务器 将 Thumbnailator 对象设计为单例(线程安全)
避免失真 尽量使用 width()height() 单边缩放,不要强制双边界定

常见问题

Q1: 压缩后图片反而变大了?

  • 原因:输出格式/质量设置不合理,PNG 转 JPG 且质量设置很高。
  • 解决:设置 outputQuality(0.6~0.8),且确认输出格式为 JPEG。

Q2: 图片出现锯齿或模糊?

  • 解决:启用高质量缩放算法:
    .useExifOrientation(true) // 保持EXIF方向
    .outputQuality(0.85)

Q3: 不支持某些格式(WebP、HEIC)?

  • Thumbnailator 底层依赖 Java 的 ImageIO,默认只支持 JPG/PNG/GIF/BMP。
  • 若需 WebP 支持,可集成 webp-imageio 包。

完整实用示例(封装工具类)

public class ImageCompressor {
    public static void compress(File source, File target, int width, int height, float quality) throws IOException {
        Thumbnails.of(source)
                .size(width, height)
                .outputQuality(quality)
                .outputFormat("jpg")
                .toFile(target);
    }
    public static void compressToStream(InputStream inputStream, OutputStream outputStream, int width, int height) throws IOException {
        Thumbnails.of(inputStream)
                .size(width, height)
                .outputFormat("jpg")
                .toOutputStream(outputStream);
    }
}

特性 Thumbnailator
API 简洁性 ⭐⭐⭐⭐⭐(一行搞定)
性能 ⭐⭐⭐⭐(中等规模图片极快)
功能完整度 ⭐⭐⭐⭐(缩放/裁剪/水印/旋转)
不支持格式 WebP / HEIC(需额外插件)
适用场景 Java Web 图片上传压缩、缩略图生成

如果你需要 更高性能的批量处理视频缩略图,可以考虑转向 FFmpeg + Java 封装,但针对纯图片压缩场景,Thumbnailator 是目前 Java 生态中最推荐的工具之一。

抱歉,评论功能暂时关闭!