这几天接到一个需求,需要将一个邀请链接转换为一个带有二维码并且能够分享出去的海报图,网上找了很多的方法,也踩了不少的坑,希望大家遇到类似的需求能够少走弯路。。

具体效果图如下:


效果图

首先我采用了 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绘制分享海报的更多相关文章

  1. 微信小程序之canvas绘制海报分享到朋友圈

    绘制canvas内容 首先,需要写一个canvas标签,给canvas-id命名为shareBox <canvas canvas-id="shareBox"></ ...

  2. 小程序利用canvas 绘制图案 (生成海报, 生成有特色的头像)

    小程序利用canvas 绘制图案 (生成海报, 生成有特色的头像) 微信小程序生成特色头像,海报等是比较常见的.下面我来介绍下实现该类小程序的过程. 首先选择前端来通过 canvas 绘制.这样比较节 ...

  3. 前端生成分享海报兼容H5和小程序

    ### 移动端分享海报生成 最近做项目需求是生成商品分享海报,并且保存到手机中要兼容H5和小程序<br> 与后端同学沟通后,海报在前端生成最省性能和有较好的交互体验,先看做好的效果

  4. 使用 HTML5 Canvas 绘制出惊艳的水滴效果

    HTML5 在不久前正式成为推荐标准,标志着全新的 Web 时代已经来临.在众多 HTML5 特性中,Canvas 元素用于在网页上绘制图形,该元素标签强大之处在于可以直接在 HTML 上进行图形操作 ...

  5. 开源)嗨,Java,你可以生成金山词霸的二维码分享海报吗?

    As long as you can still grab a breath, you fight.只要一息尚存,就不得不战. 有那么一段时间,我特别迷恋金山词霸的每日一句分享海报.因为不仅海报上的图 ...

  6. 微信小程序绘制分享图

    微信小程序绘制分享图例子: demo下载地址:https://gitee.com/v-Xie/wxCanvasShar 大致代码会再以下说明 实际开发项目: 基础知识点: 了解canvas基础知识 w ...

  7. canvas 绘制双线技巧

    楔子 最近一个项目,需要绘制双线的效果,双线效果表示的是轨道(类似铁轨之类的),如下图所示: 负责这块功能开发的小伙,姑且称之为L吧,最开始是通过数学计算的方式来实现这种双线,也就是在原来的路径的基础 ...

  8. 测试canvas绘制旋转文字的性能

    canvas 绘制各种动画效果时,我们经常会使用画布旋转,使绘制上去的元素有旋转的效果. 最近在项目中碰到了很严重的性能问题,经常排查发现是因为绘制批量文字时使用了画布旋转,且每行文字的旋转角度是不一 ...

  9. 微信小程序 分享海报

    const app = getApp(); const template = require('../../template/templates.js'); Page({ /** * 页面的初始数据 ...

随机推荐

  1. Folx好用的下载功能介绍

    Folx作为一款使用便捷的Mac系统下载软件,为用户提供了网页链接捕获.种子文件下载.智能标签等功能,而其Folx专业版更为用户提供了智能控制速度.计划下载任务.种子文件搜索下载等更加智能化的功能. ...

  2. 【VUE】7.Vuex基本使用

    1. 安装Vuex npm install vuex --save 2. 导入Vuex包 import Vuex from 'vuex' Vue.use(Vuex) 3. 创建store对象 cons ...

  3. gitlab 搭建(基于现有nginx)

    普通搭建请看:gitlab 搭建 一.gitlab搭建 1.添加GitLab镜像源并安装gitlab服务器 wget https://mirrors.tuna.tsinghua.edu.cn/gitl ...

  4. HDU4632 Palindrome subsequence

    标签(空格分隔): 区间qp Palindrome subsequence \[求一个string的 回文子序列 的个数 \] 少废话,上代码. #include<bits/stdc++.h&g ...

  5. java数组作为函数返回值

    1 //将一个二维数组行和列元素互换.存到另一个二维数组 2 package test; 3 4 public class test1_8 { 5 public static int[][] huhu ...

  6. Linux学习进度记录(一)

      一.按系列罗列Linux的发行版,并描述不同版本之间的联系和区别 1. RHEL (RedHat Enterprise Linux):红帽企业版Linux,红帽公司是全球最大的开源技术厂商,RHE ...

  7. java导出excel并且压缩成zip上传到oss,并下载,使用字节流去存储,不用文件流保存文件到本地

    最近项目上要求实现导出excel并根据条数做分割,然后将分割后的多个excel打包成压缩包上传到oss服务器上,然后提供下载方法,具体代码如下:这里只展示部分代码,获取数据的代码就不展示了 ByteA ...

  8. web 应用、 框架 及HTTP协议

    web 应用 一.web 应用程序是什么 Web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件 应用程序有两种模式C/ ...

  9. GitHub上最火的、最值得前端学习的几个数据结构与算法项目!没有之一!

    Hello,大家好,我是你们的 前端章鱼猫. 简介 前端章鱼猫从 2016 年加入 GitHub,到现在的 2020 年,快整整 5 个年头了. 相信很多人都没有逛 GitHub 的习惯,因此总会有开 ...

  10. IdentityServer4系列 | 简化模式

    一.前言 从上一篇关于资源密码凭证模式中,通过使用client_id和client_secret以及用户名密码通过应用Client(客户端)直接获取,从而请求获取受保护的资源,但是这种方式存在clie ...