解决在ueditor中上传图片通过后台java+SpringMVC添加水印方法
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添加水印方法相关推荐
- Vue中JS遍历后台JAVA返回的Map数据,构造对象数组数据格式
场景 SpringBoot+Vue+Echarts实现选择时间范围内数据加载显示柱状图: SpringBoot+Vue+Echarts实现选择时间范围内数据加载显示柱状图_BADAO_LIUMANG_ ...
- 解决Spring Cloud中Feign/Ribbon第一次请求失败的方法
前言 在Spring Cloud中,Feign和Ribbon在整合了Hystrix后,可能会出现首次调用失败的问题,要如何解决该问题呢? 造成该问题的原因 Hystrix默认的超时时间是1秒,如果超过 ...
- 解决DXP软件中off grid的一种最佳方法
转载于: http://jingyan.baidu.com/article/49711c618df131fa441b7c21.html AD在电子技术中经常遇到,主要用到电路的仿真与PCB板的绘图.本 ...
- 解决Android Studio中DDMS缺少File Explore视窗的方法
在升级Android Studio3.0之后,最近用到SharedPreferences存储数据,想查看数据文件,发现进入DDMS后的File Explorer视窗居然直接没有了,在网上查找解决方法, ...
- java中aliases的意思,Java Charset.aliases方法代码示例
import java.nio.charset.Charset; //导入方法依赖的package包/类 /** * Constructs MysqlCharset object * * @param ...
- java中html中文乱码怎么解决_Java读取网页HTML 汉字乱码 (已解决,bufferedReader中编码改成...
Java读取网页HTML 汉字乱码 (已解决,bufferedReader中编码改成 Java读取网页HTML 汉字乱码 (已解决,bufferedReader中编码改成跟网页的一致即可) #网页HT ...
- vue中数组的七个响应式方法
vue中数组的七个响应式方法 起因: 在使用vue实习中,通过数组的索引改变了数组中的值,测试时发现,更改成功了,但是试图无响应. 原因: *通过索引值修改数组元素,不是响应式方法* // 以下代 ...
- java数据存在ie中_[Java教程]解决在IE中获取数据的缓存问题,运行环境为node.js
[Java教程]解决在IE中获取数据的缓存问题,运行环境为node.js 0 2015-11-30 20:00:06 IE下默认会开启缓存策略,不管是页面还是通过ajax请求的数据都会议一个url,u ...
- Myeclipse中导入项目后java类中汉字注释出现乱码问题(已解决)
Myeclipse中导入项目后java类中汉字注释出现乱码问题(已解决) 参考文章: (1)Myeclipse中导入项目后java类中汉字注释出现乱码问题(已解决) (2)https://www.cn ...
最新文章
- sdh管理单元指针_C语言学习|指针的介绍
- Android .mk文件语法解析
- 升级python3后yum出现异常解决办法
- 邊做邊學 Internet Explorer 8:瞭解 IE8 相容性技術
- 物联网世界的承诺与挑战
- 经典sql语句50题_SQL面试经典50题:带你从建表开始
- 用EnumMap代替序数索引
- python写一些小代码_#python#自己写的一段小代码
- mongodb查询优化
- Apache2 实现https访问http服务
- html怎样制作动态页面,HTML如何制作网页动态时钟
- 武汉最最最牛逼的IT公司全在这了
- Android 子线程 UI 操作真的不可以?
- 通过Python实现物联网金橙子自动打标
- 高通平台SPI配置方法
- vue移动端开启键盘 页面底部样式乱了
- 计算机主机箱工作电流,电脑使用常识
- pjax使用心得总结
- 基于Java的网络编程实践
- 戴尔 成铭3980台式计算机,戴尔成铭3980商用台式机评测 高颜值高性能
热门文章
- python可以做什么项目-python都能做什么
- python代码大全p-python处理写入数据代码讲解
- 自学python要下载什么软件-Python学习需要安装的工具
- javascript高级程序设计之BOM
- spoj2 Prime Generator
- LeetCode Simplify Path(栈操作)
- SPOJ 27020 	GST Calculator
- nginx中的数组结构ngx_array_t
- HDU2049 不容易系列之(4)——考新郎
- tip use view.isineditmode() in your custom views to skip code when shown in eclipse