添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

图片处理库 Thumbnailator

常需要对图片进行处理,如 加水印,压缩,翻转 等。推荐使用一款开源的图片处理框架 Thumbnailator

引入依赖

1
2
3
4
5
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.11</version>
</dependency>

缩略图

单个处理

给单个图片文件创建缩略图。

示例:生成 original.jpg 的缩略图,且保存为 thumbnail.jpg

1
2
3
Thumbnails.of(new File("original.jpg"))
.size(160, 160)
.toFile(new File("thumbnail.jpg"));

还可以直接指定 String 类型的文件名,而不需要使用 File 对象指定图片文件。如下:

1
2
3
Thumbnails.of("original.jpg")
.size(160, 160)
.toFile("thumbnail.jpg");

批量处理

将一个目录下的图片批量处理生成缩略图。 Rename 有两个静态变量可使用:

  • NO_CHANGE :生成的缩略图文件名不做任何改变,即覆盖原始的图。
  • PREFIX_DOT_THUMBNAIL :生成的缩略图名添加前缀 thumbnail. ,就不会覆盖原始的图。
    例如, 1.JPG 生成缩略图后是 thumbnail.1.JPG
  • 示例:生成 640 x 480 像素的 jpg 缩略图,同时保留原图的纵横比。

    1
    2
    3
    4
    Thumbnails.of(new File("path/to/directory").listFiles())
    .size(640, 480)
    .outputFormat("jpg")
    .toFiles(Rename.PREFIX_DOT_THUMBNAIL);

    转换格式

    调用 outputFormat 方法,转入类型名实现输出缩略图的格式转换。

    保持宽高比

    调用 keepAspectRatio 方法,布尔参数,设置是否为缩略图保留原始图像的宽高比。

    输出缩略图

    示例如下:

    1
    2
    3
    4
    5
    6
    OutputStream os = ...;

    Thumbnails.of("large-picture.jpg")
    .size(200, 200)
    .outputFormat("png")
    .toOutputStream(os);

    在此示例中,将文件 large-picture.jpg 中的图像调整为最大尺寸 200 x 200(保持原始图像的纵横比),并将其作为PNG 图像写入指定的输出流。

    固定大小

    1
    2
    3
    4
    5
    BufferedImage originalImage = ImageIO.read(new File("original.png"));

    BufferedImage thumbnail = Thumbnails.of(originalImage)
    .size(200, 200)
    .asBufferedImage();

    以原始图像格式获取图像,并创建 200 × 200 的缩略图,并将结果存储在 thumbnail 中。

    按比例缩放

    示例: 按原图的 25% 生成缩略图。

    1
    2
    3
    4
    5
    BufferedImage originalImage = ImageIO.read(new File("original.png"));

    BufferedImage thumbnail = Thumbnails.of(originalImage)
    .scale(0.25)
    .asBufferedImage();

    旋转缩略图

    示例: 顺时针旋转 90 度。

    1
    2
    3
    4
    5
    6
    BufferedImage originalImage = ImageIO.read(new File("original.jpg"));

    BufferedImage thumbnail = Thumbnails.of(originalImage)
    .size(200, 200)
    .rotate(90)
    .asBufferedImage();

    水印缩略图

    调用 watermark 方法可以将水印加入到缩略图上。第一个参数是设置水印位置,可使用 Positions 枚举类;第二个参数是 水印内容;最后一个参数是设置水印的透明度, 0.0f 是水印 完全透明 1.0f 是水印完全 不透明

    1
    2
    3
    4
    5
    6
    7
    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();

    旋转+水印

    调用 rotate(double angle) 实现缩略图角度施转, 正数 是顺时印, 负数 是逆时针。可多次调用实现多次旋转。

    示例如下:

    1
    2
    3
    4
    5
    6
    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 的缩略图,大小为 160 x 160 ,然后将其 顺时针旋转90度 ,然后在右下角放置 半透明的水印 ,然后将其保存到 image-with-watermark.jpg 中, 80% 压缩质量设置。

    加文字水印

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    BufferedImage originalImage = ImageIO.read(new File("original.jpg"));

    BufferedImage bi = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
    Graphics2D graphics = bi.createGraphics();
    graphics.setColor(Color.LIGHT_GRAY);
    graphics.drawRect(0, 0, 10, 10);
    char[] data = "Hello World".toCharArray();
    graphics.drawChars(data, 0, data.length, 5, 32);

    Thumbnails.of(originalImage)
    .size(640, 480)
    .watermark(Positions.BOTTOM_RIGHT, bi, 0.5f)
    .toFile("wold.jpg");

    此方式看需要使用,最好是将文字转为透明背景的文字图片,再将其做为水印。(由 UI 将文字处理成图片,后端设置文字样式比较痛苦)。

    裁剪缩略图

    调用 sourceRegion 方法对原图进行区域裁剪。

    1
    2
    3
    4
    5
    Thumbnails.of("D:\\picture\\3.jpg")
    .sourceRegion(Positions.CENTER, 400, 400)
    .size(200, 200)
    .keepAspectRatio(false)
    .toFile("D:\\picture\\new_img.jpg");