回答

收藏

分享一款Java缩略图生成库

Java Java 40641 人阅读 | 0 人回复 | 2020-11-05

*本帖最后由 LazyGirl 于 2020-11-5 15:51 编辑*

# Java缩略图生成库

当遇到一个需求是需要给网站的图片生成一个高质量的缩略图,方便在有些场景中展示时,就需要在 Java 中对图片进行处理,这个时候就需要了解和使用 Image I/O API、Java 2D API、图片处理和图片缩放技术等,整体来看处理缩略图非常的复杂。所以我们能CV的就需要去coding了。

## 推荐Thumbnailator
> (GitHub 标星 3.2K)
更好的缩略图生成库
地址:https://github.com/coobird/thumbnailator

Thumbnailator 是一个单独 Jar 包同时没有任何其他的网络库依赖,这样让集成变得非常的简单。以下代码就能完成对某一个文件夹下的图片进行批量的缩略图生成。


```java
Thumbnails.of(new File("path/to/directory").listFiles())
  .size(640, 480)
  .outputFormat("jpg")
  .toFiles(Rename.PREFIX_DOT_THUMBNAIL);
```
目前 Thumbnailator 项目非常的活跃,最近(20201017)刚发布了 0.4.13 版本。通过如下 Maven 配置可直接将 Thumbnailator 引入到你的项目中。
```
<dependency>
  <groupId>net.coobird</groupId>
  <artifactId>thumbnailator</artifactId>
  <version>[0.4, 0.5)</version>
</dependency>
```
- 上面的依赖定义将在0.4. x 版本范围内获取最新版本的 Thumbnailator。
- 如果需要特定版本的 Thumbnailator,请将[0.4,0.5]替换为特定版本号,如0.4.3。

## Thumbnailator的用法:
1. 从图像文件创建缩略图
```java
Thumbnails.of(new File("original.jpg"))
        .size(160, 160)
        .toFile(new File("thumbnail.jpg"));
```
在这个示例中,original.jpg 中的图像被调整大小,然后保存到 thumbnail.jpg 中。
另外,Thumbnailator 将接受文件名作为字符串。不需要使用 File 对象指定图像文件:
```java
Thumbnails.of("original.jpg")
        .size(160, 160)
        .toFile("thumbnail.jpg");
```

2. 创建带旋转和水印的缩略图
```java
Thumbnails.of(new File("original.jpg"))
        .size(160, 160)
        .rotate(90)
        .watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File("watermark.png")), 0.5f)
        .outputQuality(0.8)
        .toFile(new File("image-with-watermark.jpg"));
```
在这个例子中,图像 original.jpg 被调整为指定的大小,然后顺时针旋转90度,然后在右下角放置半透明的水印,然后保存到具有80% 压缩质量设置的 image-with-watermark.jpg当中。

3. 创建一个缩略图并写入OutputStream
```java
OutputStream os = ...;
Thumbnails.of("large-picture.jpg")
        .size(200, 200)
        .outputFormat("png")
        .toOutputStream(os);
```
在这个示例中,large-picture.jpg 被调整为最大尺寸为200 x 200(保持原始图像的宽高比) ,并将其作为 PNG 图像写入指定的 OutputStream。

4. 创建固定大小的缩略图
```java
BufferedImage originalImage = ImageIO.read(new File("original.png"));
BufferedImage thumbnail = Thumbnails.of(originalImage)
        .size(200, 200)
        .asBufferedImage();
```
上面的代码在 originalImage 中获取一个图像,然后使用缩略图创建一个200 * 200像素的缩略图,并将结果存储在缩略图中。

5. 按给定因子缩放图像
```java
BufferedImage originalImage = ImageIO.read(new File("original.png"));
BufferedImage thumbnail = Thumbnails.of(originalImage)
        .scale(0.25)
        .asBufferedImage();
```
上面的代码获取 originalImage 中的图像并创建一个缩略图,这个缩略图占原始图像的25% ,并使用默认缩放技术来生成存储在缩略图中的缩略图。

6. 创建缩略图时旋转图像
```java
BufferedImage originalImage = ImageIO.read(new File("original.jpg"));
BufferedImage thumbnail = Thumbnails.of(originalImage)
        .size(200, 200)
        .rotate(90)
        .asBufferedImage();
```
上面的代码采用原始图像并创建一个按顺时针方向旋转90度的缩略图。

7. 创建带有水印的缩略图
```java
BufferedImage originalImage = ImageIO.read(new File("original.jpg"));
BufferedImage watermarkImage = ImageIO.read(new File("watermark.png"));
BufferedImage thumbnail = Thumbnails.of(originalImage)
        .size(200, 200)
        .watermark(Positions.BOTTOM_RIGHT, watermarkImage, 0.5f)
        .asBufferedImage();
```
如图所示,可以通过调用水印方法将水印添加到缩略图中。并且定位可以从 Positions enum 中选择。缩略图的不透明度(或者反过来说,透明度)可以通过更改最后一个参数来调整,其中0.0 f 是完全透明的缩略图,1.0 f 是完全不透明的水印。

8. 将缩略图写入特定目录
```java
File destinationDir = new File("path/to/output");
Thumbnails.of("apple.jpg", "banana.jpg", "cherry.jpg")
        .size(200, 200)
        .toFiles(destinationDir, Rename.PREFIX_DOT_THUMBNAIL);
```
这个示例将获取源图像,并将缩略图作为文件写入 destinationDir (path/to/output 目录) ,同时用缩略图所在路径重命名它们。因此,缩略图将以文件的形式写入:
- path/to/output/thumbnail.apple.jpg
- path/to/output/thumbnail.banana.jpg
- path/to/output/thumbnail.cherry.jpg

还可以在写入指定目录时保留原始文件名:
```java
File destinationDir = new File("path/to/output");
Thumbnails.of("apple.jpg", "banana.jpg", "cherry.jpg")
        .size(200, 200)
        .toFiles(destinationDir, Rename.NO_CHANGE);
```
在上面的代码中,缩略图将被写入:

- path/to/output/apple.jpg
- path/to/output/banana.jpg
- path/to/output/cherry.jpg




分享到:
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则