java图片上传和加水印


简介

大家在做项目开发的时候,经常会用到图片上传,有些牵扯到版权或者私密的图片需要进行添加上水印,小编在总结了前人的经验之后,总结了一份element ui+spring boot上传图片并加水印的代码,希望能够帮助大家,下面废话就不多说了,开始搞代码。

01.java实现图片上传Controller代码

@CrossOrigin@RestController@RequestMapping("/uploadImage")public class UploadController {@RequestMapping(value = "/uplaod", method = {RequestMethod.GET, RequestMethod.POST})@ResponseBodypublic HashMap<String, Object> uplaod(HttpServletRequest request, @RequestParam("img") MultipartFile file, @RequestParam("type") String type) {HashMap<String, Object> result = new HashMap<String, Object>();//想要存储文件的地址String pathName = "upload/";// 定义文件全路径String pathFullName="";File filePath = new File(pathName);// 判断目录是否存在,如果不存在,创建文件目录if (!filePath.exists() && !filePath.isDirectory()) {System.out.println("目录不存在,创建目录:" + filePath);filePath.mkdirs();}// 定义一个uuid用来保存图片的名字,也可以根据自己的需求来定义保存文件的名字UUID uuid = UUID.randomUUID();//获取文件名(包括后缀)String uploadName = file.getOriginalFilename();// 取得文件名后缀String suffix = uploadName.substring(uploadName.lastIndexOf(".") + 1);pathFullName = pathName + uuid.toString() + "." + suffix;SysDict sysDict = new SysDict();sysDict.setDictCode(type);SysDict resDict = sysDictService.getSysDict(sysDict);FileOutputStream fos = null;try {fos = new FileOutputStream(pathFullName);fos.write(file.getBytes()); // 写入文件// 添加水印String srcImgPath = pathFullName; //源图片地址String tarImgPath = pathFullName; //待存储的地址//格式化时间SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String format = f.format(new Date());String waterMarkContent = "要添加的水印内容";  //水印内容WaterMarkUtil.markImage(waterMarkContent, pathName, tarImgPath);//System.out.println("文件上传成功");HashMap<String, String> data = new HashMap<String, String>();result.put("code", "200");data.put("url", apiUrl + pathName);result.put("data", data);return result;} catch (Exception e) {e.printStackTrace();result.put("code", "0");return result;} finally {try {fos.close();} catch (IOException e) {e.printStackTrace();}}}}

02java添加水印   

创建WaterMarkUtil.java的工具类,添加水印用

package com.ten.ms.tmsframework.common.Util;import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import javax.imageio.ImageIO;public class WaterMarkUtil {// 水印透明度private static float alpha = 0.3f;// 水印横向位置private static int positionWidth = 50;// 水印纵向位置private static int positionHeight = 100;// 水印文字字体private static Font font = new Font("宋体", Font.BOLD, 60);// 水印文字颜色private static Color color = Color.red;/*** 给图片添加水印文字** @param text       水印文字* @param srcImgPath 源图片路径* @param targetPath 目标图片路径*/public static void markImage(String text, String srcImgPath, String targetPath) {markImage(text, srcImgPath, targetPath, null);}/*** 给图片添加水印文字、可设置水印文字的旋转角度** @param text 水印文字* @param srcImgPath 源图片路径* @param targetPath 目标图片路径* @param degree 水印旋转*/public static void markImage(String text, String srcImgPath, String targetPath, Integer degree) {OutputStream os = null;try {// 0、图片类型String type = srcImgPath.substring(srcImgPath.indexOf(".") + 1, srcImgPath.length());// 1、源图片Image srcImg = ImageIO.read(new File(srcImgPath));int imgWidth = srcImg.getWidth(null);int imgHeight = srcImg.getHeight(null);BufferedImage buffImg = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB);// 2、得到画笔对象Graphics2D g = buffImg.createGraphics();// 3、设置对线段的锯齿状边缘处理g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);g.drawImage(srcImg.getScaledInstance(imgWidth, imgHeight, Image.SCALE_SMOOTH), 0, 0, null);// 4、设置水印旋转if (null != degree) {g.rotate(Math.toRadians(degree), (double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2);}// 5、设置水印文字颜色g.setColor(color);// 6、设置水印文字Fontg.setFont(font);// 7、设置水印文字透明度g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));// 8、第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y)//设置水印的坐标int x = imgWidth - 2*getWatermarkLength(text, g);int y = imgHeight - 2*getWatermarkLength(text, g);g.drawString(text, x, y);  //画出水印
//            g.drawString(text, positionWidth, positionHeight);// 9、释放资源g.dispose();// 10、生成图片os = new FileOutputStream(targetPath);// ImageIO.write(buffImg, "JPG", os);ImageIO.write(buffImg, type.toUpperCase(), os);} catch (Exception e) {e.printStackTrace();} finally {try {if (null != os)os.close();} catch (Exception e) {e.printStackTrace();}}}/*** 给图片添加水印文字、可设置水印文字的旋转角度* @param text 水印文字* @param inputStream 源图片路径* @param outputStream 目标图片路径* @param degree 水印旋转* @param typeName*/public static void markImageByIO(String text, InputStream inputStream, OutputStream outputStream,Integer degree, String typeName) {try {// 1、源图片Image srcImg = ImageIO.read(inputStream);int imgWidth = srcImg.getWidth(null);int imgHeight = srcImg.getHeight(null);BufferedImage buffImg = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB);// 2、得到画笔对象Graphics2D g = buffImg.createGraphics();// 3、设置对线段的锯齿状边缘处理g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);g.drawImage(srcImg.getScaledInstance(imgWidth, imgHeight, Image.SCALE_SMOOTH), 0, 0, null);// 4、设置水印旋转if (null != degree) {g.rotate(Math.toRadians(degree), (double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2);}// 5、设置水印文字颜色g.setColor(color);// 6、设置水印文字Fontg.setFont(font);// 7、设置水印文字透明度g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));// 8、第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y)g.drawString(text, positionWidth, positionHeight);// 9、释放资源g.dispose();// 10、生成图片ImageIO.write(buffImg, typeName.toUpperCase(), outputStream);} catch (Exception e) {e.printStackTrace();}}//    public static void main(String[] args) {
//        String srcImgPath = "d:/002.png";
//        String text = "hello world";
//
//        String targerTextPath = "d:/002--1.png";
//        String targerTextPath2 = "d:/002--2.png";
//
//        System.out.println("给图片添加水印文字开始...");
//        // 给图片添加水印文字
//        markImage(text, srcImgPath, targerTextPath);
//        // 给图片添加水印文字,水印文字旋转-45
//        markImage(text, srcImgPath, targerTextPath2, -45);
//        System.out.println("给图片添加水印文字结束...");
//
//    }public static int getWatermarkLength(String waterMarkContent, Graphics2D g) {return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());}
}

03 element ui前台html代码

<el-upload class="text_uploader" :show-file-list="false" :before-upload="beforeUpload" // 上传之前执行的方法:on-success="onSuccess" //成功后执行的方法:on-error="onError" :action="后台url地址"><el-button :disabled="importDataDisabled" type="success" :icon="importDataBtnIcon">按钮</el-button></el-upload>

java的上传图片和加水印基本上使用这些就可以了,大家也可以把加水印和图片上传抽成一个共同的方法方便以后开发项目的时候继续使用。后续我会分享更多的技术相关的内容,请大家多多关注。

关注我发现更多精彩

java图片上传和加水印相关推荐

  1. 图片上传(加水印、缩略图、远程保存)的简单例子

    图片上传(加水印.缩略图.远程保存)的简单例子(应用于51aspx.com) 该源码下载地址:http://51aspx.com/CV/ImageUpload 今天看到xiongeee发的文章使用使用 ...

  2. java图片上传(mvc)

    最近有开始学起了java,好久没写文章了,好久没来博客园了.最近看了看博客园上次写的图片上传有很多人看,今天在一些篇关于java图片上传的.后台接收用的是mvc.不墨迹了,直接上图. 先看目录结构.i ...

  3. kindeditor图片上传配置水印

    先上效果图 网上有帖子说初始化了编辑器后就无法更改设置,其实是可以的.只不过不再是修改那些初始化参数了. <script>    KindEditor.ready(function (K) ...

  4. Java 图片上传后为什么会自动旋转90度?

    问题: 用户反馈上传后的图片方向不对,起初怀疑是本身图片方向有问题,但是用windows图片查看器打开图片方向是"正常"显示的? 分析: windows默认的图片查看器已经帮我们自 ...

  5. java图片上传保存至服务器并返回可下载的URL

    java图片上传保存至服务器并返回可下载的URL 1.需求来源 2.解决思路 3.开始干活(直接上代码) 4.总结 1.需求来源 上周要做一个功能,需求是: 微信小程序开发的程序会传一张图片到后台ja ...

  6. Java图片上传实现方式MultipartFile

    Java图片上传实现方式 例举 MultipartFile 处理图片上传方式 2021年8月3日 核心代码块 public Result uploadImg(MultipartFile multipa ...

  7. java 图片上传 并保存服务器本地 后台 代码

    java 图片上传后台代码,把图片保存到服务器本地盘,并且按照一天一个文件夹分开存放,易于管理,不说了直接上代码: @Controller @RequestMapping("/oa" ...

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

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

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

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

最新文章

  1. 测试Animation大型动画文件拆分播放的可行性
  2. WSGI 是什么?和nginx有什么关系?
  3. Spread for Windows Forms 7新功能使用指南
  4. GDCM:gdcm::TransferSyntax的测试程序
  5. ansible离线安装
  6. 编程之美——数字哑谜
  7. hdu5481 Desiderium
  8. 磁盘分区需要知道的概念
  9. python代码-我整理的Python代码规则
  10. java集合框架介绍_Java集合框架全面介绍(一)
  11. 技术总监和CTO的区别 浅谈CTO的作用----软件公司如何开源节流
  12. python gps显示_MicroPython-GPS教程之TPYBoardv702控制5110显示当前经纬度
  13. 我的世界服务器内无限刷物品,我的世界怎么无限刷物品
  14. MCE | 外泌体的检测提取机制
  15. 华硕a53s拆机图解_华硕a53s_拆机教程_图解_20140228更正
  16. 运营商价格战终于打起来了,中国联通也有19元套餐
  17. html 中的 css 的强制换行与不换行文本
  18. 42所一流大学研究生奖助学金汇总~
  19. 快速查找硬盘文件的工具
  20. linker command failed with exit code 1 (use -v to see invocat)错误的处理方法

热门文章

  1. 运维mysql数据库面试题_运维面试题之数据库
  2. python+OpenCV 图片合成视频
  3. Java通过POI或Freemarker生成word文档,使用Jfreechart创建统计图表
  4. python,算法训练 分解质因数
  5. “零计划”首批20部作品成功输出,网易云阅读IP潜力大盘点
  6. JavaScript中修改背景颜色
  7. 读书笔记《谷歌时代的工作方法》
  8. google patent爬取专利数据
  9. 阿里云开发者大会,For Every Developer
  10. WIN7显卡硬件加速在哪里设置?