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

具体效果图如下:


效果图

首先我采用了 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. C语言讲义——结构化编程(分支、循环)

    顺序结构(从上到下) 分支结构(也叫选择结构) 循环结构 分支结构 if...else 最基本的分支结构是if(){}else{}. 为了代码的安全,同时也是出于代码规范的考虑,if()后面一定要加花 ...

  2. VUE:data数据中,能被网页渲染出来的数据类型有哪些

    我们都知道vue中,data里面的数据类型可以使任意类型. 但是能在网页上可以渲染出来的类型有哪些呢? 我们来看一下在VUE中data里的什么数据类型可以渲染出来. 我在下面列举了这些数据类型 显示结 ...

  3. 做IT需要掌握的电力基础知识

    电流 损耗 直流电的传输损耗大,所以不适合长距离传输, 交流电的传输损耗小,所以适合长距离传输, 使用 直流电电压稳定,无白躁声,故适於电子产品使用(例如电视机,收音机电脑等), 交流电要经过整流/开 ...

  4. golang 自学系列(四)——debug for vscode

    golang 自学系列(四)--(调试)VSCode For Debug 这里如何装 vscode 我就不说了 这里如何在 vscode 正常写代码我也不说了 在能正常用 vscode 写 go 语言 ...

  5. 使用Jmeter测试快速入门

    一 创建线程组 1.1.2.   线程组主要包含三个参数:线程数.准备时长(Ramp-Up Period(in seconds)).循环次数. 1.1.3.    线程数:虚拟用户数.一个虚拟用户占用 ...

  6. 微服务注册到Nacos的IP私网172.x.x.x网段无法访问的问题

    解决方案一 显示声明注册服务实例的外网IP,默认就是使用私网的IP造成无法访问的,配置如下: spring: cloud: nacos: discovery: ip: 101.37.6.8 解决方案二 ...

  7. 极简python教程02:基础变量,删繁就简

    python极简教程已经开赛,如果错过说明可以回翻: 极简python教程:赛前说明 借这个机会,我再讲讲我的教程和其他网上的教程的区别: 1 我分享的内容,是我在工作中会高频使用的语法,是精华内容 ...

  8. 第6章 Python中的动态可执行方法 第6.1节 Python代码编译

    在介绍动态可执行方法前,本节先介绍一下Python代码编译有关的知识,因为部分内容和动态执行有些关联. 一.    Python解释器的功能 Python虽然是解释型语言,但Python代码也是可编译 ...

  9. PyQt(Python+Qt)学习随笔:QMainWindow的tabifyDockWidget方法将QDockWidget两个停靠窗选项卡式排列

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 主窗口的tabifyDockWidget方法用于将主窗口的两个停靠窗口 ...

  10. PyQt(Python+Qt)学习随笔:QTabWidget选项卡部件移除选项卡的removeTab和clear方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 要从一个QTabWidget中去除选项卡,可用使用removeTab和clear方法. 1.移除选项 ...