当前位置: 首页 > news >正文

vue2 搭配 html2canvas 截图并设置截图时样式(不影响页面) 以及 base64转file文件上传 或者下载截图 小记

下载

npm install html2canvas --save

引入

import html2canvas from "html2canvas";

 

//使用

html2canvasForChars() {  // 使用that来存储当前Vue组件的上下文,以便在回调函数中使用  let that = this;  // 获取DOM中id为"charts"的元素,需要截图的元素  let node = document.getElementById("charts");  // 返回一个Promise对象,用于异步处理html2canvas的调用  return new Promise((resolve, reject) => {  // 使用Vue的$nextTick方法确保DOM更新完成后再执行html2canvas  that.$nextTick(() => {  // 调用html2canvas函数,传入node元素和相关配置  html2canvas(node, {  useCORS: true, // 允许跨域图片  // 以下两行被注释,因为它们被固定尺寸替代  // height: node.offsetHeight, // 自动获取高度(现在使用固定高度)  // width: node.offsetWidth, // 自动获取宽度(现在使用固定宽度)//scale: 2.82, // 缩放比例 这个数值根据具体需求调整width: 270, // 设置canvas的宽度为270    画布的宽度height: 200, // 设置canvas的高度为200   画布的高度scrollY: 0, // 忽略Y轴滚动  scrollX: 0, // 忽略X轴滚动  onclone: function (documentClone) {  // 在html2canvas克隆的DOM上修改样式  // 对克隆的#charts元素应用缩放和背景色 //在此设置样式 不影响页面 documentClone.getElementById("charts").style.transform = "scale(0.5)";  documentClone.getElementById("charts").style.backgroundColor = "#2c2c32";},  })  // html2canvas执行成功后的回调   在此可实现 下载 或其他操作.then((canvas) => {  //下载//link.setAttribute('download', '分享海报') // 设置下载名称//link.href = canvas?.toDataURL('image/png', 1) // 转换为png格式//link.click()//展示// 将canvas转换为png格式的图片URL  let imgUrl = canvas.toDataURL("image/png");  that.Thumbnail = imgUrl;  //现在已经可以展示到页面上了})  // html2canvas执行失败的回调  .catch((err) => {  // 捕获错误并拒绝Promise  reject(err); // 处理生成 canvas 失败的情况  });  });  });  
},

上面显示了展示和下载的方法 展示的话一般是搭配上传(将当前截图上传到服务器) 但是后端规定的上传格式如何不是base64的话 我们需要转化成file对象 创建formdata 对象上传

1. base64z转 file文件

  // 生成随机数 这一步是避免傻逼后端直接用我们规定的文件名缓存 到时候会有重名的文件generateRandomString(length) {// 定义允许的字符集const characters = "abcdefghijkmnopqrstuvwxyz23456789"; // 去除容易混淆的字符let result = "";const charactersLength = characters.length;for (let i = 0; i < length; i++) {result += characters.charAt(Math.floor(Math.random() * charactersLength));}return result;}, // base64转化为file文件base64ToFile(dataurl) {// 随机数作为图片名称let radom = this.generateRandomString(16);let filename = radom + ".png";// 获取到base64编码const arr = dataurl.split(",");// 将base64编码转为字符串const bstr = window.atob(arr[1]);let n = bstr.length;const u8arr = new Uint8Array(n); // 创建初始化为0的,包含length个元素的无符号整型数组while (n--) {u8arr[n] = bstr.charCodeAt(n);}return new File([u8arr], filename, {type: "image/png",});},//使用// 上传缩略图图片uploadScreenshot(path) {let that = this;return new Promise((resolve, reject) => {if (path != null) {
//转换let file = that.base64ToFile(path);let data = new FormData();data.append("imageFile", file);that.axios.post(window.global.uploadAddress + "/file/upload/image?type=" + "grid", data, {headers: {"Content-Type": "application/json",},})........

好了 下课

2024-08-02补充 上面提供的代码截图尺寸有问题下面是优化代码

  html2canvasForChars() {let that = this;let node = document.getElementById("charts");return new Promise((resolve, reject) => {that.$nextTick(() => {console.log(node, "node");html2canvas(node, {useCORS: true,backgroundColor: null, //背景 色有时候为白色的异常 设为null就不会出现那种问题width: node.offsetWidth, //canvas 画布宽度height: node.offsetHeight, //canvas 画布高度windowWidth: node.scrollWidth, //渲染 Element 时要使用的窗口宽度windowHeight: node.scrollHeight, //渲染 Element 时要使用的窗口高度scrollY: 0,scrollX: 0,scale: 1, // 用于渲染的比例onclone: function (documentClone) {// 以下是对克��的 canvas 进行操作documentClone.getElementById("charts").style.transform ="scale(1)";},}).then((canvas) => {// var url = canvas.toDataURL(); // 图片地址let imgUrl = canvas.toDataURL("image/png");console.log(imgUrl, "imgUrl");// 暂存图片变量that.Thumbnail = imgUrl;that.configObj.thumbnail_url = imgUrl;}).catch((err) => {reject(err); // 处理生成 canvas 失败的情况});});});},

主要就是 这个代码 和那个背景颜色白色异常的 设置background设置为null会解决背景色为白色的异常

  documentClone.getElementById("charts").style.transform ="scale(1)";

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 数据资源:机遇与挑战并存的新时代
  • C++ 学习记录
  • 将gitee 上的nvim 配置 从gitee 上下载下来,并配置虚拟机
  • [Day 44] 區塊鏈與人工智能的聯動應用:理論、技術與實踐
  • Mendix 创客访谈录|Mendix 如何化解工业企业数字化转型的复杂性
  • 【人工智能基础四】循环神经网络(RNN)与长短时记忆网络(LSTM)
  • fabricjs 实现图像的二值化功能
  • 计算机网络基础 - 计算机网络和因特网(2)
  • ARM/Linux嵌入式面经(二十):地平线嵌入式开发
  • SQL进阶技巧:数据预处理如何对数据进行分桶【分箱】?
  • SD8223LC 首鼎SHOUDING单键电容式触摸IC SOT23-6
  • 面试经典算法150题系列-h指数
  • Jenkins参数化构建
  • C# 使用 NLog 输出日志到文件夹
  • springboot新农村综合展示平台-计算机毕业设计源码41793
  • [译] 怎样写一个基础的编译器
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Akka系列(七):Actor持久化之Akka persistence
  • Apache的基本使用
  • Java 内存分配及垃圾回收机制初探
  • k8s如何管理Pod
  • Objective-C 中关联引用的概念
  • Phpstorm怎样批量删除空行?
  • PHP的类修饰符与访问修饰符
  • React中的“虫洞”——Context
  • SpiderData 2019年2月23日 DApp数据排行榜
  • Terraform入门 - 3. 变更基础设施
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 理解在java “”i=i++;”所发生的事情
  • 深度学习在携程攻略社区的应用
  • 思维导图—你不知道的JavaScript中卷
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 听说你叫Java(二)–Servlet请求
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • kubernetes资源对象--ingress
  • ​configparser --- 配置文件解析器​
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #vue3 实现前端下载excel文件模板功能
  • #数据结构 笔记三
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (24)(24.1) FPV和仿真的机载OSD(三)
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (二) 初入MySQL 【数据库管理】
  • (二十六)Java 数据结构
  • (七)Appdesigner-初步入门及常用组件的使用方法说明
  • (三十五)大数据实战——Superset可视化平台搭建
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • ./configure、make、make install 命令
  • .DFS.
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .Net Core 中间件与过滤器
  • .net framework 4.0中如何 输出 form 的name属性。