vue项目中图片显示前端使用js添加水印

解决思路: 1、 先将img图片绘制为canvas 2、 使用canva 绘制所要自定义添加的内容标识 3、 再将绘制好的canvas转为base64的地址使用img显示出来 代码及步骤注释如下(可以直接看效果显示):

<template>
  <div>
  <img id="myimg" :src="imgUrl" alt="">
  </div>
</template>
<style>
  .seamless-warp {
    height: 229px;
    overflow: hidden;
  }
</style>
<script>
export default {
  data () {
    return {
      imgUrl: 
    }
  },
  mounted () {
    // 调用方法传入对应的参数
    this.getImgUrl({
      url: http://172:8080/自己的图片地址,
      content: 周末了撸串去啊,
      cb: (base64Url) => {
        // 使用两种方法设置显示img的src都可以
        // document.getElementById(myimg).src = base64Url
        this.imgUrl = base64Url
      }
    })
  },
  methods: {
    getImgUrl ({
      url = ,
      textAlign = left,
      textBaseline = top,
      font = 18px Microsoft Yahei,
      fillStyle = rgba(255, 255, 255, 0.5),
      content = 我是默认的水印参数,
      cb = null,
      textX = 100,
      textY = 30
    } = {}) {
      // 创建所需要添加水印的img图片
      const img = new Image()
      img.src = url
      img.crossOrigin = anonymous
      img.onload = function () {
        // 创建canvas,并将创建的img绘制成canvas
        const canvas = document.createElement(canvas)
        canvas.width = img.width
        canvas.height = img.height
        const ctx = canvas.getContext(2d)

        ctx.drawImage(img, 0, 0)
        ctx.textAlign = textAlign
        ctx.textBaseline = textBaseline
        ctx.font = font
        ctx.fillStyle = fillStyle
        ctx.rotate((Math.PI / 180) * 15)
        // 循环绘制水印
        // ctx.fillText(content, img.width - textX, img.height - textY)
        for (let i = 0; i < img.height / 120; i++) {
          for (let j = 0; j < img.width / 50; j++) {
            ctx.fillText(content, i * 200, j * 100, img.width)
          }
        }
        // 将绘制完成的canvas转换为base64的地址
        const base64Url = canvas.toDataURL()
        cb && cb(base64Url)
      }
    }
  }
}
</script>
经验分享 程序员 微信小程序 职场和发展