本文目录导读:

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 生态中最推荐的工具之一。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播