vue.js

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript类库 > vue.js > vue html2canvas水印

vue中html2canvas给指定区域添加满屏水印

作者:吃葡萄不吐葡萄皮嘻嘻

本文主要介绍了vue中html2canvas给指定区域添加满屏水印,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

效果图如下:

直接贴上代码

下载插件: npm i html2canvas

<template>
  <div ref="imageDom">
    <el-button @click="downloadPicture">下载</el-button>
    <div>
      <el-table
        class="tableX"
        :height="flag ? '400' : ''"
        :data="tableData"
        :row-class-name="tableRowClassName"
      >
        <el-table-column
          :fixed="flag ? true : false"
          prop="date"
          label="日期"
          width="180"
        >
        </el-table-column>
        <el-table-column prop="name" label="姓名" width="180">
        </el-table-column>
        <el-table-column prop="address" label="地址"> </el-table-column>
        <el-table-column prop="age" label="年龄"> </el-table-column>
        <el-table-column prop="sex" label="性别"> </el-table-column>
        <el-table-column prop="hobby" label="爱好"> </el-table-column>
      </el-table>
    </div>
  </div>
</template>

<script>
//下载插件 npm i html2canvas
import html2canvas from "html2canvas";
export default {
  data() {
    return {
      //模拟数据
      tableData: [
        {
          date: "2016-05-02",
          name: "王小虎",
          address: "开始",
        },
        {
          date: "2016-05-04",
          name: "王小虎",
          address: "上海",
          age: 30,
          sex: "女",
          hobby: "爱好",
        },
        {
          date: "2016-05-01",
          name: "王小虎",
          address: "上海",
          age: 30,
          sex: "女",
          hobby: "爱好",
        },
        {
          date: "2016-05-03",
          name: "王小虎",
          address: "上海市",
        },
        {
          date: "2016-05-02",
          name: "王小虎",
          address: "上海",
          age: 30,
          sex: "女",
          hobby: "爱好",
        },
        {
          date: "2016-05-04",
          name: "王小虎",
          address: "上海",
          age: 30,
          sex: "女",
          hobby: "爱好",
        },
        {
          date: "2016-05-01",
          name: "王小虎",
          address: "上海",
          age: 30,
          sex: "女",
          hobby: "爱好",
        },
        {
          date: "2016-05-03",
          name: "王小虎",
          address: "上海市",
        },
        {
          date: "2016-05-02",
          name: "王小虎",
          address: "上海",
          age: 30,
          sex: "女",
          hobby: "爱好",
        },
        {
          date: "2016-05-04",
          name: "王小虎",
          address: "上海",
          age: 30,
          sex: "女",
          hobby: "爱好",
        },
        {
          date: "2016-05-01",
          name: "王小虎",
          address: "上海",
          age: 30,
          sex: "女",
          hobby: "爱好",
        },
        {
          date: "2016-05-03",
          name: "王小虎",
          address: "上海市",
        },
        {
          date: "2016-05-02",
          name: "王小虎",
          address: "上海",
          age: 30,
          sex: "女",
          hobby: "爱好",
        },
        {
          date: "2016-05-04",
          name: "王小虎",
          address: "上海",
          age: 30,
          sex: "女",
          hobby: "爱好",
        },
        {
          date: "2016-05-01",
          name: "王小虎",
          address: "上海",
          age: 30,
          sex: "女",
          hobby: "爱好",
        },
        {
          date: "2016-05-03",
          name: "王小虎",
          address: "上海市",
        },
        {
          date: "2016-05-02",
          name: "王小虎",
          address: "上海",
          age: 30,
          sex: "女",
          hobby: "爱好",
        },
        {
          date: "2016-05-04",
          name: "王小虎",
          address: "上海",
          age: 30,
          sex: "女",
          hobby: "爱好",
        },
        {
          date: "2016-05-01",
          name: "王小虎",
          address: "上海",
          age: 30,
          sex: "女",
          hobby: "爱好",
        },
        {
          date: "2016-05-03",
          name: "王小虎",
          address: "结尾",
        },
      ],
      h: 400,
      flag: true,
      wmConfig: {
        font: "microsoft yahei", //字体
        textArray: ["xixi", "嘻嘻😁"], //水印文本内容,允许数组最大长度3 即:3行水印
        density: 4, //密度 建议取值范围1-5   值越大,水印越多,可能会导致水印重叠等问题,请慎重!!!
      },
    };
  },
  mounted() {
  },
  methods: {
    tableRowClassName({ rowIndex }) {
      if (rowIndex % 2 === 0) {
        return "warning-row";
      } else if (rowIndex % 2 !== 0) {
        return "success-row";
      }
      return "";
    },
    //截图
    downloadPicture() {
      this.flag = false;
      this.$nextTick(() => {
        var width = this.$refs.imageDom.style.width;
        var cloneDom = this.$refs.imageDom.cloneNode(true);
        cloneDom.style.position = "absolute";
        cloneDom.style.top = "0px";
        cloneDom.style.zIndex = "-1";
        cloneDom.style.width = width;
        console.log(cloneDom);
        document.body.appendChild(cloneDom);
        html2canvas(cloneDom).then(async(canvas) => {
          // 转成图片,生成图片地址
          var imgUrl = canvas.toDataURL("image/png");
          let resultBase64 = await this.base64AddWaterMaker(imgUrl, this.wmConfig);
          console.log(resultBase64);
          imgUrl = resultBase64;
          var eleLink = document.createElement("a");
          eleLink.href = imgUrl; // 转换后的图片地址
          eleLink.download = "pictureName";
          // 触发点击
          document.body.appendChild(eleLink);
          eleLink.click();
          // 然后移除
          document.body.removeChild(eleLink);
        });
        cloneDom.style.display = "none";
        this.flag = true;
      });
    },
    //画布添加水印
    drawWaterMark(ctx, imgWidth, imgHeight, wmConfig) {
      let fontSize;
      if (imgWidth >= 3456) {
        fontSize = 50;
      } else if (imgWidth >= 2700) {
        fontSize = 30;
      } else if (imgWidth >= 2000) {
        fontSize = 26;
      } else if (imgWidth >= 1436) {
        fontSize = 20;
      } else if (imgWidth >= 800) {
        fontSize = 12;
      } else if (imgWidth >= 500) {
        fontSize = 10;
      } else {
        fontSize = 8;
      }
      console.log(imgWidth, imgHeight, fontSize);
      ctx.font = `${fontSize}px ${wmConfig.font}`;
      ctx.lineWidth = 1;
      ctx.fillStyle = "rgba(0,0,0,0.5)";  //根据页面的背景色来设置水印颜色
      ctx.textAlign = "left";
      ctx.textBaseline = "middle";

      //文字坐标
      const maxPx = Math.max(imgWidth, imgHeight);
      const stepPx = Math.floor(maxPx / wmConfig.density);
      let arrayX = [0]; //初始水印位置 canvas坐标 0 0 点
      while (arrayX[arrayX.length - 1] < maxPx / 2) {
        arrayX.push(arrayX[arrayX.length - 1] + stepPx);
      }
      arrayX.push(
        ...arrayX.slice(1, arrayX.length).map((el) => {
          return -el;
        })
      );

      console.log(arrayX);

      for (let i = 0; i < arrayX.length; i++) {
        for (let j = 0; j < arrayX.length; j++) {
          ctx.save();
          ctx.translate(imgWidth / 2, imgHeight / 2); ///画布旋转原点 移到 图片中心
          ctx.rotate(-Math.PI / 5);
          if (wmConfig.textArray.length > 3) {
            wmConfig.textArray = wmConfig.textArray.slice(0, 3);
          }
          wmConfig.textArray.forEach((el, index) => {
            let offsetY = fontSize * index + 2;
            ctx.fillText(el, arrayX[i], arrayX[j] + offsetY);
          });
          ctx.restore();
        }
      }
    },
    //给base64图片添加水印
    base64AddWaterMaker(base64Img, wmConfig) {
      if (wmConfig.textArray.length === 0) {
        console.error("****没有水印内容*****");
        return base64Img;
      }

      return new Promise((resolve, reject) => {
        const canvas = document.createElement("canvas");
        const ctx = canvas.getContext("2d");
        const img = new Image();
        let resultBase64 = null;
        img.onload =  ()=> {
          canvas.width = img.width;
          canvas.height = img.height;
          console.log(img.width,img.height);
          //canvas绘制图片,0 0  为左上角坐标原点
          ctx.drawImage(img, 0, 0);
          //写入水印
          this.drawWaterMark(ctx, img.width, img.height, this.wmConfig);
          resultBase64 = canvas.toDataURL("image/png");
          console.log(resultBase64);
          if (!resultBase64) {
            reject();
          } else {
            resolve(resultBase64);
          }
        };
        img.src = base64Img;
      });
    },
  },
};
</script>

<style>
.el-table .warning-row {
  background: oldlace;
}

.el-table .success-row {
  background: #f0f9eb;
}
</style>

到此这篇关于vue中html2canvas给指定区域添加满屏水印的文章就介绍到这了,更多相关vue html2canvas水印内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文