资讯专栏INFORMATION COLUMN

慕课网_《Java实现图片水印》学习总结

levius / 2362人阅读

摘要:时间年月日星期五说明本文部分内容均来自慕课网。慕课网教学源码无学习源码第一章课程简介引言通过一个项目案例的讲解,如何在应用中实现图片水印的添加。

时间:2017年07月21日星期五
说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com
教学源码:无
学习源码:https://github.com/zccodere/s...

第一章:课程简介 1-1 引言

通过一个项目案例的讲解,如何在JavaWeb应用中实现图片水印的添加。

1-2 课程内容

课程内容

</>复制代码

  1. 1.Java图片水印实现思路
  2. 2.课程项目案例介绍
  3. 框架
  4. 实现方式
  5. 结果演示
  6. 3.课程案例详解
  7. 实现图片添加单个文字水印
  8. 实现图片添加单个图片水印
  9. 实现图片添加多个文字水印
  10. 实现图片添加多个图片水印
  11. 实现多图片批量添加水印
  12. 4.课程总结
1-3 课程目标

目标

</>复制代码

  1. 1.了解Java图片水印实现思路
  2. 2.掌握文字水印和图片水印的思路
  3. 3.掌握多图片批量水印的实现
第二章:实现原理 2-1 实现思路

实现思路

</>复制代码

  1. 1.创建缓存图片对象
  2. 2.创建Java绘图工具对象
  3. 3.使用绘图工具对象将原图绘制到缓存图片对象
  4. 4.使用绘图工具将水印(文字/图片)绘制到缓存图片对象
  5. 5.创建图像编码工具类
  6. 6.使用图片编码工具类,输出缓存图像到目标图片文件
2-2 实用工具类

实用工具类

</>复制代码

  1. 1.BufferedImage:图片缓存类
  2. 2.Graphics2D:对平面2D图片进行操作
  3. 3.JPEGImageEncoder:对图片文件进行编码处理并输出到磁盘文件中
第三章:案例介绍 3-1 案例演示

项目案例

</>复制代码

  1. 基于Strutus2框架的JavaWeb应用程序,允许一次上传多个图片,应用默认为上传图片添加水印,并将原图与添加水印图片对比展示。

说明

</>复制代码

  1. 个人学习时,均使用SpringBoot框架相关技术

结果演示

默认首页

点击浏览并选中图片

点击上传,结果如下

第四章:添加单个文字水印 4-1 搭建项目

创建名为watermark的maven项目POM文件如下

</>复制代码

  1. 4.0.0
  2. com.myimooc
  3. watermark
  4. 0.0.1-SNAPSHOT
  5. jar
  6. watermark
  7. http://maven.apache.org
  8. org.springframework.boot
  9. spring-boot-starter-parent
  10. 1.5.1.RELEASE
  11. UTF-8
  12. UTF-8
  13. org.springframework.boot
  14. spring-boot-starter
  15. org.springframework.boot
  16. spring-boot-starter-web
  17. org.springframework.boot
  18. spring-boot-starter-freemarker
  19. commons-io
  20. commons-io
  21. 2.5
  22. net.coobird
  23. thumbnailator
  24. 0.4.8
  25. org.apache.maven.plugins
  26. maven-compiler-plugin
  27. 1.8
  28. 1.8

编写配置类和启动类,完成后项目结构如下

4-2 编写页面

代码演示:

</>复制代码

  1. 上传文件
  2. 图片上传

  3. 请上传图片

4-3 编写控制器类

代码演示:

</>复制代码

  1. package com.myimooc.watermark.controller;
  2. import java.io.File;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import javax.servlet.http.HttpServletRequest;
  6. import org.slf4j.Logger;
  7. import org.slf4j.LoggerFactory;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.stereotype.Controller;
  10. import org.springframework.web.bind.annotation.PostMapping;
  11. import org.springframework.web.multipart.MultipartFile;
  12. import org.springframework.web.servlet.ModelAndView;
  13. import com.myimooc.watermark.domain.PicInfo;
  14. import com.myimooc.watermark.service.MarkService;
  15. import com.myimooc.watermark.service.UploadService;
  16. /**
  17. * WatermarkController 控制类
  18. *
  19. * @author ZhangCheng on 2017-07-21
  20. *
  21. */
  22. @Controller
  23. public class WatermarkController {
  24. private static Logger logger = LoggerFactory.getLogger(WatermarkController.class);
  25. @Autowired
  26. private UploadService uploadService;
  27. @Autowired
  28. private MarkService markService;
  29. /***
  30. * 单图片上传
  31. *
  32. * @param image
  33. * @param request
  34. * @return
  35. */
  36. @PostMapping("/watermark")
  37. public ModelAndView watermark(MultipartFile image, HttpServletRequest request) {
  38. ModelAndView mav = new ModelAndView("/watermark");
  39. PicInfo picInfo = new PicInfo();
  40. String uploadPath = "static/images/";
  41. String realUploadPath = getClass().getClassLoader().getResource(uploadPath).getPath();
  42. logger.info("上传相对目录:{}", uploadPath);
  43. logger.info("上传绝对目录:{}", uploadPath);
  44. String imageURL = uploadService.uploadImage(image, uploadPath, realUploadPath);
  45. File imageFile = new File(realUploadPath + image.getOriginalFilename());
  46. String logoImageURL = markService.watermake(imageFile, image.getOriginalFilename(), uploadPath, realUploadPath);
  47. picInfo.setImageURL(imageURL);
  48. picInfo.setLogoImageURL(logoImageURL);
  49. mav.addObject("picInfo", picInfo);
  50. return mav;
  51. }
  52. /**
  53. * 图片批量上传
  54. *
  55. * @param image
  56. * @param request
  57. * @return
  58. */
  59. @PostMapping("/morewatermark")
  60. public ModelAndView morewatermark(List image, HttpServletRequest request) {
  61. ModelAndView mav = new ModelAndView("/morewatermark");
  62. String uploadPath = "static/images/";
  63. String realUploadPath = getClass().getClassLoader().getResource(uploadPath).getPath();
  64. logger.info("上传相对目录:{}", uploadPath);
  65. logger.info("上传绝对目录:{}", realUploadPath);
  66. if (image != null && image.size() > 0) {
  67. List picInfoList = new ArrayList();
  68. for (MultipartFile imageFileTemp : image) {
  69. if(imageFileTemp == null || imageFileTemp.getSize() < 1){
  70. continue;
  71. }
  72. PicInfo picInfo = new PicInfo();
  73. String imageURL = uploadService.uploadImage(imageFileTemp, uploadPath, realUploadPath);
  74. File imageFile = new File(realUploadPath + imageFileTemp.getOriginalFilename());
  75. String logoImageURL = markService.watermake(imageFile, imageFileTemp.getOriginalFilename(), uploadPath,
  76. realUploadPath);
  77. picInfo.setImageURL(imageURL);
  78. picInfo.setLogoImageURL(logoImageURL);
  79. picInfoList.add(picInfo);
  80. }
  81. mav.addObject("picInfoList", picInfoList);
  82. }
  83. return mav;
  84. }
  85. }
4-4 编写水印接口

代码演示:

</>复制代码

  1. package com.myimooc.watermark.service;
  2. import java.awt.Color;
  3. import java.awt.Font;
  4. import java.io.File;
  5. /**
  6. * 图片水印服务类
  7. * @author ZhangCheng on 2017-07-21
  8. *
  9. */
  10. public interface MarkService {
  11. /** 水印文字内容 */
  12. public static final String MARK_TEXT = "妙手空空";
  13. /** 水印文字类型 */
  14. public static final String FONT_NAME = "微软雅黑";
  15. /** 水印文字样式 */
  16. public static final int FONT_STYLE = Font.BOLD;
  17. /** 水印文字大小 */
  18. public static final int FONT_SIZE= 120;// 单位:像素
  19. /** 水印文字颜色 */
  20. public static final Color FONT_COLOR= Color.BLACK;
  21. /** 水印文字位置X轴 */
  22. public static final int X = 10;
  23. /** 水印文字位置Y轴 */
  24. public static final int Y = 10;
  25. /** 水印文字透明度*/
  26. public static final float ALPHA = 0.3F;
  27. /** 水印图片*/
  28. public static final String LOGO = "logo.png";
  29. /**
  30. * 功能:将传入的图片添加水印并保存到服务器中
  31. * @param file
  32. * @param uploadPath
  33. * @param realUploadPath
  34. * @return 添加水印后图片的URL相对地址
  35. */
  36. String watermake(File imageFile,String imageFileName,String uploadPath,String realUploadPath);
  37. }
4-5 添加单个文字水印

代码演示

</>复制代码

  1. package com.myimooc.watermark.service;
  2. import java.awt.AlphaComposite;
  3. import java.awt.Font;
  4. import java.awt.Graphics2D;
  5. import java.awt.Image;
  6. import java.awt.image.BufferedImage;
  7. import java.io.File;
  8. import java.io.FileOutputStream;
  9. import java.io.IOException;
  10. import java.io.OutputStream;
  11. import javax.imageio.ImageIO;
  12. import org.springframework.stereotype.Service;
  13. import com.sun.image.codec.jpeg.JPEGCodec;
  14. import com.sun.image.codec.jpeg.JPEGImageEncoder;
  15. /**
  16. * 图片水印服务类,添加文字水印
  17. * @author ZhangCheng on 2017-07-21
  18. *
  19. */
  20. //@Service
  21. @SuppressWarnings("unused")
  22. public class TextMarkServiceImpl implements MarkService {
  23. @Override
  24. public String watermake(File imageFile,String imageFileName, String uploadPath, String realUploadPath) {
  25. String logoFileName = "logo_" + imageFileName;
  26. OutputStream os = null;
  27. try {
  28. Image image = ImageIO.read(imageFile);
  29. int width = image.getWidth(null);// 原图宽度
  30. int height = image.getHeight(null);// 原图高度
  31. // 创建图片缓存对象
  32. BufferedImage bufferedImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
  33. // 创建绘绘图工具对象
  34. Graphics2D g = bufferedImage.createGraphics();
  35. // 使用绘图工具将原图绘制到缓存图片对象
  36. g.drawImage(image, 0, 0, width,height,null);
  37. // 设置水印文字字体信息
  38. g.setFont(new Font(FONT_NAME,FONT_STYLE,FONT_SIZE));
  39. // 设置水印文字颜色
  40. g.setColor(FONT_COLOR);
  41. int markWidth = FONT_SIZE * getTextLength(MARK_TEXT);
  42. int markHeight = FONT_SIZE;
  43. // 水印的高度和宽度之差
  44. int widthDiff = width - markWidth;
  45. int heightDiff = height - markHeight;
  46. int x = X;
  47. int y = Y;
  48. // 判断设置的值是否大于图片大小
  49. if(x > widthDiff){
  50. x = widthDiff;
  51. }
  52. if(y > heightDiff){
  53. y =heightDiff;
  54. }
  55. // 设置水印文字透明度
  56. g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, ALPHA));
  57. // 添加水印
  58. g.drawString(MARK_TEXT, x, y + FONT_SIZE);
  59. g.dispose();
  60. os = new FileOutputStream(realUploadPath + "/" + logoFileName);
  61. JPEGImageEncoder en = JPEGCodec.createJPEGEncoder(os);
  62. en.encode(bufferedImage);
  63. } catch (Exception e) {
  64. e.printStackTrace();
  65. } finally {
  66. if(os!=null){
  67. try {
  68. os.close();
  69. } catch (IOException e) {
  70. e.printStackTrace();
  71. }
  72. }
  73. }
  74. return uploadPath + "/" + logoFileName;
  75. }
  76. /**
  77. * 功能:获取文本长度。汉字为1:1,英文和数字为2:1
  78. */
  79. private int getTextLength(String text){
  80. int length = text.length();
  81. for(int i = 0 ; i < text.length(); i++){
  82. String s = String.valueOf(text.charAt(i));
  83. if(s.getBytes().length > 1){
  84. length++;
  85. }
  86. }
  87. length = length % 2 == 0 ? length / 2 : length / 2 + 1;
  88. return length;
  89. }
  90. }
第五章:添加单个图片水印 5-1 图片水印添加

代码演示:

</>复制代码

  1. package com.myimooc.watermark.service;
  2. import java.awt.AlphaComposite;
  3. import java.awt.Graphics2D;
  4. import java.awt.Image;
  5. import java.awt.image.BufferedImage;
  6. import java.io.File;
  7. import java.io.FileOutputStream;
  8. import java.io.IOException;
  9. import java.io.OutputStream;
  10. import javax.imageio.ImageIO;
  11. import org.springframework.stereotype.Service;
  12. import com.sun.image.codec.jpeg.JPEGCodec;
  13. import com.sun.image.codec.jpeg.JPEGImageEncoder;
  14. /**
  15. * 图片水印服务类,添加图片水印
  16. * @author ZhangCheng on 2017-07-22
  17. *
  18. */
  19. //@Service
  20. @SuppressWarnings("unused")
  21. public class ImageMarkServiceImpl implements MarkService {
  22. @Override
  23. public String watermake(File imageFile, String imageFileName, String uploadPath, String realUploadPath) {
  24. String logoFileName = "logo_" + imageFileName;
  25. OutputStream os = null;
  26. // 图片地址
  27. String logoPath = realUploadPath + "/" + LOGO;
  28. try {
  29. Image image = ImageIO.read(imageFile);
  30. int width = image.getWidth(null);// 原图宽度
  31. int height = image.getHeight(null);// 原图高度
  32. // 创建图片缓存对象
  33. BufferedImage bufferedImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
  34. // 创建绘绘图工具对象
  35. Graphics2D g = bufferedImage.createGraphics();
  36. // 使用绘图工具将原图绘制到缓存图片对象
  37. g.drawImage(image, 0, 0, width,height,null);
  38. // 读取Logo图片
  39. File logo = new File(logoPath);
  40. Image imageLogo = ImageIO.read(logo);
  41. // 获取Logo图片的宽度和高度
  42. int markWidth = imageLogo.getWidth(null);
  43. int markHeight = imageLogo.getHeight(null);
  44. // 原图和Logo图片的高度和宽度之差
  45. int widthDiff = width - markWidth;
  46. int heightDiff = height - markHeight;
  47. int x = X;
  48. int y = Y;
  49. // 判断设置的值是否大于图片大小
  50. if(x > widthDiff){
  51. x = widthDiff;
  52. }
  53. if(y > heightDiff){
  54. y =heightDiff;
  55. }
  56. // 设置水印透明度
  57. g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, ALPHA));
  58. // 添加水印
  59. g.drawImage(imageLogo, x, y, null);
  60. g.dispose();
  61. os = new FileOutputStream(realUploadPath + "/" + logoFileName);
  62. JPEGImageEncoder en = JPEGCodec.createJPEGEncoder(os);
  63. en.encode(bufferedImage);
  64. } catch (Exception e) {
  65. e.printStackTrace();
  66. } finally {
  67. if(os!=null){
  68. try {
  69. os.close();
  70. } catch (IOException e) {
  71. e.printStackTrace();
  72. }
  73. }
  74. }
  75. return uploadPath + "/" + logoFileName;
  76. }
  77. }
第六章:添加多个文字水印 6-1 添加多个文字水印

代码演示:

</>复制代码

  1. package com.myimooc.watermark.service;
  2. import java.awt.AlphaComposite;
  3. import java.awt.Font;
  4. import java.awt.Graphics2D;
  5. import java.awt.Image;
  6. import java.awt.image.BufferedImage;
  7. import java.io.File;
  8. import java.io.FileOutputStream;
  9. import java.io.IOException;
  10. import java.io.OutputStream;
  11. import javax.imageio.ImageIO;
  12. import org.springframework.stereotype.Service;
  13. import com.sun.image.codec.jpeg.JPEGCodec;
  14. import com.sun.image.codec.jpeg.JPEGImageEncoder;
  15. /**
  16. * 图片水印服务类,添加多个文字水印
  17. * @author ZhangCheng on 2017-07-22
  18. *
  19. */
  20. //@Service
  21. @SuppressWarnings("unused")
  22. public class MoreTextMarkServiceImpl implements MarkService {
  23. @Override
  24. public String watermake(File imageFile, String imageFileName, String uploadPath, String realUploadPath) {
  25. String logoFileName = "logo_" + imageFileName;
  26. OutputStream os = null;
  27. try {
  28. Image image = ImageIO.read(imageFile);
  29. int width = image.getWidth(null);// 原图宽度
  30. int height = image.getHeight(null);// 原图高度
  31. // 创建图片缓存对象
  32. BufferedImage bufferedImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
  33. // 创建绘绘图工具对象
  34. Graphics2D g = bufferedImage.createGraphics();
  35. // 使用绘图工具将原图绘制到缓存图片对象
  36. g.drawImage(image, 0, 0, width,height,null);
  37. // 设置水印文字字体信息
  38. g.setFont(new Font(FONT_NAME,FONT_STYLE,FONT_SIZE));
  39. // 设置水印文字颜色
  40. g.setColor(FONT_COLOR);
  41. int markWidth = FONT_SIZE * getTextLength(MARK_TEXT);
  42. int markHeight = FONT_SIZE;
  43. // 设置水印透明度
  44. g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, ALPHA));
  45. // 旋转图片
  46. g.rotate(Math.toRadians(30), bufferedImage.getWidth()/2, bufferedImage.getHeight()/2);
  47. int x = -width / 2;
  48. int y = -height / 2;
  49. int xmove = 200;// 水印之间的间隔
  50. int ymove = 200;// 水印之间的间隔
  51. // 循环添加
  52. while (x < width * 1.5){
  53. y = -height / 2;
  54. while(y < height * 1.5){
  55. g.drawString(MARK_TEXT, x, y);
  56. y += markHeight + ymove;
  57. }
  58. x += markWidth + xmove;
  59. }
  60. g.dispose();
  61. os = new FileOutputStream(realUploadPath + "/" + logoFileName);
  62. JPEGImageEncoder en = JPEGCodec.createJPEGEncoder(os);
  63. en.encode(bufferedImage);
  64. } catch (Exception e) {
  65. e.printStackTrace();
  66. } finally {
  67. if(os!=null){
  68. try {
  69. os.close();
  70. } catch (IOException e) {
  71. e.printStackTrace();
  72. }
  73. }
  74. }
  75. return uploadPath + "/" + logoFileName;
  76. }
  77. /**
  78. * 功能:获取文本长度。汉字为1:1,英文和数字为2:1
  79. */
  80. private int getTextLength(String text){
  81. int length = text.length();
  82. for(int i = 0 ; i < text.length(); i++){
  83. String s = String.valueOf(text.charAt(i));
  84. if(s.getBytes().length > 1){
  85. length++;
  86. }
  87. }
  88. length = length % 2 == 0 ? length / 2 : length / 2 + 1;
  89. return length;
  90. }
  91. }
第七章:添加多个图片水印 7-1 添加多个图片水印

代码演示:

</>复制代码

  1. package com.myimooc.watermark.service;
  2. import java.awt.AlphaComposite;
  3. import java.awt.Graphics2D;
  4. import java.awt.Image;
  5. import java.awt.image.BufferedImage;
  6. import java.io.File;
  7. import java.io.FileOutputStream;
  8. import java.io.IOException;
  9. import java.io.OutputStream;
  10. import javax.imageio.ImageIO;
  11. import org.springframework.stereotype.Service;
  12. import com.sun.image.codec.jpeg.JPEGCodec;
  13. import com.sun.image.codec.jpeg.JPEGImageEncoder;
  14. /**
  15. * 图片水印服务类,添加多个图片水印
  16. * @author ZhangCheng on 2017-07-22
  17. *
  18. */
  19. @Service
  20. public class MoreImageMarkServiceImpl implements MarkService {
  21. @Override
  22. public String watermake(File imageFile, String imageFileName, String uploadPath, String realUploadPath) {
  23. String logoFileName = "logo_" + imageFileName;
  24. OutputStream os = null;
  25. try {
  26. Image image = ImageIO.read(imageFile);
  27. int width = image.getWidth(null);// 原图宽度
  28. int height = image.getHeight(null);// 原图高度
  29. // 创建图片缓存对象
  30. BufferedImage bufferedImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
  31. // 创建绘绘图工具对象
  32. Graphics2D g = bufferedImage.createGraphics();
  33. // 使用绘图工具将原图绘制到缓存图片对象
  34. g.drawImage(image, 0, 0, width,height,null);
  35. // 图片地址
  36. String logoPath = realUploadPath + "/" + LOGO;
  37. // 读取Logo图片
  38. File logo = new File(logoPath);
  39. Image imageLogo = ImageIO.read(logo);
  40. // Logo图片的宽度和高度
  41. int markWidth = imageLogo.getWidth(null);
  42. int markHeight = imageLogo.getHeight(null);
  43. // 设置水印透明度
  44. g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, ALPHA));
  45. // 旋转图片
  46. g.rotate(Math.toRadians(30), bufferedImage.getWidth()/2, bufferedImage.getHeight()/2);
  47. int x = -width / 2;
  48. int y = -height / 2;
  49. int xmove = 200;// 水印之间的间隔
  50. int ymove = 200;// 水印之间的间隔
  51. // 循环添加
  52. while (x < width * 1.5){
  53. y = -height / 2;
  54. while(y < height * 1.5){
  55. // 添加水印
  56. g.drawImage(imageLogo, x, y, null);
  57. y += markHeight + ymove;
  58. }
  59. x += markWidth + xmove;
  60. }
  61. g.dispose();
  62. os = new FileOutputStream(realUploadPath + "/" + logoFileName);
  63. JPEGImageEncoder en = JPEGCodec.createJPEGEncoder(os);
  64. en.encode(bufferedImage);
  65. } catch (Exception e) {
  66. e.printStackTrace();
  67. } finally {
  68. if(os!=null){
  69. try {
  70. os.close();
  71. } catch (IOException e) {
  72. e.printStackTrace();
  73. }
  74. }
  75. }
  76. return uploadPath + "/" + logoFileName;
  77. }
  78. }
第八章:批量添加图片水印 8-1 批量添加图片水印

代码演示

1.编写moreupload.html

</>复制代码

  1. 上传文件
  2. 图片批量上传

  3. 请上传图片






2.修改WatermarkController类

</>复制代码

  1. package com.myimooc.watermark.controller;
  2. import java.io.File;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import javax.servlet.http.HttpServletRequest;
  6. import org.slf4j.Logger;
  7. import org.slf4j.LoggerFactory;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.stereotype.Controller;
  10. import org.springframework.web.bind.annotation.PostMapping;
  11. import org.springframework.web.multipart.MultipartFile;
  12. import org.springframework.web.servlet.ModelAndView;
  13. import com.myimooc.watermark.domain.PicInfo;
  14. import com.myimooc.watermark.service.MarkService;
  15. import com.myimooc.watermark.service.UploadService;
  16. /**
  17. * WatermarkController 控制类
  18. *
  19. * @author ZhangCheng on 2017-07-21
  20. *
  21. */
  22. @Controller
  23. public class WatermarkController {
  24. private static Logger logger = LoggerFactory.getLogger(WatermarkController.class);
  25. @Autowired
  26. private UploadService uploadService;
  27. @Autowired
  28. private MarkService markService;
  29. /***
  30. * 单图片上传
  31. *
  32. * @param image
  33. * @param request
  34. * @return
  35. */
  36. @PostMapping("/watermark")
  37. public ModelAndView watermark(MultipartFile image, HttpServletRequest request) {
  38. ModelAndView mav = new ModelAndView("/watermark");
  39. PicInfo picInfo = new PicInfo();
  40. String uploadPath = "static/images/";
  41. String realUploadPath = getClass().getClassLoader().getResource(uploadPath).getPath();
  42. logger.info("上传相对目录:{}", uploadPath);
  43. logger.info("上传绝对目录:{}", uploadPath);
  44. String imageURL = uploadService.uploadImage(image, uploadPath, realUploadPath);
  45. File imageFile = new File(realUploadPath + image.getOriginalFilename());
  46. String logoImageURL = markService.watermake(imageFile, image.getOriginalFilename(), uploadPath, realUploadPath);
  47. picInfo.setImageURL(imageURL);
  48. picInfo.setLogoImageURL(logoImageURL);
  49. mav.addObject("picInfo", picInfo);
  50. return mav;
  51. }
  52. /**
  53. * 图片批量上传
  54. *
  55. * @param image
  56. * @param request
  57. * @return
  58. */
  59. @PostMapping("/morewatermark")
  60. public ModelAndView morewatermark(List image, HttpServletRequest request) {
  61. ModelAndView mav = new ModelAndView("/morewatermark");
  62. String uploadPath = "static/images/";
  63. String realUploadPath = getClass().getClassLoader().getResource(uploadPath).getPath();
  64. logger.info("上传相对目录:{}", uploadPath);
  65. logger.info("上传绝对目录:{}", realUploadPath);
  66. if (image != null && image.size() > 0) {
  67. List picInfoList = new ArrayList();
  68. for (MultipartFile imageFileTemp : image) {
  69. if(imageFileTemp == null || imageFileTemp.getSize() < 1){
  70. continue;
  71. }
  72. PicInfo picInfo = new PicInfo();
  73. String imageURL = uploadService.uploadImage(imageFileTemp, uploadPath, realUploadPath);
  74. File imageFile = new File(realUploadPath + imageFileTemp.getOriginalFilename());
  75. String logoImageURL = markService.watermake(imageFile, imageFileTemp.getOriginalFilename(), uploadPath,
  76. realUploadPath);
  77. picInfo.setImageURL(imageURL);
  78. picInfo.setLogoImageURL(logoImageURL);
  79. picInfoList.add(picInfo);
  80. }
  81. mav.addObject("picInfoList", picInfoList);
  82. }
  83. return mav;
  84. }
  85. }

3.编写morewatermark.html

</>复制代码

  1. 处理结果
  2. 操作结果

  3. [#list picInfoList as item]
  4. [/#list]

  5. 返回

4.效果展示

访问图片批量上传页

选择文件

点击上传图片,结果如下

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67449.html

相关文章

  • 课网_Java图片验证码》学习总结

    时间:2017年07月09日星期日说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学源码:无学习源码:https://github.com/zccodere/s... 第一章:概述 1-1 课程概述 主要内容 验证码历史 课程内容 不同方案对比 设计与实现 总结 1-2 验证码历史 验证码历史 无验证码:垃圾骚扰 Luis von Ahn:Captcha 不断...

    haitiancoder 评论0 收藏0
  • 课网_Java实现图片等比例缩略图》学习总结

    摘要:时间年月日星期六说明本文部分内容均来自慕课网。可以更加专注于业务逻辑开发,缩短项目开发周期,提高项目开发速度。 时间:2017年07月15日星期六说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学源码:无学习源码:https://github.com/zccodere/s... 第一章:课程介绍 1-1 课程介绍 在用户进行信息概略浏览的时候,提供缩...

    raledong 评论0 收藏0
  • 课网_Java生成二维码》学习总结

    摘要:时间年月日星期五说明本文部分内容均来自慕课网。线性堆叠式二维码示意图矩阵式二维码在一个矩形空间通过黑白像素在矩阵中的不同分布进行编码。 时间:2017年06月23日星期五说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学示例源码:无个人学习源码:https://github.com/zccodere/s... 第一章:二维码的概念 1-1 二维码概述...

    QLQ 评论0 收藏0
  • 课网_Java实现Base64加密》学习总结

    摘要:时间年月日星期一说明本文部分内容均来自慕课网。多用于网络加密。散列函数函数或消息摘要函数主要作用散列函数用来验证数据的完整性。 时间:2017年4月10日星期一说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学示例源码:https://github.com/zccodere/s...个人学习源码:https://github.com/zccodere...

    verano 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<