好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Spring Boot实现图片上传/加水印一把梭操作实例代码

概述

很多网站的图片为了版权考虑都加有水印,尤其是那些图片类网站。自己正好最近和图片打交道比较多,因此就探索了一番基于 spring boot这把利器来实现从 图片上传 → 图片加水印 的一把梭操作!

本文内容脑图如下:


本文内容脑图

搭建 spring boot基础工程

过程不再赘述了,这里给出 pom中的关键依赖:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

<dependencies>

<dependency>

<groupid>org.springframework.boot</groupid>

<artifactid>spring-boot-starter-web</artifactid>

</dependency>

 

<dependency>

<groupid>org.springframework.boot</groupid>

<artifactid>spring-boot-starter-test</artifactid>

<scope>test</scope>

</dependency>

 

<dependency>

<groupid>commons-io</groupid>

<artifactid>commons-io</artifactid>

<version> 2.5 </version>

</dependency>

</dependencies>

编写文件上传服务

主要就是编写 imageuploadservice 服务

里面仅一个上传图片的方法:uploadimage 方法

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

/**

* 功能:上传图片

* @param file 文件

* @param uploadpath 服务器上上传文件的路径

* @param physicaluploadpath 服务器上上传文件的物理路径

* @return 上传文件的 url相对地址

*/

public string uploadimage( multipartfile file, string uploadpath, string physicaluploadpath ) {

 

string filepath = physicaluploadpath + file.getoriginalfilename();

 

try {

file targetfile= new file(filepath);

fileutils.writebytearraytofile(targetfile, file.getbytes());

} catch (ioexception e) {

e.printstacktrace();

}

return uploadpath + "/" + file.getoriginalfilename();

}

}

编写图片加水印服务

编写 imagewatermarkservice 服务

里面就一个主要的 watermarkadd方法,代码后面写有详细解释

?

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

@service

public class imagewatermarkservice {

 

/**

* imgfile 图像文件

* imagefilename 图像文件名

* uploadpath 服务器上上传文件的相对路径

* realuploadpath 服务器上上传文件的物理路径

*/

public string watermarkadd( file imgfile, string imagefilename, string uploadpath, string realuploadpath ) {

 

string imgwithwatermarkfilename = "watermark_" + imagefilename;

outputstream os = null ;

 

try {

image image = imageio.read(imgfile);

 

int width = image.getwidth( null );

int height = image.getheight( null );

 

bufferedimage bufferedimage = new bufferedimage(width,height,bufferedimage.type_int_rgb); // ①

graphics2d g = bufferedimage.creategraphics(); // ②

g.drawimage(image, 0 , 0 , width,height, null ); // ③

 

string logopath = realuploadpath + "/" + const .logo_file_name; // 水印图片地址

file logo = new file(logopath); // 读取水印图片

image imagelogo = imageio.read(logo);

 

int markwidth = imagelogo.getwidth( null ); // 水印图片的宽度和高度

int markheight = imagelogo.getheight( null );

 

g.setcomposite( alphacomposite.getinstance(alphacomposite.src_atop, const .alpha) ); // 设置水印透明度

g.rotate(math.toradians(- 10 ), bufferedimage.getwidth()/ 2 , bufferedimage.getheight()/ 2 ); // 设置水印图片的旋转度

 

int x = const .x;

int y = const .y;

 

int xinterval = const .x_interval;

int yinterval = const .y_interval;

 

double count = 1.5 ;

while ( x < width*count ) { // 循环添加多个水印logo

y = -height / 2 ;

while ( y < height*count ) {

g.drawimage(imagelogo, x, y, null ); // ④

y += markheight + yinterval;

}

x += markwidth + xinterval;

}

 

g.dispose();

 

os = new fileoutputstream(realuploadpath + "/" + imgwithwatermarkfilename);

jpegimageencoder en = jpegcodec.createjpegencoder(os); // ⑤

en.encode(bufferedimage); // ⑥

 

} catch (exception e) {

e.printstacktrace();

} finally {

if (os!= null ){

try {

os.close();

} catch (ioexception e) {

e.printstacktrace();

}

}

}

 

return uploadpath + "/" + imgwithwatermarkfilename;

}

 

}

代码思路解释如下:

可以对照代码中的标示数字和下面的解释进行理解:

① 创建缓存图片

② 创建绘图工具

③ 将原图绘制到缓存图片

④ 将水印logo绘制到缓存图片

⑤ 创建图像编码工具类

⑥ 编码缓存图像生成目标图片

可见思路清晰易懂!

编写 图片上传/处理 控制器

我们在该控制器代码中将上述的 图片上传服务 和 图片加水印服务 给用起来:

?

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

@restcontroller

public class watermarkcontroller {

 

@autowired

private imageuploadservice imageuploadservice;

 

@autowired

private imagewatermarkservice watermarkservice;

 

@requestmapping (value = "/watermarktest" , method = requestmethod.post)

public imageinfo watermarktest( @requestparam ( "file" ) multipartfile image ) {

 

imageinfo imginfo = new imageinfo();

 

string uploadpath = "static/images/" ; // 服务器上上传文件的相对路径

string physicaluploadpath = getclass().getclassloader().getresource(uploadpath).getpath(); // 服务器上上传文件的物理路径

 

string imageurl = imageuploadservice.uploadimage( image, uploadpath, physicaluploadpath );

file imagefile = new file(physicaluploadpath + image.getoriginalfilename() );

 

string watermarkaddimageurl = watermarkservice.watermarkadd(imagefile, image.getoriginalfilename(), uploadpath, physicaluploadpath);

 

imginfo.setimageurl(imageurl);

imginfo.setlogoimageurl(watermarkaddimageurl);

return imginfo;

}

}

实际实验与效果展示

我们用 postman工具来辅助我们发出 localhost:9999/watermarktest 请求,进行图片上传的操作:


postman发请求进行图片上传

之后我们再去项目的资源目录下查看上传的原图 和 加完水印后图片的效果如下:

原图


加完水印后的图片

喔唷,这水印 logo是不是打的有点多…

不过这下终于不用害怕别人对您的图片侵权啦 !

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。

原文链接:http://HdhCmsTestcodesheep.cn/2018/11/15/springbt-fileupload-wartermark/

查看更多关于Spring Boot实现图片上传/加水印一把梭操作实例代码的详细内容...

  阅读:14次