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"));