在最近一个项目中用到了生成二维码海报,原理就是将canvas生成二维码转换成图片,再用canvas的drawImageAPI把图片画出来。
首先先用 qrcode.min.js 生成二维码图片
<div id="myQrcode" style="display: none"></div> <div id="imgDiv"></div>
<style>canvas{display:none}</style>
<script src="js/qrcode.min.js"></script>
<script>
var qrcode = new QRCode('myQrcode', {
text: '链接地址链接地址链接地址',
width: 256,
height: 256,
colorDark: '#000000',
colorLight: '#ffffff',
correctLevel: QRCode.CorrectLevel.H
});
// 把canvas转换为image的
var myewmCanvas = document.getElementsByTagName("canvas")[1];
var ewmimg = convertCanvasToImage(myewmCanvas);
$("#imgDiv2").append(ewmimg);
// canvas-->image
function convertCanvasToImage(canvas){
//新Image对象,可以理解为DOM;
var ewmimage = new Image();
//canvas.toDataURL返回的是一串Base64编码的URL,当然,浏览器自己肯定支持
//指定格式PNG
ewmimage.src = canvas.toDataURL("image/png");
return ewmimage;
}
</script>
再用canvas的drawImageAPI把图片画出来
①图片跨域问题
解决方法第一步:
为图片添加跨域请求头 access-control-allow-origin:*
我使用的腾讯云免费的对象存储(注册使用教程点这里),这里以此举例

解决方法第二步:
为图片添加crossOrigin属性
img.crossOrigin="anonymous";
②ios微信端点开h5底部会出现前进后退条,占据了屏幕一部分的位置,网上找来一个方法。
document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() {
WeixinJSBridge.call('hideToolbar');
});
全部代码如下
<style>canvas{display:none}</style>
<script src="js/qrcode.min.js"></script>
<script>
var qrcode = new QRCode('myQrcode', {
text: '链接地址链接地址链接地址',
width: 256,
height: 256,
colorDark: '#000000',
colorLight: '#ffffff',
correctLevel: QRCode.CorrectLevel.H
});
// 把canvas转换为image的
var myewmCanvas = document.getElementsByTagName("canvas")[1];
var ewmimg = convertCanvasToImage(myewmCanvas);
$("#imgDiv2").append(ewmimg);
// canvas-->image
function convertCanvasToImage(canvas){
//新Image对象,可以理解为DOM;
var ewmimage = new Image();
//canvas.toDataURL返回的是一串Base64编码的URL,当然,浏览器自己肯定支持
//指定格式PNG
ewmimage.src = canvas.toDataURL("image/png");
return ewmimage;
}
</script>
<script type="text/javascript">
// 海报主体
var data={
"shareproduct":"xx型号空气净化器",
"sharecompany":"我的小家",
"kongqi":"56m?",
"userhour":"322h",
"forestday":"13.5天",
"image":["https://zabolg-1257958181.cos.ap-shanghai.myqcloud.com/zablog/posterng.jpg",ewmimg.src]
},imgPath;
function draw(){
var mycanvas=document.createElement('canvas');
document.body.appendChild(mycanvas);
var len=data.image.length;
mycanvas.width=750;
mycanvas.height=1180;
mycanvas.crossOrigin="Anonymous";
if(mycanvas.getContext){
var context=mycanvas.getContext('2d');
// 宣传图片
var h=0;
function drawing(num){
if(num<len){
var img=new Image;
img.crossOrigin="anonymous";
img.src=data.image[num];
if(num==0){
img.onload=function(){
context.fillStyle="#fff";
context.drawImage(img,0,0,mycanvas.width,mycanvas.height);
h=960;
drawing(num+1);
}
}else if(num==1){
img.onload=function(){
context.drawImage(img,298,865,156,156);
h=136;
drawing(num+1);
}
}
// 顶部文字
context.textAlign='center';
context.font='40px 微软雅黑';
context.fillStyle='#333';
context.fillText(data.sharecompany,380,150);
context.font='34px 微软雅黑';
context.fillStyle='#02b2ff';
context.fillText(data.shareproduct,380,200);
context.fillText(data.kongqi,320,361);
context.fillText(data.userhour,420,411);
context.fillText(data.forestday,495,461);
context.fillStyle='#666';
context.textAlign='left';
context.fillText('月净化空气',100,360);
context.fillText('享受优质空气长达',100,410);
context.fillText('相当于在原始森林住了',100,460);
context.textAlign='center';
context.fillStyle='#fff';
context.font='26px 微软雅黑';
context.fillText('扫码查看详细报表',370,1065);
context.fillText('【咨询合作 】 林先生 :18012345678',450,1110);
}else{
imgPath=mycanvas.toDataURL("image/jpeg");
document.getElementsByTagName('img')[1].src=imgPath;
}
}
drawing(0);
}
}
CanvasRenderingContext2D.prototype.roundRect = function (x, y, w, h, r) {
var min_size = Math.min(w, h);
if (r > min_size / 2) r = min_size / 2;
// 开始绘制
this.beginPath();
this.moveTo(x + r, y);
this.arcTo(x + w, y, x + w, y + h, r);
this.arcTo(x + w, y + h, x, y + h, r);
this.arcTo(x, y + h, x, y, r);
this.arcTo(x, y, x + w, y, r);
this.closePath();
return this;
}
draw();
//隐藏ios微信前进后退条
document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() {
WeixinJSBridge.call('hideToolbar');
});
最终实现的二维码海报效果如图:

0