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

 更新时间:2023年11月24日 11:01:19   作者:吃葡萄不吐葡萄皮嘻嘻  
本文主要介绍了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水印内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • VUE项目去除input 框值所有空格的操作方法

    VUE项目去除input 框值所有空格的操作方法

    这篇文章主要介绍了VUE项目去除input 框值所有空格的操作方法,主要包括去除空格的方法、正则和element ui写法,本文给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • vue中vee validate表单校验的几种基本使用

    vue中vee validate表单校验的几种基本使用

    这篇文章主要介绍了vee-validate表单校验的基本使用,需要的朋友可以参考下
    2018-06-06
  • 解决Vue @submit 提交后不刷新页面问题

    解决Vue @submit 提交后不刷新页面问题

    这篇文章主要介绍了解决Vue @submit 提交后不刷新页面问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • Vue2使用cube-ui 实现搜索过滤、高亮功能

    Vue2使用cube-ui 实现搜索过滤、高亮功能

    cube-ui 是基于 Vue.js 实现的精致移动端组件库,由于很长一段时间没有学习cube-ui 的功能实现示例代码了,今天通过本文给大家介绍下Vue2使用cube-ui 实现搜索过滤、高亮功能,感兴趣的朋友跟随小编一起看看吧
    2023-01-01
  • vue混入mixin使用特点

    vue混入mixin使用特点

    混入(mixin)提供了一种非常灵活的方式,来分发vue组件中的可复用功能。一个混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被“混合”进入该组件本身的选项
    2022-12-12
  • Vue脚手架学习之项目创建方式

    Vue脚手架学习之项目创建方式

    这篇文章主要给大家介绍了关于Vue脚手架学习之项目创建方式的相关资料,文中通过介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • 使用vue指令实现吸顶效果

    使用vue指令实现吸顶效果

    要想实现一个吸顶效果不是很难,网络上有很多教程,其中有一种就是通过fiexd加top来实现,今天突然就想做一个吸顶效果,因为最近都在用vue,所以想用vue来做一个吸顶效果的案例,感兴趣的朋友可以参考下
    2023-11-11
  • vue项目实现github在线预览功能

    vue项目实现github在线预览功能

    这篇文章主要介绍了vue项目实现github在线预览功能,本文通过提问两个问题带领大家一起学习整个过程,需要的朋友可以参考下
    2018-06-06
  • laravel5.3 vue 实现收藏夹功能实例详解

    laravel5.3 vue 实现收藏夹功能实例详解

    这篇文章主要介绍了laravel5.3 vue 实现收藏夹功能,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2018-01-01
  • vue如何修改data中数据问题

    vue如何修改data中数据问题

    这篇文章主要介绍了vue如何修改data中数据问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09

最新评论