ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

js,vue图片打多个水印(水印的位置,样式独立,水印换行,拿图片宽、高等信息)

2022-06-08 16:32:14  阅读:163  来源: 互联网

标签:vue 20 img ctx 水印 let mtop 图片


封装打水印函数

//这里是为了拿到图片的宽高(我的图片在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所以要导出一下

 

标签:vue,20,img,ctx,水印,let,mtop,图片
来源: https://www.cnblogs.com/gyw1996/p/16356128.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有