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

具体效果图如下:


效果图

首先我采用了 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. Word1-提取图片文字

    1.OneNote # 将图片以图片格式粘贴在OneNote中-右键选择"复制图片中的文本"-粘贴"只保留文本"即可 这种方式识别率较高!!! 2.手机QQ图片 ...

  2. 下载并破解IntelliJ IDEA(2017)

    idea的下载:https://www.jetbrains.com/idea/download/#section=windows 破解链接:http://blog.csdn.net/nn_jbrs/a ...

  3. php8.0正式版新特性和性能优化学习

    前言 PHP团队宣布PHP8正式GA(链接).php的发展又开启了新的篇章,PHP8.0.0版本引入了一些重大变更及许多新特性和性能优化机制.火速学习下~ JIT(Just in Time Compi ...

  4. Vite ❤ Electron——基于Vite搭建Electron+Vue3的开发环境【一】

    背景 目前社区两大Vue+Electron的脚手架:electron-vue和vue-cli-plugin-electron-builder, 都有这样那样的问题,且都还不支持Vue3,然而Vue3已 ...

  5. IEEE754标准浮点数表示与舍入

    原文地址:https://blog.fanscore.cn/p/26/ 友情提示:本文排版不太好,但内容简单,请耐心观看,总会搞懂的. 1. 定点数 对于一个无符号二进制小数,例如101.111,如果 ...

  6. 硬RAID和软RAID

    RAID简介: RAID是 Redundant Array of Independent Disks的简写,意为独立磁盘冗余阵列,简称磁盘阵列.基本思想是把多个相对便宜的硬盘结合起来,称为一个磁盘阵列 ...

  7. 基础篇:异步编程不会?我教你啊!CompeletableFuture

    前言 以前需要异步执行一个任务时,一般是用Thread或者线程池Executor去创建.如果需要返回值,则是调用Executor.submit获取Future.但是多个线程存在依赖组合,我们又能怎么办 ...

  8. day1(Django路径问题)

    1.python中的三种路径 1.1 操作系统文件绝对路径 django 静态文件查找, 模板查找(第一种) # 去配置好的 文件夹 中查找指定的文件 BASE_DIR = os.path.dirna ...

  9. moviepy音视频剪辑基类VideoClip的write_gif方法opt、fuzz、dispose、colors、loop等参数的作用

    ☞ ░ 前往老猿Python博文目录 ░ moviepy音视频剪辑模块的视频剪辑基类write_gif方法用于将视频剪辑输出到gif文件,调用语法如下: def write_gif(self, fil ...

  10. PyQt(Python+Qt)学习随笔:视图中类QAbstractItemView的dragDropOverwriteMode属性

    老猿Python博文目录 老猿Python博客地址 一.属性的作用 dragDropOverwriteMode属性用于控制视图的拖放行为,如果其值为True,则视图中选定的数据将在拖拽数据放下时被覆盖 ...