H5移动端使用html2canvas点击按钮生成图片并下载

需求:点击按钮下载当前页的图片

可以用html2canvas生成canvas,再由canvas生成base64图片

npm install html2canvas --save
import html2canvas from "html2canvas";

遇到的问题

在保存的时候会遇到图片模糊的问题。

解决方案:可以放大canvas,避免截图模糊

生成好的图片需要保存到手机,因为h5要嵌套在客户端,客户端不支持a标签下载。

如果客户端支持a标签下载可以用a标签,方法也写在下面代码中

解决方案:咨询客户端,看客户端提供的文档,调用客户端的api下载.

<template><div id="download-canvass"><div class="logo">我是海报</div><div class="bottom-download" id="download-btn" @touchStart="touchStart" >保存</div></div>
</template>
 getCanvas() {var div = document.querySelector("#download-canvas");let obj = {};if (div) {// 放大canvas,避免截图模糊const canvas = document.createElement("canvas");const scale = 3;const width = div.offsetWidth;const height = div.offsetHeight;canvas.width = width * scale;canvas.height = height * scale;// canvas.style = `transform:translate3d(0,0,0)`;//解决canvas绘图慢的原因obj.scale = scale;obj.canvas = canvas;obj.width = width;obj.height = height;obj.allowTaint = true;obj.useCORS = true;//图片跨域相关}html2canvas(div, obj).then((canvas) => {console.log("htmlcanvas");const url = canvas.toDataURL("image/png"); // a标签的url对应图片base64'var imgs = url.replace(/^data:image\/\w+;base64,/, "");//this.getYearUploadImages(imgs);//调用的客户端api的方法// 创建a标签 并设置其相关属性,最后触发其点击事件//let a = document.createElement("a")//a.setAttribute("href", url)//a.setAttribute("download", 'img')//let clickEvent = new MouseEvent("click"); // 创建一个单击事件//a.dispatchEvent(clickEvent);}).catch((err) => {// on cancelconsole.log("----------err---------------");console.log(err);});},

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

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

相关文章

基于Java SSM框架实现艺诚美业美容美发管理系统项目【项目源码+论文说明】

基于java的SSM框架实现艺诚美业美容美发管理系统演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们…

node fs模块读取文件 readFile、readFileSync、fsPromises.readFile、createReadStream

文章目录 1.读取文件1.1 readFile1.2 readFileSync1.3 fsPromises.readFile&#xff1a;promise的写法1.4 fs.createReadStream 1.读取文件 readFile&#xff1a;异步读取文件readFileSync&#xff1a;同步读取文件fsPromises.readFile&#xff1a;promise的写法 需要注意的是…

为什么ChatGPT采用SSE协议而不是Websocket?

在探索ChatGPT的使用过程中&#xff0c;我们发现GPT采用了流式数据返回的方式。理论上&#xff0c;这种情况可以通过全双工通信协议实现持久化连接&#xff0c;或者依赖于基于EventStream的事件流。然而&#xff0c;ChatGPT选择了后者&#xff0c;也就是本文即将深入探讨的SSE&…

多账号统一登录,如何设计

多账号统一登录是一种常见的需求&#xff0c;特别是在大型应用或平台中。设计一个多账号统一登录系统需要考虑以下几个方面&#xff1a; 1. 用户标识&#xff1a;每个用户在系统中应有唯一的标识&#xff0c;可以是用户名、邮箱、手机号等。这些标识应该与账号信息关联&#x…

MC17XS6500 高边驱动芯片寄存器的介绍

本文主要是对 MC17XS6500 高边驱动芯片寄存器进行的介绍&#xff0c;MC17XS6500 寄存器分为输入寄存器和输出寄存器&#xff0c;对常用的几个输入和输出寄存器的功能和配置进行了介绍。本文中&#xff0c;世平集团基于 FlagChips FC7300 HV BMS 方案&#xff0c;对 MC17XS6500 …

Python 内置高阶函数练习(Leetcode500.键盘行)

Python 内置高阶函数练习&#xff08;Leetcode500.键盘行&#xff09; 【一】试题 &#xff08;1&#xff09;地址&#xff1a; 500. 键盘行 - 力扣&#xff08;LeetCode&#xff09; &#xff08;2&#xff09;题目 给你一个字符串数组 words &#xff0c;只返回可以使用在…

【算法】王晓东期末考题总结(一)

文章目录 分治动态规划贪心算法 分治 实现思路可参考&#xff1a;【算法】分治算法 之前写的Java版有思路。 二分搜索 #include <iostream> #include <vector>using namespace std;// 二分搜索函数 int binarySearch(const vector<int>& array, int t…

Flask笔记四之异常处理

本文首发于公众号&#xff1a;Hunter后端 原文链接&#xff1a;Flask笔记四之异常处理 在系统运行中&#xff0c;有时候需要处理报错异常。 异常的来源可能是系统在运行中的报错&#xff0c;比如错误的运算的有 1/0 这种等&#xff0c;还有的是访问了不存在接口&#xff0c;又…

docker 部署mysql

docker pull mysql:5.7.25 docker run \ --name mysql \ -e MYSQL_ROOT_PASSWORD123456 \ -p 3306:3306 \ -v /soft/mysql/conf:/etc/mysql \ -v /soft/mysql/data:/var/lib/mysql \-d \mysql:5.7.25安装好之后可以用命令行进入查看 docker exec -it mysql mysql -u root -p密…

解决ROS含动态参数的Config文件无法正确识别的错误

问题描述 功能包名为paddle_detection 在工作空间下, 通过catkin_make可以正常通过编译且执行无异常, 可以通过bloom-generate rosdebian生成依赖 但是在将其打包成deb包的过程中fakeroot debian/rules binary报错 fatal error: paddle_detection/paddle_detectionConfig.…

116基于matlab的盲源信号分离

基于matlab的盲源信号分离。FASTICA方法&#xff0c;能够很好的将信号解混&#xff0c;可以替换数据进行分析。具有GUI界面&#xff0c;可以很好的进行操作。程序已调通&#xff0c;可直接运行。 116matlab盲源信号分离FASTICA (xiaohongshu.com)

IDEA搜索指定某个类的方法的引用位置

搜索方法引用位置的时候&#xff0c;如果该方法是接口定义出来的&#xff0c;则结果里会包含其他实现类的该方法的引用位置&#xff0c;但是像Object定义的Equals方法这种&#xff0c;搜索出来的结果是超级多的&#xff0c;根据没法看&#xff0c;因此想要只看该类的方法引用位…

python的WebSocket编程详解,案例群聊系统实现

1.websocket相关 1.1为什么要用websocket 如果有需求要实现服务端向客户端主动推送消息时&#xff08;比如聊天室&#xff0c;群聊室&#xff09;有哪几种方案 轮训&#xff1a;让浏览器每隔两秒发送一次请求&#xff0c;缺点&#xff1a;有延时&#xff0c;请求太多网站压力…

扭蛋机小程序搭建:打造互联网“流量池”

随着互联网科技的发展&#xff0c;扭蛋机小程序成为了市场发展的重要力量。 扭蛋机市从日本发展流行起来的&#xff0c;玩法就是根据设置的概率&#xff0c;让玩家体验扭蛋机的乐趣。扭蛋机中有隐藏款和稀有款&#xff0c;为了获得稀有款商品&#xff0c;玩家便会进行扭蛋&…

Zabbix图形显示乱码修复

2023年12月29日&#xff0c;星期五&#xff0c;2023年最后一个工作日了&#xff0c;明天就开始放假元旦了&#xff0c;去年水了31篇&#xff0c;今年到目前为止才水了30篇&#xff0c;所以这篇也水一下来充个数。祝大家元旦快乐&#xff0c;新的一年里越来越好。 被监控主机指…

Vue3-26-路由-useRouter 和 useRoute 两个API 的作用介绍

先来说说两个API 的作用 useRouter() : 返回的是项目中的 路由实例的对象 可以通过这个实例对象进行路由的逻辑跳转 useRoute() : 返回的是当前的 路由对象&#xff0c; 可以在当前路由对象中获取到路由名称、路由参数、路由路径等玩完整的路由信息。 写个案例看一下具体是什么…

二、类与对象(三)

17 初始化列表 17.1 初始化列表的引入 之前我们给成员进行初始化时&#xff0c;采用的是下面的这种方式&#xff1a; class Date { public:Date(int year, int month, int day)//构造函数{_year year;_month month;_day day;} private:int _year;int _month;int _day; };…

【数据结构和算法】独一无二的出现次数

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 哈希类算法题注意事项 2.2 方法一&#xff1a;判断长度 2.3 方法二&#xff1a; set 判断 2.4 方法…

《Linux系统与网络管理》---题库---简答题

1、简述这些分区的名字以及各自的作用。 答&#xff1a; /boot 存放内核镜像的地方&#xff0c;这个文件夹独立分区的意义在于降低不能开机的风险。 /根目录&#xff0c;一般采用 etx3 文件系统&#xff0c;分区的容量一定要大于安装软件包的容量。 /usr 多数软件的默认安装的地…

HTTP 是哪⼀层的协议?简述它的作⽤?

theme: channing-cyan http协议是应用层的协议&#xff0c;主要用于web浏览器和服务器两点之间传输超文本的协议&#xff0c;它是一种⽆状态的协议&#xff0c;即服务器不 会保存关于客户端的任何信息&#xff0c;每次客户端发送请求&#xff0c;服务器都会返回响应。HTTP 协议…