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