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所以要导出一下

 

posted @ 2022-06-08 16:24  彳小闲鱼  阅读(1020)  评论(0编辑  收藏  举报