java图片加水印上传工具类_基于Spring Boot实现图片上传/加水印一把梭操作
文章共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实现图片上传/加水印一把梭操作相关推荐
- 项目_功能模块_基于Spring Boot的文件上传下载功能的设计与实现
文章目录 基于Spring Boot的文件上传下载功能模块的设计与实现 1.前言 2.技术栈 3.关键源码 4.实现效果 4.1.登录 4.2.文件列表 4.3.上传文件测试 4.3.1.测试图片 4 ...
- java spring上传图片_基于Spring Boot实现图片上传/加水印一把梭操作
文章共 537字,阅读大约需要 2分钟 ! 概述 很多网站的图片为了版权考虑都加有水印,尤其是那些图片类网站.自己正好最近和图片打交道比较多,因此就探索了一番基于 Spring Boot这把利器来实现 ...
- 3个基于 Spring Boot 的图片识别处理系统
大家好,我是阿逛! 今天推荐一下昨晚找的几个还不错的基于 Java 的图片识别处理系统. 中药图片拍照识别系统 项目地址:https://gitee.com/xiaohaoo/chinese-medi ...
- java+基于dom4j工具类_基于dom4j的xml映射实体的工具类(java)
基于dom4j的xml映射实体的工具类(java) 工具是基于dom4j,使用反射使实体属性与xml的标签关联,目前兼容List,Map后续更新兼容. 历史更新: 发布-2019-6-22 增加注解@ ...
- dom4j工具类_基于DOM4J的XML文件解析类
XML文件解析分四类方式:DOM解析:SAX解析:JDOM解析:DOM4J解析.其中前两种属于基础方法,是官方提供的平台无关的解析方式:后两种属于扩展方法,它们是在基础的方法上扩展出来的,只适用于ja ...
- spring的beanutils工具类_基于spring-beans实现工具类BeanUtils基于Class实例化注入对象及查找方法、复制属性等操作...
一.前言 基于spring-beans(4.1.4)的工具类org.springframework.beans.BeanUtils对注入spring对象按照Class实例化instantiateCla ...
- 招聘管理系统软件java源码_基于Spring Boot的java开源招聘源码-铭阳招聘管理系统...
铭阳招聘管理系统 铭阳招聘管理系统,采用流行的框架Spring Boot+mybatis+ehcache开发,实现了权限管理,solr全文搜索引擎,系统具执行效率高.模板自由切换.后台管理功能灵活等诸 ...
- Spring Boot和Thymeleaf:重新加载模板和静态资源,而无需重新启动应用程序
Thymeleaf是围绕自然模板的概念设计的,该模板允许进行静态原型制作:模板逻辑不会影响用作原型的模板. 尽管这是一项很棒的技术,但您可能还希望在运行的Spring Boot应用程序中查看结果,而不 ...
- java 图片合成 工具类_Java实现的图片上传工具类完整实例
本文实例讲述了Java实现的图片上传工具类.分享给大家供大家参考,具体如下: package com.gcloud.common; import javax.imageio.ImageIO; impo ...
最新文章
- 深入理解分布式技术 - TCC 事务模型及实战
- python grpc 并发_用Python进行gRPC接口测试(二)
- Vue使用vue-pull-refresh插件实现下拉刷新
- NOIP2011 铺地毯
- 关于telnet的问题
- Java经典实例:实现一个简单堆栈
- 136.Single Number
- Installing Perl modules from CPAN
- php高校学生户籍档案管理系统
- Java线程并发协作与任务定时调度
- ireport oracle,用ireport调用oracle存储过程
- 银河麒麟桌面V10微信不能登录
- java插入背景图片问题_java程序中如何插入背景图片
- 微信小程序 录像 录视频
- 巫妖王之怒诺森德大陆全貌视频 魔兽世界
- Go语言性能剖析利器--pprof实战
- nvl() 和nvl2()
- 假如ACMer有技能,你会选择哪个职业..
- mysql导入数据的格式转换_mysql数据库导入导出csv格式实现zblog转换帝国cms教程记录...
- java人名识别_HanLP-基于HMM-Viterbi的人名识别
热门文章
- 江西理工大学计算机网络基础试卷,无线网络技术作业(江西理工大学期末复习)...
- matlab print dmeta,打印图窗或保存为特定文件格式
- HTML5基础标签有哪些,HTML5基础标签
- NAACL 2022 | 具有元重加权的鲁棒自增强命名实体识别技术
- 在线vr高清3d展示线上三维展示平台
- 了解并掌握Halcon HDevelop 仿真程序语法
- linux备份磁盘数据,linux下vmstat输出数据分析-linux下dd命令备份磁盘的节点(...-linux watch命令用法简介(图文)_169IT.COM...
- Android使用Fragment打造万能页面切换框架
- 基于RNN-LSTM模型的诗词生成/TensorFlow
- 基于Android的火灾报警