2019独角兽企业重金招聘Python工程师标准>>>

对于我一个菜鸟来说,以前一直对io这块不熟悉,现在业务需求要求对富文本中的图片添加水印,在百度上查了都不是适合我的项目,只能自己研究,研究了俩天终于写了出来,现在我把我的方法写出来,供大家查阅

1.因为是在SpringMVC里面写的,SpringMVC提供了一个MultipartFile类,直接上代码

/*** ueditor上传单文件* @param request* @return*/
@RequestMapping(value = "ueditorUpFile")
public
@ResponseBody
UeditorFormat ueditorUpFile(HttpServletRequest request){MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;// 从config.json中取得上传文件的IDMultipartFile upfile = multipartRequest.getFile("upfile");try {InputStream inputStream = upfile.getInputStream();} catch (IOException e) {e.printStackTrace();}//获取项目根路径String realpath= request.getSession().getServletContext().getRealPath("/");if(Objects.nonNull(upfile)){//这个是我的项目类,没有关系SysFile file = new SysFile();file.setCreateDate(new Date());file.setName(upfile.getOriginalFilename());file.setRandomName(IdGen.uuid());file.setStatus(SysFile.TEMP_FILE);file.setSuffix(file.getName().substring(file.getName().lastIndexOf(".")));file.setSize(upfile.getSize());try {//上传到服务器的路径,没有关系String filepath = sysFileService.genFilePath(2, file.getRandomName(), file.getSuffix());//获取上传的图片File tarfile = new File(realpath+upfile.getOriginalFilename());try {//把内存图片写入磁盘中upfile.transferTo(tarfile);if (!tarfile.getParentFile().exists()) {tarfile.getParentFile().mkdir();}try {//添加水印WaterMarkGenerate.generateWithImageMark(tarfile,realpath+File.separator+"upload"+File.separator+file.getRandomName()+file.getSuffix(),realpath+File.separator+"static"+File.separator+"images"+File.separator+"watermark.png");} catch (Exception e) {e.printStackTrace();}//获取添加水印后的图片File newFile = new File(realpath+File.separator+"upload"+File.separator+file.getRandomName()+file.getSuffix());FileInputStream input = new FileInputStream(newFile);MultipartFile multipartFile = new MockMultipartFile("file",file.getName(), "text/plain", IOUtils.toByteArray(input));upfile = multipartFile;} catch (IOException e) {e.printStackTrace();}//水印图片保存到服务器file = sysFileService.saveFile(file, upfile, filepath);return UeditorFormat.parseSysFile(file);} catch (FileUploadFailException e) {e.printStackTrace();UeditorFormat uf = new UeditorFormat();uf.setState("文件上传失败");uf.setTitle(upfile.getOriginalFilename());return uf;}} else {UeditorFormat uf = new UeditorFormat();uf.setState("文件上传失败,上传的文件为空!");uf.setTitle(upfile.getOriginalFilename());return uf;}
}

这个添加水印的类也是我从网上找的,特别好用,亲测,现在分享给大家

public class WaterMarkGenerate {private static final String FONT_FAMILY="微软雅黑";//字体private static final int FONT_STYLE=Font.BOLD;//字体加粗private static final int FONT_SIZE=24;//字体大小private static final float ALPHA=0.7F;//水印透明度private static final int LOGO_WIDTH=200;//图片水印大小//添加文字水印/*tarPath:图片保存路径*contents:文字水印内容* */public static void generateWithTextMark(File srcFile,String tarPath,String contents) throws Exception{Image srcImage=ImageIO.read(srcFile);int width=srcImage.getWidth(null);int height=srcImage.getHeight(null);BufferedImage tarBuffImage=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);Graphics2D g=tarBuffImage.createGraphics();g.drawImage(srcImage, 0, 0, width,height,null);//计算int strWidth=FONT_SIZE*getTextLength(contents);int strHeight=FONT_SIZE;//水印位置
//      int x=width-strWidth;
//      int y=height-strHeight;int x=0,y=0;//设置字体和水印透明度g.setFont(new Font(FONT_FAMILY,FONT_STYLE,FONT_SIZE));g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,ALPHA));
//      g.drawString(contents, x, y);//旋转图片g.rotate(Math.toRadians(-30),width/2,height/2);while(x < width*1.5){y = -height/2;while(y < height*1.5){g.drawString(contents,x,y);y += strHeight + 50;}x += strWidth + 50; //水印之间的间隔设为50}g.dispose();JPEGImageEncoder en = JPEGCodec.createJPEGEncoder(new FileOutputStream(tarPath));en.encode(tarBuffImage);}//添加图片水印/** tarPath:图片保存路径* logoPath:logo文件路径* */public static void generateWithImageMark(File srcFile,String tarPath,String logoPath) throws Exception{Image srcImage=ImageIO.read(srcFile);int width=srcImage.getWidth(null);int height=srcImage.getHeight(null);//创建一个不带透明色的BufferedImage对象BufferedImage tarBuffImage=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);Graphics2D g=tarBuffImage.createGraphics();g.drawImage(srcImage, 0, 0, width,height,null);Image logoImage= ImageIO.read(new File(logoPath));int logoWidth=LOGO_WIDTH;int logoHeight=(LOGO_WIDTH*logoImage.getHeight(null))/logoImage.getWidth(null);int x=width-logoWidth;int y=height-logoHeight;g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,ALPHA));g.drawImage(logoImage, x, y, logoWidth, logoHeight, null);g.dispose();JPEGImageEncoder en = JPEGCodec.createJPEGEncoder(new FileOutputStream(tarPath));en.encode(tarBuffImage);}//文本长度的处理:文字水印的中英文字符的宽度转换public static int getTextLength(String text){int length = text.length();for(int i=0;i<text.length();i++){String s = String.valueOf(text.charAt(i));if(s.getBytes().length>1){  //中文字符length++;}}length = length%2 == 0?length/2:length/2+1;  //中文和英文字符的转换return length;}
}

转载于:https://my.oschina.net/u/3759357/blog/1789390

解决在ueditor中上传图片通过后台java+SpringMVC添加水印方法相关推荐

  1. Vue中JS遍历后台JAVA返回的Map数据,构造对象数组数据格式

    场景 SpringBoot+Vue+Echarts实现选择时间范围内数据加载显示柱状图: SpringBoot+Vue+Echarts实现选择时间范围内数据加载显示柱状图_BADAO_LIUMANG_ ...

  2. 解决Spring Cloud中Feign/Ribbon第一次请求失败的方法

    前言 在Spring Cloud中,Feign和Ribbon在整合了Hystrix后,可能会出现首次调用失败的问题,要如何解决该问题呢? 造成该问题的原因 Hystrix默认的超时时间是1秒,如果超过 ...

  3. 解决DXP软件中off grid的一种最佳方法

    转载于: http://jingyan.baidu.com/article/49711c618df131fa441b7c21.html AD在电子技术中经常遇到,主要用到电路的仿真与PCB板的绘图.本 ...

  4. 解决Android Studio中DDMS缺少File Explore视窗的方法

    在升级Android Studio3.0之后,最近用到SharedPreferences存储数据,想查看数据文件,发现进入DDMS后的File Explorer视窗居然直接没有了,在网上查找解决方法, ...

  5. java中aliases的意思,Java Charset.aliases方法代码示例

    import java.nio.charset.Charset; //导入方法依赖的package包/类 /** * Constructs MysqlCharset object * * @param ...

  6. java中html中文乱码怎么解决_Java读取网页HTML 汉字乱码 (已解决,bufferedReader中编码改成...

    Java读取网页HTML 汉字乱码 (已解决,bufferedReader中编码改成 Java读取网页HTML 汉字乱码 (已解决,bufferedReader中编码改成跟网页的一致即可) #网页HT ...

  7. vue中数组的七个响应式方法

    vue中数组的七个响应式方法 起因: ​ 在使用vue实习中,通过数组的索引改变了数组中的值,测试时发现,更改成功了,但是试图无响应. 原因: *通过索引值修改数组元素,不是响应式方法* // 以下代 ...

  8. java数据存在ie中_[Java教程]解决在IE中获取数据的缓存问题,运行环境为node.js

    [Java教程]解决在IE中获取数据的缓存问题,运行环境为node.js 0 2015-11-30 20:00:06 IE下默认会开启缓存策略,不管是页面还是通过ajax请求的数据都会议一个url,u ...

  9. Myeclipse中导入项目后java类中汉字注释出现乱码问题(已解决)

    Myeclipse中导入项目后java类中汉字注释出现乱码问题(已解决) 参考文章: (1)Myeclipse中导入项目后java类中汉字注释出现乱码问题(已解决) (2)https://www.cn ...

最新文章

  1. sdh管理单元指针_C语言学习|指针的介绍
  2. Android .mk文件语法解析
  3. 升级python3后yum出现异常解决办法
  4. 邊做邊學 Internet Explorer 8:瞭解 IE8 相容性技術
  5. 物联网世界的承诺与挑战
  6. 经典sql语句50题_SQL面试经典50题:带你从建表开始
  7. 用EnumMap代替序数索引
  8. python写一些小代码_#python#自己写的一段小代码
  9. mongodb查询优化
  10. Apache2 实现https访问http服务
  11. html怎样制作动态页面,HTML如何制作网页动态时钟
  12. 武汉最最最牛逼的IT公司全在这了
  13. Android 子线程 UI 操作真的不可以?
  14. 通过Python实现物联网金橙子自动打标
  15. 高通平台SPI配置方法
  16. vue移动端开启键盘 页面底部样式乱了
  17. 计算机主机箱工作电流,电脑使用常识
  18. pjax使用心得总结
  19. 基于Java的网络编程实践
  20. 戴尔 成铭3980台式计算机,戴尔成铭3980商用台式机评测 高颜值高性能

热门文章

  1. python可以做什么项目-python都能做什么
  2. python代码大全p-python处理写入数据代码讲解
  3. 自学python要下载什么软件-Python学习需要安装的工具
  4. javascript高级程序设计之BOM
  5. spoj2 Prime Generator
  6. LeetCode Simplify Path(栈操作)
  7. SPOJ 27020 GST Calculator
  8. nginx中的数组结构ngx_array_t
  9. HDU2049 不容易系列之(4)——考新郎
  10. tip use view.isineditmode() in your custom views to skip code when shown in eclipse