使用vue实现HTML页面生成图片的方法


Posted in Javascript onMarch 12, 2020

随着网络的发展,越来越多的网络平台应运而生。如何获得更多的流量,吸引更多的眼球已经成为网络平台生存、发展的必要条件。现在网络平台最常见的一种宣传方式就是人邀人。

我最近就接到一个需求,做一个 海报页面,并且能保存到手机 ,方便用户分享给朋友,希望能够达到人邀人的效果。

使用vue实现HTML页面生成图片的方法 

给人第一感觉这个需求就是保存图片的功能,当时梳理是却发现不是那么简单:

  1.动态生成一张带logo的二维码
  2.整个海报的html部分转化成图片
  3.保存图片至手机相册

生成带logo的二维码

用 vue_qrcodes 生成带logo的二维码

安装

npm install vue_qrcodes -- save

使用

<!--部分html代码-->
<qrcode :url="qrcodeUrl"
 :iconurl="iconurl"
 :wid="298"
 :hei="278"
 :imgwid="100"
 :imghei="100">
</qrcode>

// 部分js代码
import qrcode from 'vue_qrcodes'
//...省略其他代码
components: {
 qrcode
 }

问题来了:二维码出现了,但是二维码和logo大小并不是你想要,无法自适应。那就需要我们重置二维码和logo的样式。

.logoimg {
 height: 100px !important;
 width: 100px !important;
 margin-top: -50px !important;
 margin-left: -50px !important;
 }
#qrcode {
 margin-top: 20px;
 img {
 height: 278px !important;
 width: 298px !important;
 }
 }

html转化为base64图片

html转化为canvas中我选用组件 html2canvas

yarn add html2canvas

import html2canvas from 'html2canvas'

为了防止页面有闪屏我用了两个div,一个存放原来的dom,一个存放canvas的生成的图片,再v-if控制展示的元素。

使用vue实现HTML页面生成图片的方法 

js调用函数:

htmlToCanvas() {
 html2canvas(this.$refs.bill, {})
 .then((canvas) => {
 let imageUrl = canvas.toDataURL('image/png'); // 将canvas转成base64图片格式
 this.canvasImageUrl = imageUrl;
 this.isDom = false;
 });
}
// 二维码地址
this.qrcodeUrl = data.data.inviteCodeAddress
// 调用html转化canvas函数
this.htmlToCanvas();

结果如图:

使用vue实现HTML页面生成图片的方法 

页面转化成了图片,但是二维码没有展示出来,控制台报错:

使用vue实现HTML页面生成图片的方法 

除二维码其他部分已经转化为图片,二维码不显示,原因有两种可能:

转化时二维码还没有加载完成

转化二维码的过程中报错了

首先尝试了nextTick

使用 nextTick 将回调延迟到下次DOM更新循环之后执行

// 二维码地址
this.qrcodeUrl = data.data.inviteCodeAddress 
this.$nextTick(() => {
 // 跳用html转化canvas函数
 this.htmlToCanvas(); 
 })

使用vue实现HTML页面生成图片的方法 

发现二维码出来了,但是二维码的大小不对,并且控制台还是存在报错。虽然问题没有完全解决,但是二维码出现了。可以证明二维码不展示的原因是,转化时二维码没有加载完成。

再尝试使用setTimeout

使用 setTimeout 将回调延迟到指定时间之后执行

// 二维码地址
this.qrcodeUrl = data.data.inviteCodeAddress 
setTimeout(()=>{
 // 调用html转化canvas函数
 this.htmlToCanvas(); 
}, 200)

查看效果:

使用vue实现HTML页面生成图片的方法 

注:setTimeout是我目前能想到延迟加载方法。各位大佬们,如果这个有更好的方法解决上面的问题,麻烦给留言,在此谢过。

页面正常,控制台没有报错,可是logo没有展示出来。

logo地址是:

iconurl: 'https://static.daojia.com/assets/project/tosimple-pic/LOGO_1576564983633.png',

项目在本地启动,可能存在跨域问题。

htmlToCanvas() {
 html2canvas(this.$refs.bill, {
 useCORS: true // 解决图片跨域问题
 }).then((canvas) => {
 // 将canvas转成base64图片格式
 let imageUrl = canvas.toDataURL('image/png'); 
 this.canvasImageUrl = imageUrl;
 this.isDom = false;
 }).catch((e) => console.log(e));
 }

至此html成功转化为图片。

图片保存至手机

首先尝试了JS-SDK中的下载图片downloadImage
经过各种尝试并不能实现。

最后采用的是微信长按保存图片

海报部分已经转化为图片,无需再开发,只要提示用户长按图片可以保存即可。

使用vue实现HTML页面生成图片的方法 

总结

到此这篇关于使用vue实现HTML页面生成图片的文章就介绍到这了,更多相关vue html页面生成图片内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
特殊字符、常规符号及其代码对照表
Jun 26 Javascript
用javascript动态调整iframe高度的方法
Mar 06 Javascript
浏览器无法运行JAVA脚本的解决方法
Jan 09 Javascript
如何使用jQuery Draggable和Droppable实现拖拽功能
Jul 05 Javascript
JS 修改URL参数(实现代码)
Jul 08 Javascript
javascript中比较字符串是否相等的方法
Jul 23 Javascript
实用jquery操作表单元素的简单代码
Jul 04 Javascript
详解webpack 多入口配置
Jun 16 Javascript
关于element-ui的隐藏组件el-scrollbar的使用
May 29 Javascript
js 对象使用的小技巧实例分析
Nov 08 Javascript
Vue3 的响应式和以前有什么区别,Proxy 无敌?
May 20 Javascript
ssm+vue前后端分离框架整合实现(附源码)
Jul 08 Javascript
JavaScript实现随机点名器
Mar 25 #Javascript
JavaScript碰撞检测原理及其实现代码
Mar 12 #Javascript
JavaScript实现多个物体同时运动
Mar 12 #Javascript
基于javascript实现碰撞检测
Mar 12 #Javascript
jQuery使用ajax传递json对象到服务端及contentType的用法示例
Mar 12 #jQuery
js 使用ajax设置和获取自定义header信息的方法小结
Mar 12 #Javascript
javascript实现拖拽碰撞检测
Mar 12 #Javascript
You might like
GD输出汉字的函数的分析
2006/10/09 PHP
textContent在Firefox下与innerText等效的属性
2007/05/12 Javascript
11款基于Javascript的文件管理器
2009/10/25 Javascript
JS 文件大小判断的实现代码
2010/04/07 Javascript
JQuery在光标位置插入内容的实现代码
2010/06/18 Javascript
ASP.NET jQuery 实例5 (显示CheckBoxList成员选中的内容)
2012/01/13 Javascript
改进版通过Json对象实现深复制的方法
2012/10/24 Javascript
jQuery中$.fn的用法示例介绍
2013/11/05 Javascript
js的form表单提交url传参数(包含+等特殊字符)的两种解决方法
2016/05/25 Javascript
AngularJS HTML DOM详解及示例代码
2016/08/17 Javascript
火狐和ie下获取javascript 获取event的方法(推荐)
2016/11/26 Javascript
JavaScript 字符串数字左补位,右补位,取固定长度,截位扩展函数代码
2017/03/25 Javascript
详解nodejs微信公众号开发——1.接入微信公众号
2017/04/10 NodeJs
原生JS+Canvas实现五子棋游戏实例
2017/06/19 Javascript
Koa2 之文件上传下载的示例代码
2018/03/29 Javascript
layui点击导航栏刷新tab页的示例代码
2018/08/14 Javascript
解决Layui数据表格中checkbox位置不居中的方法
2018/08/15 Javascript
详解JS判断页面是在手机端还是在PC端打开的方法
2019/04/26 Javascript
jQuery动态生成的元素绑定事件操作实例分析
2019/05/04 jQuery
Chrome插件开发系列一:弹窗终结者开发实战
2020/10/02 Javascript
[56:20]LGD vs VP Supermajor 败者组决赛 BO3 第三场 6.10
2018/07/04 DOTA
[01:07:02]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第三场 2月26日
2021/03/11 DOTA
python二叉树遍历的实现方法
2013/11/21 Python
编写Python脚本使得web页面上的代码高亮显示
2015/04/24 Python
基于Python 的进程管理工具supervisor使用指南
2016/09/18 Python
python的变量与赋值详细分析
2017/11/08 Python
python贪婪匹配以及多行匹配的实例讲解
2018/04/19 Python
flask session组件的使用示例
2018/12/25 Python
Python字符串大小写转换拼接删除空白
2019/09/19 Python
CSS3之transition实现下划线的示例代码
2018/05/30 HTML / CSS
优秀研究生自我鉴定
2013/12/04 职场文书
英语自我评价范文
2014/01/24 职场文书
《中华少年》教学反思
2014/02/15 职场文书
李白故里导游词
2015/02/12 职场文书
优秀党员主要事迹范文
2015/11/05 职场文书
nginx+lua单机上万并发的实现
2021/05/31 Servers