前言:
对于javaweb服务端开发人员,图片资源的管理总是绕不开的一环。很多网站上都会提供上传图片这个功能,而现代数码设备拍摄出来的都是高清图片,分辨率很高,占用的空间也很大。物理存储的问题还算容易解决,但是网络带宽太紧张了。一个页面动则就几十M,那加载速度,想想也是够了,所以图片的压缩就必不可少了,对于图片的加工,前后端都可以实现,这里讲解一下后端实现图片加工的工具库——Thumbnailator
简介:
Thumbnailator 是一个用来生成图像缩略图的 Java 类库,通过很简单的代码即可生成图片缩略图,也可直接对一整个目录的图片生成缩略图。
Thumbnailator 能做什么?
Thumbnailator是一款高性能的java缩略图类库。 支持的处理操作:图片缩放,区域裁剪,水印,旋转,保持比例。
快速入门:
引入依赖:
<dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.8</version>
</dependency>
API示例:
图片压缩
方式一:等比例压缩
Thumbnails.of("原图文件的路径").scale(0.5) // 压缩的比例.toFile("压缩后文件的路径");
方式二:指定px值的等比例压缩(不会破坏图片比例,因此如果px值不成比例会与预期有小差距)
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());}}
}