逻辑:利用canas画图,参数为员工编号+姓名+本地图片,将传过来的图,画上水印
效果图为附件图
/** * 设置水印的样式 * @param employeeIdimg 身份证照片 * @param employeeNumber 员工编号 * @param employeeName 员工姓名 * @param basUrl http://local.cbs.bacic5i5j.com:8080/base/ * @return {string} */ function watermark(employeeIdimg,employeeNumber,employeeName,callback){ console.log("watermark--start"); var watermark = document.createElement('canvas'); var repeatWatermark = document.createElement('canvas'); watermark.width = 230; watermark.height = 143; watermark.style.display = 'none'; repeatWatermark.style.visibility = 'hidden'; var imglogo = new Image(); var IDimg = new Image(); imglogo.src = basePath+'/static/resources/img/5i5j_logo.png'; var src=basePath + '/system/water.htm?fileUrl=' + encodeURIComponent(employeeIdimg); loadImg(src, function(IDimg){ document.body.appendChild(watermark); document.body.appendChild(repeatWatermark); var fillEmployeeInfo=employeeNumber+" "+employeeName; //var width = 460,height = 286; var width= IDimg.naturalWidth || IDimg.width; var height = IDimg.naturalHeight || IDimg.height; repeatWatermark.width = width; repeatWatermark.height = height; var ctx = watermark.getContext("2d"); var ctxr = repeatWatermark.getContext("2d"); ctx.font="18px 黑体"; ctx.rotate(-20*Math.PI/110); ctx.fillStyle = "rgba(0,0,0,.41)"; ctx.fillText(fillEmployeeInfo, -10, 115); //ctx.fillText("xxxx", 25, 132); ctx.drawImage(imglogo, -8, 120, 122, 33); ctx.font="12px 黑体"; //ctx.fillText("www.5i5j.com", 28, 142); ctx.rotate('20*Math.PI/110'); ctxr.clearRect(0,0,width,height); //清除整个画布 ctxr.drawImage(IDimg, 0, 0,width,height); var pat = ctxr.createPattern(watermark, "repeat"); //在指定的方向上重复指定的元素 ctxr.fillStyle = pat; ctxr.fillRect(0, 0, width, height); callback && callback(repeatWatermark.toDataURL('image/png')); document.body.removeChild(watermark); document.body.removeChild(repeatWatermark); console.log("watermark--end"); }) } /** * 加载图片 * @param src * @param callback */ function loadImg(src, callback) { var img = new Image(); var loaded = false; var pollingTimer; var onload = img.onload = function () { if (!loaded) {// 确保图片加载完成的回调只会触发一次 callback(img); loaded = true; clearTimeout(pollingTimer);// 清除轮训器 } }; img.src = src; function polling() { if (img.complete) {// 图片加载成功后,该属性为true,否则为false onload();// 这里主动触发 img.load,防止在某些浏览器中因为缓存的原因未触发load } else { pollingTimer = setTimeout(polling, 13);// 轮训器 } } polling(); }
最开始的时候,火狐,谷歌浏览器都可以,ie也可以,后来发现某些ie版本下不支持,所以改成loadImg这个方法,本人对js不太熟悉,这是借鉴了高手的经验才研究出来
另外,使用src=连接,这种方式其实是调用了后台的逻辑,用后来将图片转化成流的方式
后台代码为:
@RequestMapping("/water") @ResponseBody public Object getWaterUrl(HttpServletRequest request, HttpServletResponse response, String fileUrl)throws Exception { BufferedInputStream dis = null; BufferedOutputStream fos = null; String fileName = fileUrl.substring(fileUrl.lastIndexOf("/")); String ext = fileName.indexOf(".") > -1 ? "" : fileUrl.substring(fileUrl.lastIndexOf('.')); try { URL url = new URL(fileUrl); response.setContentType("applicatoin/octet-stream"); response.setHeader("Content-disposition", "attachment; filename=" + fileName + ext); response.setHeader("Content-Length", String.valueOf(url.openConnection().getContentLength())); dis = new BufferedInputStream(url.openStream()); fos = new BufferedOutputStream(response.getOutputStream()); byte[] buff = new byte[2048]; int bytesRead; while (-1 != (bytesRead = dis.read(buff, 0, buff.length))) { fos.write(buff, 0, bytesRead); } } catch (Exception e) { LOGGER.error(e.getMessage()); LOGGER.error("下载图片异常,参数:{},异常:{}", ReflectionToStringBuilder.toString(fileUrl), e.getMessage()); throw new BusinessException( "下载异常,请稍后再试"); } finally { if (dis != null) dis.close(); if (fos != null) fos.close(); } return null; }
相关推荐
在本例中,我们使用Canvas来实现在图片上添加平铺水印的功能。这个需求通常用于保护版权或者增加品牌标识。下面将详细解释实现这个功能的关键步骤和涉及的Canvas API。 1. **初始化Image对象**: `var img = new ...
水平/垂直方向平铺水印或两者 调整输出图像的大小,生成缩略图 转换输出图像 uMark,直接从Windows资源管理器中打开图像 从Windows资源管理器拖放图片到uMark 水印设置保存以备后用 在实际图像上,查看全尺寸...
在IT领域,数字水印是一种重要的技术,常用于版权保护和内容验证。本文将深入探讨“C++实现数字水印功能”这一主题,包括数字水印的基本概念、工作原理、C++实现的关键技术和可能遇到的问题。 数字水印是将一些不...
最近项目中遇到一个需求,需要把一张图片加上平铺的水印 类似这样的效果 首先想到的是用canvas完成这种功能,因为我之前也没有接触过canvas,所以做这个功能的时候,就是一步一步的摸索中学习,过程还是挺...
在这个过程中,我们可以利用它来实现网页对图片添加水印的功能。 水印在各种领域中都有广泛的应用,例如版权保护、品牌宣传或个性化定制。在网页上对图片添加水印,通常是为了防止图片被未经授权的用户盗用,或者...
下面我们将详细介绍如何使用Mpdf插件来为PDF文件添加水印。 Mpdf是由Mike Purcell开发的一款开源PHP类库,基于TCPDF,专门用于创建和编辑PDF文档。它的功能强大,支持多种字体、语言、布局和样式,同时也提供了添加...
7、支持平铺水印能够把加入水印后图象直接转换为JPG或BMP图象完成后有详细记录的Log 8、支持水印导入导出功能 软件怎么用 1、无需安装,点击”exe“即可运行,单击”红心“创建一个新的水印,可以创建两种水印:图片...
平铺水印是在整个画面上平铺水印,一般需要设定水印为半透明(要不就看不到原图了:) 能够把加入水印后图象直接转换为JPG或BMP图象 当加入了水印后可以把图象转换成另外格式的图象,比如原图象为BMP格式,可以在...
在VB.NET 2008中制作文字和图片水印是一项常见的图像处理任务,它能够为你的图片添加版权信息或个性化标识。以下是一篇详细解释如何实现这一功能的文章概述: 首先,我们需要理解“水印”的概念。水印是图像、文档...
利用傅里叶变换原理,平铺水印信息同使保护图像成为“密钥”的一部分 3. 水印提取算法实现 根据水印嵌入算法的信息平铺,只能通过读取原有保护图像和“密钥”才可以提取水印信息 4. 对水印算法进行攻击 从几何攻击...
水平/垂直或同时平铺水印 Resize输出图像,生成缩略图 转换输出图像 直接从Windows资源管理器中将图像打开到uMark 从Windows资源管理器中将图像拖放到uMark 保存水印设置供以后使用 查看实际图像...
如何保护您发布在网上的图片?给图片加上一个自己独特的标识是一个不错的办法。不用打开庞大缓慢的Photoshop,...支持平铺水印能够把加入水印后图象直接转换为JPG或BMP图象完成后有详细记录的Log支持水印导入导出功能。
水平/垂直方向平铺水印或两者 调整输出图像的大小,生成缩略图 转换输出图像 uMark,直接从Windows资源管理器中打开图像 使用方法: 语言文件解压后将zh目录复制到 X:\Program Files\uMark 6\Languages 目录中; ...
如何保护您发布在网上的图片?给图片加上一个自己独特的标识是一个不错的办法。...支持平铺水印; 能够把加入水印后图象直接转换为JPG或BMP图象; 完成后有详细记录的Log; 支持水印导入导出功能。
excel 添加水印 平铺
图片上加水印相信每位程序员都会遇到这个需求,下面这篇文章主要给大家介绍了asp .net实现给图片添加图片水印的方法,文中给出了完整的实例代码,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
最近在做一个食品溯源项目,需要对一些图片加上水印。 注释都在代码里了,有啥想法可以在评论区交流(๑•ᴗ•๑)~ // 水印透明度 private static float alpha = 0.5f; /** * 给图片添加水印图片、可设置水印图片...
在ASP.NET Core中,为上传图片功能添加水印是一项常见的需求,这可能涉及到品牌标识、版权保护或个性化展示。在传统的.NET Framework中,我们可以利用HttpModules或HttpHandler来处理,但.NET Core不再支持`WebImage...
水印可以是文字或图片形式。以下我们将详细探讨如何使用PHP的GD库实现这两种类型的水印。 **1. PHP文字水印** 文字水印是在图片上添加文本,通常用于显示日期、版权信息或者短语等。GD库中的`imagefttext`函数是...