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

具体效果图如下:


效果图

首先我采用了 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. 【移动自动化】【二】Appium

    实施自动化需要的工具 adb Android控制工具,获取获取Android各种数据和控制,Appium会调起adb命令去执行Android设备 adb命令参考 https://www.cnblogs ...

  2. Appium上下文和H5测试(二)

    坚持原创输出,点击蓝字关注我吧 作者:清菡 博客:oschina.云+社区.知乎等各大平台都有. 文章总览图 一.往期回顾 loc='new UiSelector().text("全程班&q ...

  3. Jenkins忘记管理员账户密码如何解决?

    未修改初始密码时 进入Jenkins工作目录,读取初始密码文件initialAdminPassword: cat initialAdminPassword 然后在登陆页面使用该密码登陆admin用户, ...

  4. CentOS下关于集群同步/LB/HA 的尝试

    Zookepper 集群同步 下载解压 wget http://apache.fayea.com/zookeeper/stable/zookeeper-3.4.8.tar.gz tar xvf zoo ...

  5. Alpha冲刺——总结

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 团队进行Alpha冲刺 作业正文 正文 其他参考文献 无 ...

  6. JZOJ2020年8月14日提高组反思

    JZOJ2020年8月14日提高组反思 T1 看到题 一脸:我是谁,我在哪,我要干啥 看到字符串凉一半 还有查询修改 想到线段树但不会建模 暴力安排 T2 一开始觉得:水题 然后啪啪打脸 空间小,数据 ...

  7. MyBatis 常见面试题总结

    1.#{}和${}的区别是什么? 注:这道题是面试官面试我同事的. 答: ${}是 Properties 文件中的变量占位符,它可以用于标签属性值和 sql 内部,属于静态文本替换,比如${drive ...

  8. 老猿学5G专栏完结说明

    老猿学5G是因为工作原因促成的,主要目的是为了研究5G的计费架构相关内容,到今天为止,基本上达成目标,因此这个专栏基本上告一段落了. 回想这2个多月的日子,从一个对5G相关知识完全不熟悉的小白,到现在 ...

  9. moviepy音视频剪辑:使用VideoFileClip、AudioFileClip和write_videofile、write_audiofile进行音视频的加载和输出

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.概述 在本地进行音视频处理时,首先要从视频文件 ...

  10. 第十六章、Model/View开发:QColumnView的作用及对应Model

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 在Qt Designer的Item Views(Model-based)部件中,Colum ...