使用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 相关文章推荐
点击弹出层外区域关闭弹出层jquery特效示例
Aug 25 Javascript
document.forms[].submit()使用介绍
Feb 19 Javascript
js简单的弹出框有关闭按钮
May 05 Javascript
js窗口关闭提示信息(兼容IE和firefox)
Oct 23 Javascript
JS 实现倒计时数字时钟效果【附实例代码】
Mar 30 Javascript
浅谈JavaScript前端开发的MVC结构与MVVM结构
Jun 03 Javascript
项目实践一图片上传之form表单还是base64前端图片压缩(前端图片压缩)
Jul 28 Javascript
基于javaScript的this指向总结
Jul 22 Javascript
layui获取选中行数据的实例讲解
Aug 19 Javascript
Vue中遍历数组的新方法实例详解
Jul 21 Javascript
JavaScript多种滤镜算法实现代码实例
Dec 10 Javascript
小程序角标的添加及绑定购物车数量进行实时更新的实现代码
Dec 07 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 curl_setopt()函数实例代码与参数分析
2011/06/02 PHP
php获取域名的google收录示例
2014/03/24 PHP
php实现Mysql简易操作类
2015/10/11 PHP
php原生数据库分页的代码实例
2019/02/18 PHP
php基于 swoole 实现的异步处理任务功能示例
2019/08/13 PHP
javascript 面向对象编程  function是方法(函数)
2009/09/17 Javascript
容易造成JavaScript内存泄露几个方面
2014/09/04 Javascript
JS获取Table中td值的方法
2015/03/19 Javascript
JavaScript获取指定元素位置的方法
2015/04/08 Javascript
javascript自定义滚动条实现代码
2020/04/20 Javascript
JS/jQuery判断DOM节点是否存在的简单方法
2016/11/24 Javascript
微信小程序 form组件详解及简单实例
2017/01/10 Javascript
js实现打地鼠小游戏
2017/02/13 Javascript
JS二叉树的简单实现方法示例
2017/04/05 Javascript
Angular 4根据组件名称动态创建出组件的方法教程
2017/11/01 Javascript
详解通过源码解析Node.js中cluster模块的主要功能实现
2018/05/16 Javascript
JavaScript用document.write()输出换行的示例代码
2020/11/26 Javascript
详解Python编程中基本的数学计算使用
2016/02/04 Python
Python2中文处理纪要的实现方法
2018/03/10 Python
python3调用百度翻译API实现实时翻译
2018/08/16 Python
Python3自动签到 定时任务 判断节假日的实例
2018/11/13 Python
python实现多层感知器
2019/01/18 Python
Python流程控制常用工具详解
2020/02/24 Python
浅析pip安装第三方库及pycharm中导入第三方库的问题
2020/03/10 Python
浅谈django channels 路由误导
2020/05/28 Python
Tensorflow使用Anaconda、pycharm安装记录
2020/07/29 Python
用css3实现当鼠标移进去时当前亮其他变灰效果
2014/04/08 HTML / CSS
HttpServlet类中的主要方法都有哪些?各自的作用是什么?
2014/03/16 面试题
青年文明号事迹材料
2014/01/18 职场文书
高中生自我评语大全
2014/01/19 职场文书
军训自我鉴定200字
2014/02/13 职场文书
党的群众路线教育实践活动公开承诺书
2014/03/28 职场文书
运动会口号8字
2014/06/07 职场文书
汽车转让协议书
2015/01/29 职场文书
承兑汇票延期证明
2015/06/23 职场文书
学生会部长竞选稿
2015/11/19 职场文书