#工作原理

创建一个Image对象,设置跨域属性,然后指定图片的src。当图片加载完成后,创建一个canvas元素,将图片绘制到canvas上。接着计算出水印文字的大小和字体样式,并设置填充颜色。通过调用drawingWatermark函数得到水印的位置信息,然后遍历位置信息,对每个水印进行绘制。最后将canvas转换为DataURL,保存为addwaterUrl

具体代码如下:

<template>
<div id="myImageContainer">
  <button @click="downloadImage">下载加水印图片</button>
  <img width="200px" :src="addwaterUrl" alt="" />
</div>
</template>

<script>
export default {
  data() {
    return {
      addwaterUrl: "",
    };
  },
  computed: {
   
  },
  methods: {
    addWatermark() {
      const img = new Image();
      let data = new Date()
      // 由于我的是阿里云图片需要天机允许跨域
      img.crossOrigin = "Anonymous";
      // 这里放需要加水印的图片地址
      img.src = 'http://oss-yaen.oss-cn-hangzhou.aliyuncs.com/bigFile/%E5%BD%B1%E5%AD%90%E6%9C%8D%E5%8A%A1%E6%A0%87%E5%87%86%E6%B5%81%E7%A8%8B_00.png';
      img.onload = () => {
        const canvas = document.createElement("canvas");
        canvas.width = img.width;
        canvas.height = img.height;
        const ctx = canvas.getContext("2d");
        ctx.drawImage(img, 0, 0, img.width, img.height); //
        const minDimension = Math.min(img.width, img.height);
        const fontSize = Math.floor(minDimension / 20);
        console.log(new Date() - data);
        ctx.font = 'bolder ' + fontSize + "px PingFangSC-Regular, PingFang SC";

        ctx.fillStyle = "rgba(255, 255, 255, 0.5)";
        let resultText = drawingWatermark(img.height, img.width);

        resultText.forEach(function (value) {
          ctx.save(); // 保存当前的绘图状态
          ctx.translate(value.x, value.y); // 将坐标原点移动到水印文字位置
          ctx.rotate(Math.PI / 4); // 旋转45度(弧度制)
          ctx.fillText("水印文字", 0, 0);
          ctx.restore(); // 恢复之前保存的绘图状态
        });
        // 第二次描边
        ctx.strokeStyle = "rgba(18, 69, 155, 1)"; // 设置文字描边颜色
        ctx.lineWidth = 2;
        let resultText2 = drawingWatermark(img.height, img.width);
        resultText2.forEach(function (value) {
          ctx.save(); // 保存当前的绘图状态
          ctx.translate(value.x, value.y); // 将坐标原点移动到水印文字位置
          ctx.rotate(Math.PI / 4); // 旋转45度(弧度制)
          ctx.strokeText("水印文字", 0, 0); // 绘制水印文字
          ctx.restore(); // 恢复之前保存的绘图状态
        });
        this.addwaterUrl = canvas.toDataURL();
      };

      function drawingWatermark(height, width) {
        let result = [];
        const rowCount = 5; // 水印文字的行数
        const colCount = 3; // 水印文字的列数
        const marginX = width / colCount; // 水印文字的水平间距
        const marginY = height / rowCount; // 水印文字的垂直间距
        for (let i = 0; i < rowCount; i++) {
          for (let j = 0; j < colCount; j++) {
            let value = {};
            value.x = j * marginX;
            value.y = i * marginY;
            result.push(value);
          }
        }
        return result;
      }
    },

    downloadImage() {
      if (this.addwaterUrl) {
        const link = document.createElement("a");
        link.href = this.addwaterUrl;
        link.download = "watermarked_image.jpg";
        link.click();
      }
    },
  },
  mounted() {
    this.addWatermark();
  },
};
</script>

GitHub 加速计划 / vu / vue
207.54 K
33.66 K
下载
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
最近提交(Master分支:2 个月前 )
73486cb5 * chore: fix link broken Signed-off-by: snoppy <michaleli@foxmail.com> * Update packages/template-compiler/README.md [skip ci] --------- Signed-off-by: snoppy <michaleli@foxmail.com> Co-authored-by: Eduardo San Martin Morote <posva@users.noreply.github.com> 4 个月前
e428d891 Updated Browser Compatibility reference. The previous currently returns HTTP 404. 5 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐