`

平铺水印

 
阅读更多

逻辑:利用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;


	}

 

  • 大小: 1 MB
分享到:
评论

相关推荐

    专业的图像水印制作工具(uMark Pro) v5.2 汉化版.zip

    水平/垂直方向平铺水印或两者 调整输出图像的大小,生成缩略图 转换输出图像 uMark,直接从Windows资源管理器中打开图像 从Windows资源管理器拖放图片到uMark 水印设置保存以备后用 在实际图像上,查看全尺寸...

    html5 canvas实现给图片添加平铺水印

    最近项目中遇到一个需求,需要把一张图片加上平铺的水印 类似这样的效果   首先想到的是用canvas完成这种功能,因为我之前也没有接触过canvas,所以做这个功能的时候,就是一步一步的摸索中学习,过程还是挺nice的...

    手摸手教你用canvas实现给图片添加平铺水印的实现

    最近项目中遇到一个需求,需要把一张图片加上平铺的水印 类似这样的效果     首先想到的是用canvas完成这种功能,因为我之前也没有接触过canvas,所以做这个功能的时候,就是一步一步的摸索中学习,过程还是挺...

    4.PHP使用插件Mpdf 给PDF文件加水印

    4.插件Mpdf 加水印

    几种数字图像水印的算法及应用.pdf

    不错的水印博士论文,可以参考看看,北邮的毕业论文,共享

    html2canvas 网页对图片加水印

    html2canvas 网页对图片加水印

    PhotoMark 1.3 | 批量制作图片水印

    平铺水印是在整个画面上平铺水印,一般需要设定水印为半透明(要不就看不到原图了:) 能够把加入水印后图象直接转换为JPG或BMP图象 当加入了水印后可以把图象转换成另外格式的图象,比如原图象为BMP格式,可以在...

    【某宝购买】图片批量加水印uMark 6.1 Setup.rar

    水平/垂直或同时平铺水印 Resize输出图像,生成缩略图 转换输出图像 直接从Windows资源管理器中将图像打开到uMark 从Windows资源管理器中将图像拖放到uMark 保存水印设置供以后使用 查看实际图像...

    PhotoMark v1.1.0.19

    如何保护您发布在网上的图片?给图片加上一个自己独特的标识是一个不错的办法。不用打开庞大缓慢的Photoshop,...支持平铺水印能够把加入水印后图象直接转换为JPG或BMP图象完成后有详细记录的Log支持水印导入导出功能。

    uMark Pro 6.1 汉化\中文语言文件

    水平/垂直方向平铺水印或两者 调整输出图像的大小,生成缩略图 转换输出图像 uMark,直接从Windows资源管理器中打开图像 使用方法: 语言文件解压后将zh目录复制到 X:\Program Files\uMark 6\Languages 目录中; ...

    PhotoMark

    如何保护您发布在网上的图片?给图片加上一个自己独特的标识是一个不错的办法。...支持平铺水印; 能够把加入水印后图象直接转换为JPG或BMP图象; 完成后有详细记录的Log; 支持水印导入导出功能。

    asp .net实现给图片添加图片水印方法示例

    图片上加水印相信每位程序员都会遇到这个需求,下面这篇文章主要给大家介绍了asp .net实现给图片添加图片水印的方法,文中给出了完整的实例代码,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。

    php文字水印和php图片水印实现代码(二种加水印方法)

    有时上传图片时需要给网站加上水印,水印可以分为文字水印和图片水印,下面就实现这二种水印

    使用JS给HTML添加文字水印.html

    使用JS语言,给整个页面添加一个文字水印,这水印不影响页面结构,不影响其他元素点击,会根据页面大小缩放。已经封装为了函数,到手即用。

    如何用java给图片添加图片水印(透明度、旋转、居中)?

    最近在做一个食品溯源项目,需要对一些图片加上水印。 注释都在代码里了,有啥想法可以在评论区交流(๑•ᴗ•๑)~ // 水印透明度 private static float alpha = 0.5f; /** * 给图片添加水印图片、可设置水印图片...

    Python如何为图片添加水印

    添加水印的主要目的是为了版权保护,使自己的图像不被抄袭或者恶意转载。网上有很多制作水印的工具,本帖介绍怎么使用Python-Pillow库给图片添加水印。 使用ImageMagick添加图片水印-Linux 添加文本水印 在图片右下...

    淘宝素材 可爱复古田园风平铺背景素材 水印合集

    可爱复古田园风平铺背景素材 jpg格式 水印合集 psd格式

    java图片加水印(适应铺满)

    开发一个项目,需要用到图片加水印的功能,这里考虑使用后台加水印,在上传的时候或者回显到页面时候,取图片文件的流数据,进行加水印在返回流数据就行了,非常简单,不懂可以问我

    Winform 全屏水印

    Winfom实现的全屏水印,水印在最前面,通过设置透明度,可以起到调节亮度的作用

    Java通过POI和JXL给Excel动态添加水印

    java 通过JXL架包,给excel文件添加水印,水印内容可自定义

Global site tag (gtag.js) - Google Analytics