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

news2024/12/22 20:59:21
效果图如下:

在这里插入图片描述

直接贴上代码

下载插件: 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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/653203.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JUC并发编程:Condition的简单理解与使用

目录 1&#xff1a;概述 2&#xff1a;举例 3&#xff1a;condition 的一些方法 1&#xff1a;概述 Condition本质上是一个接口&#xff0c;Condition因素与Object监视器方法&#xff08; wait &#xff0c; notify和notifyAll &#xff09;成不同的对象&#xff0c;以得到具…

医院信息化PACS系统源码(影像阅片、报告模板、三维重建)

随着互联网强势走进医院行业&#xff0c;医院信息化建设已成为推动医院机构正常运转和进行现代化管理的基本要素。影像检查作为医院机构在疾病诊断中的高频诊疗项目&#xff0c;业务量自然不容小觑&#xff0c;为减轻医生工作压力&#xff0c;PACS系统成为机构“必选项”。 一、…

sheetJS实现把excel导入数据库

1、问题描述 最近在做报表导入数据库的需求&#xff0c;报表文件为excel里面有多个sheet。 2、解决方法 使用FileReader异步读取上传的文件。使用sheet.js进行excel表格内容的解析。使用bootstrap.js的tab组件对上传的表格进行一个页面预览的展示。 3、参考代码 ImportReportF…

Linux 文件实时备份 rsync+lsyncd

一、原理和说明 lsyncd官网 &#xff08;一&#xff09;软件说明 目的是每次只把新修改的同步&#xff0c;而不是全量备份。 Rsync&#xff08;同步&#xff09;&#xff1a;将一个服务器的一个文件夹的内容提交到另外一个服务器的文件夹 lsyncd&#xff08;差异检测并调用r…

Java阶段四Day06

Java阶段四Day06 文章目录 Java阶段四Day06关于配置响应内容中不包含Null的属性关于配置跨域关于如何不用添加RequestBody也可以接收请求 关于配置响应内容中不包含Null的属性 响应内容中的null可以使用以下三种方式中的一种即可解决&#xff0c;且范围越小&#xff0c;越优先 …

新人如何在实际工作做性能测试?怎么合理选择并发数?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 从小入手&#xf…

C++ 11(3) | 新的类功能、可变参数模板、lambda表达式

前文中我们讲述了C11中新增的右值引用&#xff0c;在本文中我们将继续讲解C11中的新的类功能、可变参数模板、lambda表达式。 新的类功能 默认成员函数 之前我们学习过在C中有六个默认成员函数构造函数、析构函数、拷贝构造函数、拷贝赋值重载、取地址重载、const 取地址重载…

【59天|503.下一个更大元素II ● 42. 接雨水】

503.下一个更大元素II class Solution { public:vector<int> nextGreaterElements(vector<int>& nums) {stack<int> st;int n nums.size();vector<int> res (n, -1);for(int i0; i<2*n;i){while(!st.empty()&&nums[i%n]>nums[st.t…

第13章_事务基础知识

第13章_事务基础知识 1.数据库事务概述 事务是数据库区别于文件系统的重要特性之一&#xff0c;当我们有了事务就会让数据库始终保持一致性&#xff0c;同时我们还能通过事务的机制恢复到某个时间点&#xff0c;这样可以保证已提交到数据库的修改不会因为系统崩溃而丢失。 1…

Moonbeam路由流动性

Moonbeam路由流动性&#xff08;Moonbeam Routed Liquidity, MRL&#xff09;使加密资产流动性能够从其他生态系统&#xff08;如以太坊、Solana、Polygon或Avalanche&#xff09;进入波卡生态系统。借助MRL&#xff0c;用户可以通过简洁的用户体验向/从波卡转移他们的流动性。…

横竖屏切换导致页面频繁重启?详细解读screenLayout

目录 前言configChangesscreenLayout平板问题总结 前言 前几天多名用户反馈同一个问题&#xff0c;在小新平板上无法上网课&#xff0c;点击上课按钮后就退回到首页了。了解了一下发现小新平板现在销量特别好&#xff0c;于是赶紧申请了一台测试机打算看看到底是什么问题。 最…

牛客网语法篇刷题(C语言) — 分支控制

作者主页&#xff1a;paper jie的博客_CSDN博客-C语言,算法详解领域博主 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《C语言-语法篇》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白…

附录6-todolist案例

效果是这样的 可以添加新任务&#xff0c;改变任务状态&#xff0c;与筛选任务列表 使用vant创建的项目 使用到了bootstrap&#xff0c;首先 npm install bootstrap进行安装&#xff0c;安装后导入css与js 上中下是三个组件&#xff0c;依次是 todo_input&#xff0c;todo_li…

Python控制LitePoint IQxel-MW 无线网络测试仪

前言 由于项目需要进行WIFI和BT&#xff08;蓝牙&#xff09;的射频测试&#xff0c;所以需要开发一款支持WIFI/BT射频测试的工具。开发射频测试工具的话那肯定离不开仪表的控制。我们项目用的就Litepoint的IQxel-MW无线网络测试仪。这篇文章主要就是介绍一下如何控制仪表以及…

初探core组件:opencv - core组件进阶

core组件进阶 1.访问图像中的像素1.1 图像在内存之中的存储方式1.2 颜色空间缩减1.3 LUT函数&#xff1a;Look up table1.4 计时函数 2. ROI区域图像叠加&图像混合2.1 感兴趣区域&#xff1a;ROI2.2 ROI案例2.2 线性混合操作2.3 计算数组加权和&#xff1a;addWeighted()函…

python-segno:二维码制作

目录 二维码版本 微二维码、数据掩码、数据流、模式 微二维码 数据掩码 数据流 二维码模式 二维码背景 二维码参数 helpers方法 其他库制作及二维码读取&#xff1a;python生成和读取二维码_觅远的博客-CSDN博客 安装&#xff1a;pip install segno import segnoqr …

Qt+QtWebApp开发笔记(六):http服务器html实现静态相对路径调用第三方js文件

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/131244269 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

经典30个嵌入式面试问题

经典30个嵌入式面试问题 嵌入式系统的面试经典问题有很多&#xff0c;以下是其中的30个常见问题&#xff1a; 1. 什么是嵌入式系统&#xff1f; 2. 嵌入式系统和普通计算机系统有什么区别&#xff1f; 3. 嵌入式系统的主要应用领域有哪些&#xff1f; 4. 嵌入式系统的设计…

接口测试工具之postman

概念 接口测试是什么&#xff1f; 百度百科给出的解释是&#xff1a; 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间…

构造函数初始化列表的问题

构造函数初始化列表的问题 无法按照表达式中的算符来修改值原因基本原则由此引申的问题使用初始化列表对类成员初始化在构造函数中赋值对类成员初始化 针对构造函数传参,使用引用的情况使用初始化列表对类成员初始化在构造函数中赋值对类成员初始化 将属性也使用引用总结 无法按…