现在很多网站上,都有上传图片这个功能,而图片对于现在的很多手机来说,拍摄出来的都是高清图片,分辨率也很高,当然占用的存储空间也就大了。问题也就产生了,你每个用户都上传个3M的图片怎么办?
用户如果加载你的网页加载个半天,就是因为图片太大导致的那就不是钱能解决的问题了。
因为用户的网络环境你是不可控制的。所以本章我们添加图片压缩,添加水印,格式转换等功能。
一:添加thumbnailator依赖
1
2
3
4
5
6 1<dependency>
2 <groupId>net.coobird</groupId>
3 <artifactId>thumbnailator</artifactId>
4 <version>0.4.8</version>
5</dependency>
6
二:创建图片处理类
创建core→utils→ImageUtils.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138 1package com.example.demo.core.utils;
2
3import net.coobird.thumbnailator.Thumbnails;
4import net.coobird.thumbnailator.geometry.Positions;
5import net.coobird.thumbnailator.name.Rename;
6import net.coobird.thumbnailator.resizers.configurations.ScalingMode;
7import org.slf4j.Logger;
8import org.slf4j.LoggerFactory;
9
10import javax.imageio.ImageIO;
11import java.io.File;
12import java.io.FileOutputStream;
13import java.io.IOException;
14import java.io.OutputStream;
15
16/**
17 * 图片处理工具类,主要压缩,添加logo等
18 * @author phubing
19 */
20public class ImageUtils {
21
22 public static Logger logger = LoggerFactory.getLogger(ImageUtils.class);
23
24 public static void main(String[] args) {
25 //使用给定的图片生成指定大小的图片
26 //generateFixedSizeImage();
27
28 //对原图加水印,然后顺时针旋转90度,最后压缩为80%保存
29 //generateRotationWatermark();
30
31 //转换图片格式,将流写入到输出流
32 //generateOutputstream();
33
34 //按比例缩放图片
35 //generateScale();
36
37 //生成缩略图到指定的目录
38 //generateThumbnail2Directory();
39
40 //将指定目录下所有图片生成缩略图
41 //generateDirectoryThumbnail();
42 }
43
44 /**
45 * 使用给定的图片生成指定大小的图片
46 */
47 public static void generateFixedSizeImage(){
48 try {
49 Thumbnails.of("C:\\Users\\Administrator\\Desktop\\微信图片_20180129100019.jpg").size(80,80).toFile("C:\\Users\\Administrator\\Desktop\\newmeinv.jpg");
50 } catch (IOException e) {
51 logger.error(e.getMessage());
52 }
53 }
54
55 /**
56 * 对原图加水印,然后顺时针旋转90度,最后压缩为80%保存
57 */
58 public static void generateRotationWatermark(){
59 try {
60 Thumbnails.of("C:\\Users\\Administrator\\Desktop\\微信图片_20180129100019.jpg").
61 // 缩放大小
62 size(1600,1600).
63 // 顺时针旋转90度
64 rotate(90).
65 //水印位于右下角,半透明
66 watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File("C:\\Users\\Administrator\\Desktop\\微信图片_20180329153521.png")),1f).
67 // 图片压缩80%质量
68 outputQuality(0.8).
69 toFile("C:\\Users\\Administrator\\Desktop\\2016010208_new.jpg");
70 } catch (IOException e) {
71 logger.error(e.getMessage());
72 }
73 }
74
75 /**
76 * 转换图片格式,将流写入到输出流
77 */
78 public static void generateOutputstream(){
79 try(OutputStream outputStream = new FileOutputStream("data/2016010208_outputstream.png")) {
80 Thumbnails.of("data/2016010208.jpg").
81 size(500,500).
82 // 转换格式
83 outputFormat("png").
84 // 写入输出流
85 toOutputStream(outputStream);
86 } catch (IOException e) {
87 logger.error(e.getMessage());
88 }
89 }
90
91 /**
92 * 按比例缩放图片
93 */
94 public static void generateScale(){
95 try {
96 Thumbnails.of("data/2016010208.jpg").
97 scalingMode(
98 ScalingMode.BICUBIC).
99 // 图片缩放80%, 不能和size()一起使用
100 scale(0.8).
101 // 图片质量压缩80%
102 outputQuality(0.8).
103 toFile("data/2016010208_scale.jpg");
104 } catch (IOException e) {
105 logger.error(e.getMessage());
106 }
107 }
108
109 /**
110 * 生成缩略图到指定的目录
111 */
112 public static void generateThumbnail2Directory(){
113 try {
114 Thumbnails.of("data/2016010208.jpg","data/meinv.jpg").
115 // 图片缩放80%, 不能和size()一起使用
116 scale(0.8).
117 //指定的目录一定要存在,否则报错
118 toFiles(new File("data/new/"), Rename.NO_CHANGE);
119 } catch (IOException e) {
120 logger.error(e.getMessage());
121 }
122 }
123
124 /**
125 * 将指定目录下所有图片生成缩略图
126 */
127 public static void generateDirectoryThumbnail(){
128 try {
129 Thumbnails.of(
130 new File("data/new").listFiles()).
131 scale(0.8).
132 toFiles(new File("data/new/"), Rename.SUFFIX_HYPHEN_THUMBNAIL);
133 } catch (IOException e) {
134 logger.error(e.getMessage());
135 }
136 }
137}
138
三:基本使用方法介绍
1
2
3
4
5
6
7
8
9
10
11
12
13 1Thumbnails.of("原图文件的路径")
2 //生成图片大小
3 .size(100,100)
4 //缩放比例 0-1之间
5 .scale(1f)
6 //图片质量 0-1之间 1最好
7 .outputQuality(0.5f)
8 //顺时针旋转度数
9 .rotate(90)
10 //水印 第一个参数:水印位置 第二个:水印所在路径 第三个:水印透明度
11 .watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File("水印所在路径")),1f).
12 .toFile("压缩后文件的路径");
13
四:文档地址
具体示例大家可自行查看
帮助文档