看完本文你将会会收获:使用java优雅的处理图片;包括:主流图片格式转码、图片压缩(缩略图生成)等。

原理

本次博客使用的Thumbnailator包,实际上是封装好的类和方法,基于Java的Image I/O API、Java 2D API等API接口实现。所以,因为基于Java Image I/O API,所以支持的图片格式有限,但是已经满足绝大多数情况。

一般支持的格式如下:

  • Read:JPEG 2000, JPG, tiff, bmp, PCX, gif, WBMP, PNG, RAW, JPEG, PNM, tif, TIFF, wbmp, jpeg, jbig2, jpg, JPEG2000, BMP, pcx, GIF, png, raw, JBIG2, pnm, TIF, jpeg2000, jpeg 2000

  • Write:JPEG 2000, JPG, tiff, bmp, PCX, gif, WBMP, PNG, RAW, JPEG, PNM, tif, TIFF, wbmp, jpeg, jpg, JPEG2000, BMP, pcx, GIF, png, raw, pnm, TIF, jpeg2000, jpeg 2000

所以,像Apple的HEIC格式,是不支持使用Thumbnailator进行处理的。

如何安装

首先添加lib包,如果你是Maven工程,或者使用Maven管理的项目,添加依赖:

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

最新版本Thumbnailator地址:Maven地址

如何使用

Thumbnailator的使用十分简单,原本你需要使用Java的Image I/O APIBufferedImagesGraphics2D来处理图片,Thumbnailator直接封装上述操作。

图片转码

简单的使用演示:

1
2
3
4
Thumbnails.of(new File("path/source.webp"))
.size(640, 480)
.outputFormat("jpg")
.toFiles(new File("path/purpose.jpg"));
  • 原图片地址:sourcePath
  • 输出图片大小:640*480
  • 输出图片格式:jpg
  • IO流输出地址(输出图片):purposePath
1
2
3
4
5
Thumbnails.of(originalImage)
.scale(scale)
.outputFormat("jpg")
.outputQuality(compression)
.toFile(thumbnailImage);
  • scale是图片尺寸等比缩放,为float类型。
  • outputFormat是输出图片的类型
  • outputQuality是输出图片的质量,即:清晰度/分辨率。

以上两种均可以进行格式转换,其中of方法也可使用输入流传入,最后也可使用toOutputStream输出

注意:默认不支持转为webp,支持webp转为其他格式,如果需要使用webp,需要使用webp-imageio-core

使用原图片生成缩略图

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

其中,原图片文件,可以使用字符串String来代替地址:

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

通常,缩略图输出体积已经很小,但是还是可以使用.outputQualit来降低图片质量(分辨率)。

旋转图片

很简单;添加.rotate即可。如:

1
2
3
Thumbnails.of(new File("original.jpg"))
.rotate(90)
.toFile(new File("image-with-watermark.jpg"));

添加水印

添加水印也十分简单,添加.watermark即可:

1
2
3
Thumbnails.of(new File("original.jpg"))
.watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File("watermark.png")), 0.5f)
.toFile(new File("image-with-watermark.jpg"));