使用Canvas绘制分享海报
这几天接到一个需求,需要将一个邀请链接转换为一个带有二维码并且能够分享出去的海报图,网上找了很多的方法,也踩了不少的坑,希望大家遇到类似的需求能够少走弯路。。
具体效果图如下:
首先我采用了 qrcode 的插件,使用这个插件能够生成一个二维码。然后还使用了canvas图片合成的技术,使文字,头像图片以及二维码合成到一张图片上。
以下为代码部分:
HTML部分
<!--头像-->
<img id="userAvatar" data-lazy="{$member['avatar']}" class="head" />
<!--名字职位-->
<p class="nickname" data-name="{$member['nickname']}">{$member['nickname']}</p>
<p class="person-position" data-companyName="{$member['companyName']} {$member['positionInfo']}">{$member['companyName']} {$member['positionInfo']} </p>
<div class="mask"></div>
<!--二维码分享海报-->
<div class="qr-code">
<span class="pop-close icow icow-error"></span>
<!--背景图-->
<img id="qrcodeBgImg" style="display: none;" src="../addons/ewei_shopv2/plugin/sns/template/mobile/default/images/fenxiang.jpg" style="width: 0.1px;height: 0.1px;">
<!--二维码-->
<div id="code" style="display: none;"></div>
<!--合成后的海报图-->
<img id="img3" src="">
</div>
JS部分:
var codeUrl = $('#copyUrl').val();
var nickname = $('.nickname').attr('data-name');
var personPosition = $('.person-position') .attr('data-companyName');
//二维码生成,code参数为id为code的div容器,
var qr = new QRCode(code, {
text: codeUrl,//二维码内容,可以为一个链接
width: 60,//宽度
height: 50,//高度
correctLevel: 3//容错级别
})
//绘制海报分享图
function draw() {
var code = $('#code')[0],//获取二维码
codeImg = $('#code canvas')[0],
Avatar = userAvatar,//获取头像
canvas = document.createElement("canvas"),
context = canvas.getContext("2d");
//获取设备像素比
var devicePixelRatio = window.devicePixelRatio || 1,
backingStoreRatio = context.webkitBackingStorePixelRatio || context.mozBackingStorePixelRatio || context.msBackingStorePixelRatio || context.oBackingStorePixelRatio || context.backingStorePixelRatio || 1,
ratio = devicePixelRatio / backingStoreRatio;
//获取背景图高宽
var CanvasBgWidth = qrcodeBgImg.width;
var CanvasBgHeight = qrcodeBgImg.height;
//canvas画布扩大, 保证能够高清显示
canvas.width = CanvasBgWidth * ratio;
canvas.height = CanvasBgHeight * ratio;
$(canvas).css({'width':CanvasBgWidth ,'height':CanvasBgHeight});
$('#img3').css({'width':'16rem'});
context.scale(ratio, ratio);
//背景
context.drawImage(qrcodeBgImg,0,0,CanvasBgWidth,CanvasBgHeight);
//二维码
context.drawImage(codeImg,46 * ratio,325 * ratio,60 * ratio,50 * ratio);
//头像
context.drawImage(Avatar,260 * ratio ,270 *ratio ,30 * ratio ,30 * ratio);
//文字
context.fillStyle = '666'; // 文字填充颜色
context.font = '1rem Baoli SC';
var name_text = nickname;
context.textAlign = 'right';
context.fillText(name_text,246 * ratio,280 * ratio);
var desc_1 = personPosition;
context.textAlign = 'right';
context.fillText(desc_1,246 * ratio,300 * ratio);
context.stroke();
// 将画布内容导出
var src = canvas.toDataURL();
img3.src = src;
}
//点击显示或隐藏分享图
$('.share-qrcode').click(function(e) {
$('.mask').show();
$('.qr-code').fadeIn();
draw();
})
$('.pop-close').click(function(e) {
$('.mask').hide();
$('.qr-code').fadeOut();
})
以上使用的 qrcode 插件可能与你使用的版本略有不同, 具体请参考官网使用方法。
```!
在获取二维码的时候请务必选择code容器内的canvas元素, 如果获取的是里面的img元素,在华为或者荣耀手机下二维码会不显示,应该是兼容问题。
```
使用Canvas绘制分享海报的更多相关文章
- 微信小程序之canvas绘制海报分享到朋友圈
绘制canvas内容 首先,需要写一个canvas标签,给canvas-id命名为shareBox <canvas canvas-id="shareBox"></ ...
- 小程序利用canvas 绘制图案 (生成海报, 生成有特色的头像)
小程序利用canvas 绘制图案 (生成海报, 生成有特色的头像) 微信小程序生成特色头像,海报等是比较常见的.下面我来介绍下实现该类小程序的过程. 首先选择前端来通过 canvas 绘制.这样比较节 ...
- 前端生成分享海报兼容H5和小程序
### 移动端分享海报生成 最近做项目需求是生成商品分享海报,并且保存到手机中要兼容H5和小程序<br> 与后端同学沟通后,海报在前端生成最省性能和有较好的交互体验,先看做好的效果
- 使用 HTML5 Canvas 绘制出惊艳的水滴效果
HTML5 在不久前正式成为推荐标准,标志着全新的 Web 时代已经来临.在众多 HTML5 特性中,Canvas 元素用于在网页上绘制图形,该元素标签强大之处在于可以直接在 HTML 上进行图形操作 ...
- 开源)嗨,Java,你可以生成金山词霸的二维码分享海报吗?
As long as you can still grab a breath, you fight.只要一息尚存,就不得不战. 有那么一段时间,我特别迷恋金山词霸的每日一句分享海报.因为不仅海报上的图 ...
- 微信小程序绘制分享图
微信小程序绘制分享图例子: demo下载地址:https://gitee.com/v-Xie/wxCanvasShar 大致代码会再以下说明 实际开发项目: 基础知识点: 了解canvas基础知识 w ...
- canvas 绘制双线技巧
楔子 最近一个项目,需要绘制双线的效果,双线效果表示的是轨道(类似铁轨之类的),如下图所示: 负责这块功能开发的小伙,姑且称之为L吧,最开始是通过数学计算的方式来实现这种双线,也就是在原来的路径的基础 ...
- 测试canvas绘制旋转文字的性能
canvas 绘制各种动画效果时,我们经常会使用画布旋转,使绘制上去的元素有旋转的效果. 最近在项目中碰到了很严重的性能问题,经常排查发现是因为绘制批量文字时使用了画布旋转,且每行文字的旋转角度是不一 ...
- 微信小程序 分享海报
const app = getApp(); const template = require('../../template/templates.js'); Page({ /** * 页面的初始数据 ...
随机推荐
- C#设计模式-装饰器模式(Decorator Pattern)
引言 当我们完成一个软件产品开发后就需要对其进行各种测试,适配快速迭代下质量的保障.当有一个完善的产品的对象后,如果我们想要给他添加一个测试功能,那么我们可以用一个新的类去装饰它来实现对原有对象职责的 ...
- Java基础教程——BigDecimal类
BigDecimal类 float.double类型的数字在计算的时候,容易发生精度丢失. 使用java.math.BigDecimal类可以解决此类问题. 前面讲过Math类,现在的BigDecim ...
- 区块链V1版本实现之四
部分程序代码(添加区块): //添加区块 func (bc *BlockChain) AddBlock(data string) { //创建一个区块 //bc.Block的最后一个区块的Hash值就 ...
- sqli-labs-master less05 及 Burp Suite暴力破解示例
一.首先测试显示内容 例:http://localhost/sqli-labs-master/Less-5/?id=1 http://localhost/sqli-labs-master/Less-5 ...
- VUE中,@click后边( ) 有无括号的区别
在使用的时候,两种方式结果效果差不多是一样. @click="Login()" @click="Login"而唯一的区别就是,有括号的可以在括号里写传递的参数. ...
- 一万字详解 Redis Cluster Gossip 协议
Redis Cluster Gossip 协议 大家好,我是历小冰,今天来讲一下 Reids Cluster 的 Gossip 协议和集群操作,文章的思维导图如下所示. 集群模式和 Gossip 简介 ...
- layui获取弹出层内容
一. 弹出层: <body class="childrenBody"> <form class="layui-form"> <di ...
- Python中sorted(iterable, *, key=None, reverse=False)函数参数定义中的独立星号(*)的含义
老猿在 <Python中函数的参数带星号是什么意思?>中介绍了Python函数中参数带星号的含义,而在实际使用和Python的标准文档中,会看到某写函数(如sorted(iterable, ...
- Python中容器指的是什么?
容器:容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中. 容器是一种可以包含其他类型对象(如列表.元组.字典等)作为元 ...
- PyQt(Python+Qt)学习随笔:QTreeWidget的columnCount属性
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 树型部件中的每个项有一个或多个文字标签或其他装饰符(如图标),这些内容每个显示为一列.QTreeWi ...