文章共537字,阅读大约需要 2分钟 !

概述

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

本文内容脑图如下:

搭建 Spring Boot基础工程

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

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-test

test

commons-io

commons-io

2.5

编写文件上传服务

主要就是编写 ImageUploadService 服务

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

/**

* 功能:上传图片

* @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 方法,代码后面写有详细解释

@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绘制到缓存图片

⑤ 创建图像编码工具类

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

可见思路清晰易懂!

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

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

@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 请求,进行图片上传的操作:

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

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

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

后记

由于能力有限,若有错误或者不当之处,还请大家批评指正,一起学习交流!

My Personal Blog:CodeSheep 程序羊

可 长按 或 扫描 下面的 小心心 来订阅 CodeSheep ,获取更多 务实、能看懂、可复现的 原创文 ↓↓↓

最后附上个人联系方式,欢迎大家交流学习:

个人博客:www.codesheep.cn

java图片加水印上传工具类_基于Spring Boot实现图片上传/加水印一把梭操作相关推荐

  1. 项目_功能模块_基于Spring Boot的文件上传下载功能的设计与实现

    文章目录 基于Spring Boot的文件上传下载功能模块的设计与实现 1.前言 2.技术栈 3.关键源码 4.实现效果 4.1.登录 4.2.文件列表 4.3.上传文件测试 4.3.1.测试图片 4 ...

  2. java spring上传图片_基于Spring Boot实现图片上传/加水印一把梭操作

    文章共 537字,阅读大约需要 2分钟 ! 概述 很多网站的图片为了版权考虑都加有水印,尤其是那些图片类网站.自己正好最近和图片打交道比较多,因此就探索了一番基于 Spring Boot这把利器来实现 ...

  3. 3个基于 Spring Boot 的图片识别处理系统

    大家好,我是阿逛! 今天推荐一下昨晚找的几个还不错的基于 Java 的图片识别处理系统. 中药图片拍照识别系统 项目地址:https://gitee.com/xiaohaoo/chinese-medi ...

  4. java+基于dom4j工具类_基于dom4j的xml映射实体的工具类(java)

    基于dom4j的xml映射实体的工具类(java) 工具是基于dom4j,使用反射使实体属性与xml的标签关联,目前兼容List,Map后续更新兼容. 历史更新: 发布-2019-6-22 增加注解@ ...

  5. dom4j工具类_基于DOM4J的XML文件解析类

    XML文件解析分四类方式:DOM解析:SAX解析:JDOM解析:DOM4J解析.其中前两种属于基础方法,是官方提供的平台无关的解析方式:后两种属于扩展方法,它们是在基础的方法上扩展出来的,只适用于ja ...

  6. spring的beanutils工具类_基于spring-beans实现工具类BeanUtils基于Class实例化注入对象及查找方法、复制属性等操作...

    一.前言 基于spring-beans(4.1.4)的工具类org.springframework.beans.BeanUtils对注入spring对象按照Class实例化instantiateCla ...

  7. 招聘管理系统软件java源码_基于Spring Boot的java开源招聘源码-铭阳招聘管理系统...

    铭阳招聘管理系统 铭阳招聘管理系统,采用流行的框架Spring Boot+mybatis+ehcache开发,实现了权限管理,solr全文搜索引擎,系统具执行效率高.模板自由切换.后台管理功能灵活等诸 ...

  8. Spring Boot和Thymeleaf:重新加载模板和静态资源,而无需重新启动应用程序

    Thymeleaf是围绕自然模板的概念设计的,该模板允许进行静态原型制作:模板逻辑不会影响用作原型的模板. 尽管这是一项很棒的技术,但您可能还希望在运行的Spring Boot应用程序中查看结果,而不 ...

  9. java 图片合成 工具类_Java实现的图片上传工具类完整实例

    本文实例讲述了Java实现的图片上传工具类.分享给大家供大家参考,具体如下: package com.gcloud.common; import javax.imageio.ImageIO; impo ...

最新文章

  1. 深入理解分布式技术 - TCC 事务模型及实战
  2. python grpc 并发_用Python进行gRPC接口测试(二)
  3. Vue使用vue-pull-refresh插件实现下拉刷新
  4. NOIP2011 铺地毯
  5. 关于telnet的问题
  6. Java经典实例:实现一个简单堆栈
  7. 136.Single Number
  8. Installing Perl modules from CPAN
  9. php高校学生户籍档案管理系统
  10. Java线程并发协作与任务定时调度
  11. ireport oracle,用ireport调用oracle存储过程
  12. 银河麒麟桌面V10微信不能登录
  13. java插入背景图片问题_java程序中如何插入背景图片
  14. 微信小程序 录像 录视频
  15. 巫妖王之怒诺森德大陆全貌视频 魔兽世界
  16. Go语言性能剖析利器--pprof实战
  17. nvl() 和nvl2()
  18. 假如ACMer有技能,你会选择哪个职业..
  19. mysql导入数据的格式转换_mysql数据库导入导出csv格式实现zblog转换帝国cms教程记录...
  20. java人名识别_HanLP-基于HMM-Viterbi的人名识别

热门文章

  1. 江西理工大学计算机网络基础试卷,无线网络技术作业(江西理工大学期末复习)...
  2. matlab print dmeta,打印图窗或保存为特定文件格式
  3. HTML5基础标签有哪些,HTML5基础标签
  4. NAACL 2022 | 具有元重加权的鲁棒自增强命名实体识别技术
  5. 在线vr高清3d展示线上三维展示平台
  6. 了解并掌握Halcon HDevelop 仿真程序语法
  7. linux备份磁盘数据,linux下vmstat输出数据分析-linux下dd命令备份磁盘的节点(...-linux watch命令用法简介(图文)_169IT.COM...
  8. Android使用Fragment打造万能页面切换框架
  9. 基于RNN-LSTM模型的诗词生成/TensorFlow
  10. 基于Android的火灾报警