使用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 相关文章推荐
犀利的js 函数集合
Jun 11 Javascript
jquery 漂亮的删除确认和提交无刷新删除示例
Nov 13 Javascript
解决html按钮切换绑定不同函数后点击时执行多次函数问题
May 14 Javascript
JS实现网页上随滚动条滚动的层效果代码
Nov 04 Javascript
js中的关联数组与普通数组详解
Jul 27 Javascript
jquery判断iPhone、Android设备类型
Sep 14 Javascript
JS限定手机版中图片大小随分辨率自动调整的方法
Dec 05 Javascript
JS实现留言板功能[楼层效果展示]
Dec 27 Javascript
实例详解ztree在vue项目中使用并且带有搜索功能
Aug 24 Javascript
jQuery实现的卷帘门滑入滑出效果【案例】
Feb 18 jQuery
解决layui追加或者动态修改的表单元素“没效果”的问题
Sep 18 Javascript
JavaScript 作用域实例分析
Oct 02 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
两个开源的Php输出Excel文件类
2010/02/08 PHP
PHP对接微信公众平台消息接口开发流程教程
2014/03/25 PHP
php简单获取文件扩展名的方法
2015/03/24 PHP
PDO操作MySQL的基础教程(推荐)
2017/08/18 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
2020/02/23 PHP
显示、隐藏密码
2006/07/01 Javascript
在多个页面使用同一个HTML片段的代码
2011/03/04 Javascript
浅析JS中document对象的一些重要属性
2014/03/06 Javascript
js如何判断用户是否是用微信浏览器
2014/06/05 Javascript
JS+CSS实现的经典圆角下拉菜单效果代码
2015/10/21 Javascript
AngularJS 日期格式化详解
2015/12/23 Javascript
微信小程序  简单实例(阅读器)的实例开发
2016/09/29 Javascript
值得学习的bootstrap fileinput文件上传工具
2016/11/08 Javascript
微信小程序 用户数据解密详细介绍
2017/01/09 Javascript
vue父组件向子组件(props)传递数据的方法
2018/01/02 Javascript
Vue.js+Layer表格数据绑定与实现更新的实例
2018/03/07 Javascript
深入理解 TypeScript Reflect Metadata
2019/12/12 Javascript
解决Nuxt使用axios跨域问题
2020/07/06 Javascript
Vue-cli打包后如何本地查看的操作
2020/09/02 Javascript
[15:28]DOTA2 HEROS教学视频教你分分钟做大人-剧毒术士
2014/06/13 DOTA
[00:26]TI7不朽珍藏III——冥界亚龙不朽展示
2017/07/15 DOTA
[33:42]LGD vs OG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python中方法链的使用方法
2016/02/23 Python
python学习之面向对象【入门初级篇】
2017/01/21 Python
Python中装饰器学习总结
2018/02/10 Python
Python文件读写保存操作的示例代码
2018/09/14 Python
django之从html页面表单获取输入的数据实例
2020/03/16 Python
英国在线房屋中介网站:Yopa
2018/01/09 全球购物
匡威爱尔兰官网:Converse爱尔兰
2019/06/09 全球购物
Java的五个基础面试题
2016/02/26 面试题
医学检验专业大学生求职信
2013/11/18 职场文书
写演讲稿要注意的六件事
2014/01/14 职场文书
乳制品整治工作方案
2014/05/29 职场文书
中职生自荐信范文
2014/06/15 职场文书
2015高考寄语集锦
2015/02/27 职场文书
银行柜员优质服务心得体会
2016/01/22 职场文书