对于javaweb服务端开发人员,图片资源的管理总是绕不开的一环。很多网站上都会提供上传图片这个功能,而现代数码设备拍摄出来的都是高清图片,分辨率很高,占用的空间也很大。物理存储的问题还算容易解决,但是网络带宽太紧张了。一个页面动则就几十M,那加载速度,想想也是够了,所以图片的压缩就必不可少了,对于图片的加工,前后端都可以实现,这里讲解一下后端实现图片加工的工具库——Thumbnailator
Thumbnailator 是一个用来生成图像缩略图的 Java 类库,通过很简单的代码即可生成图片缩略图,也可直接对一整个目录的图片生成缩略图。
Thumbnailator 能做什么?
Thumbnailator是一款高性能的java缩略图类库。 支持的处理操作:图片缩放,区域裁剪,水印,旋转,保持比例。
net.coobird
thumbnailator
0.4.8
Thumbnails.of("原图文件的路径")
.scale(0.5) // 压缩的比例
.toFile("压缩后文件的路径");
Thumbnails.of("原图文件的路径")
.size(100, 75) // 长宽的px值
.toFile("压缩后文件的路径");
Thumbnails.of("原图文件的路径")
.scale(1.0, 0.5) // 长宽的比例,非等比例,会导致图片变型
.toFile("压缩后文件的路径");
注意:这里的图片旋转要伴随着一个图片的压缩变量,如果仅仅只是实现图片旋转,可以把压缩比例写为 1
Thumbnails.of("原图文件的路径")
.scale(0.8) // 等比例缩放的比例
.rotate(90) // 旋转的角度,顺时针
.toFile("转换后文件的路径");
Thumbnails.of(“原图文件的路径”)
.size(40,40) // 等比例缩放的具体长宽px值
.rotate(90) // 顺时针旋转的角度
.toFile(“转换后文件的路径”);
scale,size 必须有一个有值
File image = new File("水印图片地址");
Thumbnails.of("原图文件的路径")
.scale(0.8) // 原图压缩的比例
// Watermark:添加水印 watermark(位置,水印图,透明度)
.watermark(Positions.BOTTOM_RIGHT, ImageIO.read(image), 0.5f)
.toFile("转换后文件的路径");
Thumbnails.of(“原图文件的路径”)
.scale(1f) // 原图等比例缩放的比例,1f表示不缩放,不能省略
.outputFormat(“jpg”) // 转换后的格式
.toFile(“转换后文件的路径”); // 这里要注意哦,路径最后要写上“生成的文件名.后缀”
outputFormat:设置转换后图片格式,之前听说该属性设置为png时,scale缩放属性无效,测试用0.4.8的版本已经能正常缩放了
Thumbnails.of("原图文件的路径")
.scale(1f) // 原图等比例缩放的比例,1f表示不缩放,不能省略
.outputQuality(0.5f) // 输出的图片质量,范围:0.0~1.0,1为最高质量,大小最大
.toFile("压缩后文件的路径");
import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;
import net.coobird.thumbnailator.name.Rename;
import net.coobird.thumbnailator.resizers.configurations.ScalingMode;
import org.apache.pdfbox.tools.imageio.ImageIOUtil;
import javax.imageio.ImageIO;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
/**
* @author wzx
* @version 1.0
* @description 生成缩略图和水印非常好用,具体帮助文档 https://github.com/coobird/thumbnailator/wiki/Maven
* 缩略图
* 水印
* 选择
* 格式转换
* @Create 2023/8/22
*/
public class ThumbnailatorDmo {
/**
* 使用给定的图片生成指定大小的图片
*/
private static void generateFixedSizeImage(){
try {
Thumbnails.of("data/meinv.jpg").size(80,80).toFile("data/newmeinv.jpg");
} catch (IOException e) {
System.out.println("原因: " + e.getMessage());
}
}
/**
* 对原图加水印,然后顺时针旋转90度,最后压缩为80%保存
*/
private static void generateRotationWatermark(){
try {
Thumbnails.of("data/2016010208.jpg").
size(160,160). // 缩放大小
rotate(90). // 顺时针旋转90度
watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File("data/newmeinv.jpg")),0.5f). //水印位于右下角,半透明
outputQuality(0.8). // 图片压缩80%质量
toFile("data/2016010208_new.jpg");
} catch (IOException e) {
System.out.println("原因: " + e.getMessage());
}
}
/**
* 转换图片格式,将流写入到输出流
*/
private static void generateOutputstream(){
try(OutputStream outputStream = new FileOutputStream("data/2016010208_outputstream.png")) { //自动关闭流
Thumbnails.of("data/2016010208.jpg").
size(500,500).
outputFormat("png"). // 转换格式
toOutputStream(outputStream); // 写入输出流
} catch (IOException e) {
System.out.println("原因: " + e.getMessage());
}
}
/**
* 按比例缩放图片
*/
private static void generateScale(){
try {
Thumbnails.of("data/2016010208.jpg").
//scalingMode(ScalingMode.BICUBIC).
scale(0.8). // 图片缩放80%, 不能和size()一起使用
outputQuality(0.8). // 图片质量压缩80%
toFile("data/2016010208_scale.jpg");
} catch (IOException e) {
System.out.println("原因: " + e.getMessage());
}
}
/**
* 生成缩略图到指定的目录
*/
private static void generateThumbnail2Directory(){
try {
Thumbnails.of("data/2016010208.jpg","data/meinv.jpg").
//scalingMode(ScalingMode.BICUBIC).
scale(0.8). // 图片缩放80%, 不能和size()一起使用
toFiles(new File("data/new/"), Rename.NO_CHANGE);//指定的目录一定要存在,否则报错
} catch (IOException e) {
System.out.println("原因: " + e.getMessage());
}
}
/**
* 将指定目录下所有图片生成缩略图
*/
private static void generateDirectoryThumbnail(){
try {
Thumbnails.of(new File("data/new").listFiles()).
//scalingMode(ScalingMode.BICUBIC).
scale(0.8). // 图片缩放80%, 不能和size()一起使用
toFiles(new File("data/new/"), Rename.SUFFIX_HYPHEN_THUMBNAIL);//指定的目录一定要存在,否则报错
} catch (IOException e) {
System.out.println("原因: " + e.getMessage());
}
}
}