thumbnailator是一个Java缩略图生成库。从API提供的图像文件和图像对象的缩略图中简化了缩略过程,只需要三两行代码就能够将现有图片生成缩略图,且允许微调,还支持根据一个目录批量生成缩略图。
压缩的要求
图片压缩,在我的想法里面有下面几个要求。
1、压缩程度可控制,想压缩成多小就多小。
2、压缩之后图片尽可能的不失真。
3、压缩速度要快。
4、代码简单,依赖较少。
Thumbnailator这个工具类满足了上面所说的所有的要求。同时对于图片的处理还有了别的方法和实现,如旋转,裁切,加水印等等,接下来直接上代码来看
第一步引入依赖:
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
</dependency>
第二步代码实操:
1、按照指定大小进行缩放
//size(宽度, 高度)
/*
* 若图片横比200小,高比300小,不变
* 若图片横比200小,高比300大,高缩小到300,图片比例不变
* 若图片横比200大,高比300小,横缩小到200,图片比例不变
* 若图片横比200大,高比300大,图片按比例缩小,横为200或高为300
*/
Thumbnails.of("images/微信图片.jpg").size(200, 300).toFile("c:/a380_200x300.jpg");
Thumbnails.of("images/微信图片.jpg").size(2560, 2048).toFile("c:/a380_2560x2048.jpg");
2、按照比例进行缩放
//scale(比例)
Thumbnails.of("images/微信图片.jpg").scale(0.25f).toFile("c:/a380_25%.jpg");
Thumbnails.of("images/微信图片.jpg").scale(1.10f).toFile("c:/a380_110%.jpg");
3、不按照比例,指定大小进行缩放
//keepAspectRatio(false) 默认是按照比例缩放的
Thumbnails.of("images/微信图片.jpg").size(200, 200).keepAspectRatio(false).toFile("c:/a380_200x200.jpg");
4、旋转
//rotate(角度),正数:顺时针 负数:逆时针
Thumbnails.of("images/微信图片.jpg").size(1280, 1024).rotate(90).toFile("c:/a380_rotate+90.jpg");
Thumbnails.of("images/微信图片.jpg").size(1280, 1024).rotate(-90).toFile("c:/a380_rotate-90.jpg");
5、水印
//watermark(位置,水印图,透明度)
Thumbnails.of("images/微信图片.jpg").size(1280, 1024).watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File("images/watermark.png")), 0.5f).outputQuality(0.8f).toFile("c:/a380_watermark_bottom_right.jpg");
Thumbnails.of("images/微信图片.jpg").size(1280, 1024).watermark(Positions.CENTER, ImageIO.read(new File("images/watermark.png")), 0.5f).outputQuality(0.8f).toFile("c:/a380_watermark_center.jpg");
6、裁剪
//sourceRegion()
//图片中心400*400的区域
Thumbnails.of("images/微信图片.jpg").sourceRegion(Positions.CENTER, 400,400).size(200, 200).keepAspectRatio(false).toFile("c:/a380_region_center.jpg");
//图片右下400*400的区域
Thumbnails.of("images/微信图片.jpg").sourceRegion(Positions.BOTTOM_RIGHT, 400,400).size(200, 200).keepAspectRatio(false).toFile("c:/a380_region_bootom_right.jpg");
//指定坐标
Thumbnails.of("images/微信图片.jpg").sourceRegion(600, 500, 400, 400).size(200, 200).keepAspectRatio(false).toFile("c:/a380_region_coord.jpg");
7、转化图像格式
//outputFormat(图像格式)
Thumbnails.of("images/微信图片.jpg").size(1280, 1024).outputFormat("png").toFile("c:/a380_1280x1024.png");
Thumbnails.of("images/微信图片.jpg").size(1280, 1024).outputFormat("gif").toFile("c:/a380_1280x1024.gif");
8、输出到OutputStream
//toOutputStream(流对象)
OutputStream os = new FileOutputStream("c:/a380_1280x1024_OutputStream.png");
Thumbnails.of("images/微信图片.jpg").size(1280, 1024).toOutputStream(os);
9、输出到BufferedImage
//asBufferedImage() 返回BufferedImage
BufferedImage thumbnail = Thumbnails.of("images/微信图片.jpg").size(1280, 1024).asBufferedImage();
ImageIO.write(thumbnail, "jpg", new File("c:/a380_1280x1024_BufferedImage.jpg"));