常需要对图片进行处理,如 加水印,压缩,翻转 等。推荐使用一款开源的图片处理框架 Thumbnailator。
引入依赖
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.11</version>
</dependency>
缩略图
单个处理
给单个图片文件创建缩略图。
示例:生成 original.jpg 的缩略图,且保存为 thumbnail.jpg。
Thumbnails.of(new File("original.jpg"))
.size(160, 160)
.toFile(new File("thumbnail.jpg"));
还可以直接指定 String
类型的文件名,而不需要使用 File
对象指定图片文件。如下:
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 缩略图,同时保留原图的纵横比。
Thumbnails.of(new File("path/to/directory").listFiles())
.size(640, 480)
.outputFormat("jpg")
.toFiles(Rename.PREFIX_DOT_THUMBNAIL);
转换格式
调用 outputFormat
方法,转入类型名实现输出缩略图的格式转换。
保持宽高比
调用 keepAspectRatio
方法,布尔参数,设置是否为缩略图保留原始图像的宽高比。
输出缩略图
示例如下:
OutputStream os = ...;
Thumbnails.of("large-picture.jpg")
.size(200, 200)
.outputFormat("png")
.toOutputStream(os);
在此示例中,将文件 large-picture.jpg 中的图像调整为最大尺寸 200 x 200(保持原始图像的纵横比),并将其作为PNG 图像写入指定的输出流。
固定大小
BufferedImage originalImage = ImageIO.read(new File("original.png"));
BufferedImage thumbnail = Thumbnails.of(originalImage)
.size(200, 200)
.asBufferedImage();
以原始图像格式获取图像,并创建 200 × 200 的缩略图,并将结果存储在 thumbnail 中。
按比例缩放
示例:按原图的 25% 生成缩略图。
BufferedImage originalImage = ImageIO.read(new File("original.png"));
BufferedImage thumbnail = Thumbnails.of(originalImage)
.scale(0.25)
.asBufferedImage();
旋转缩略图
示例:顺时针旋转 90 度。
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
是水印完全不透明 。
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)
实现缩略图角度施转,正数是顺时印,负数是逆时针。可多次调用实现多次旋转。
示例如下:
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% 压缩质量设置。
加文字水印
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
方法对原图进行区域裁剪。
Thumbnails.of("D:\\picture\\3.jpg")
.sourceRegion(Positions.CENTER, 400, 400)
.size(200, 200)
.keepAspectRatio(false)
.toFile("D:\\picture\\new_img.jpg");
写入到指定目录
示例:将缩略图写入到指定的目录(path/to/output)
File destinationDir = new File("path/to/output");
// 指定目录中的图片
Thumbnails.of("apple.jpg", "banana.jpg", "cherry.jpg")
.size(200, 200)
.toFiles(destinationDir, Rename.PREFIX_DOT_THUMBNAIL);
注意:本文归作者所有,未经作者允许,不得转载