js,vue图片打多个水印(水印的位置,样式独立,水印换行,拿图片宽、高等信息)
封装打水印函数
//这里是为了拿到图片的宽高(我的图片在oss上) function getImgWidth(url) { let img = new Image(); img.src = url; img.crossOrigin = "Anonymous";//这里是解决跨域问题 return new Promise((resolve, reject) => { img.onload = function () { resolve({ width: img.width, height: img.height ,img}) } }) } //这里是画出来图片给图片打水印(我要打的水印较多,传参比较多,根据需要就行) function addWater (img,uploadTime,longitude,latitude,siteName,address,index){ //img参数是为了拿到图片数据的(宽、高、url)别的都是水印需要的数据 return new Promise((resolve,reject)=>{ var canvas = document.createElement('canvas'); let font= 10 * (img.width / 320) + "px"//这里是根据图片来设置字体大小 let mtop=10 * (img.width / 320)*1.5//这里是根据图片来设置水印位置 canvas.width = img.width canvas.height = img.height let ctx = canvas.getContext('2d') ctx.beginPath()//这里是绘制一条路径开始画 ctx.drawImage(img.img, 0, 0) //这里是绘制出来的图片 // 设置填充字号和字体,样式 ctx.font = `normal bold ${font} 宋体` let adress1=`地址:${address}` // 设置右对齐 ctx.textAlign = 'left' let i=1 // 在指定位置绘制文字,这里指定距离右下角20坐标的地方 ctx.fillStyle = "#ffffff" //下面是判断有没有这个参数 并根据i设置水印的位置 if(uploadTime){ ctx.fillText(`时间:${uploadTime}`, 20, i++*mtop) } if(longitude){ ctx.fillText(`经度:${longitude}`, 20, i++*mtop) } if(latitude){ ctx.fillText(`纬度:${latitude}`, 20, i++*mtop) } if(siteName){ ctx.fillText(`站址名称:${siteName}`, 20, i++*mtop) } //因为有些地址比较长会需要分两行展示 if(address){ ctx.fillText(adress1.substring(0,30), 20, i++*mtop) if(adress1.length>30){ ctx.fillText(adress1.substring(30,adress1.length-1), 20, i++*mtop) } } ctx.closePath();//关闭绘制的这条路径 //这样的目的是为了不让上面设置的样式影响下面 ctx.beginPath();//重新开启一条路径 ctx.fillStyle = "rgba(0,0,0,0.3)"; ctx.fillRect(0, 0, img.width, i++*mtop);//为水印加了背景 ctx.closePath();//关闭了这条路径 var base64Img = canvas.toDataURL('image/jpg');//拿到路径 let data={ url:base64Img, index:index } resolve(data)//把路径扔出去(传出去的值根据你自己需要来) }) } async function waterD (url,uploadTime,longitude,latitude,siteName,address,index){ let img = await getImgWidth(url);//调用获取图片信息的函数 let baseUrl = await addWater(img,uploadTime,longitude,latitude,siteName,address,index);//调用了打水印的函数 return baseUrl;//把路径扔出去 } export default waterD;//我的的vue所以要导出一下