从零搭建自己的SpringBoot后台框架(二十二)

释放双眼,带上耳机,听听看~!

现在很多网站上,都有上传图片这个功能,而图片对于现在的很多手机来说,拍摄出来的都是高清图片,分辨率也很高,当然占用的存储空间也就大了。问题也就产生了,你每个用户都上传个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

四:文档地址

具体示例大家可自行查看

帮助文档

给TA打赏
共{{data.count}}人
人已打赏
安全技术

C/C++内存泄漏及检测

2022-1-11 12:36:11

安全运维

Redis 的噩梦:阻塞

2021-12-11 11:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索