前端动态生成二维码后合成海报,下载分享

摘要:
组合成图片后,用户可以通过长按微信中的组合海报来分享或识别二维码。我使用了上面提到的第二种方法来显示二维码。我将二维码画布转换为base64并将其显示在img标签上,然后将二维码img与海报背景img组合。在检查了N多种材料并多次尝试后,我终于发现这是因为我的二维码是base64。如果二维码显示在画布上,那么你可以合成海报并将其转换为base64。

转载:zgh0711https://blog.csdn.net/zgh0711/article/details/88192993

如何生成二维码

现在前端环境下,要生成二维码,可用的工具库有很多,我这里用的是 qrcode,首先安装

  npm install --save qrcode

安装完之后 import 导入就能使用了

  import QRCode from 'qrcode'

一,将生成的二维码通过 canvas 标签展示

<canvas   id="qrCode-canvas"></canvas>
let canvas = document.getElementById('qrCode-canvas')
        QRCode.toCanvas(canvas, this.qrCodeUrl, (error) => {
          if (error) {
            console.log(error)
          } else {
            canvas.style. 
            canvas.style. 
            });
          }
 })

  二维码生成好后,有需要的话可以调整下 canvas 的大小等属性,因为 qrcode 生成的二维码会带有一些默认样式,需要调整下。

二,先通过 canvas 生成二维码,然后将 canvas 的内容转为 base64 格式以 img 标签展示

<img     :src="http://t.zoukankan.com/dataUrl" alt="邀请二维码"/>

let img = document.getElementById('qr-img')
        let canvas = document.createElement('canvas')
        canvas.width = img.width
        canvas.height = img.height
        //用 canvas 对象和邀请链接生成二维码,并将生成的二维码转为 base64
        QRCode.toCanvas(canvas, this.qrCodeUrl, (error) => {
          if (error) {
            console.log(error)
          } else {
            this.dataUrl = canvas.toDataURL("image/jpeg")
            });
          }
})

上面两种方式都可以生成二维码并显示在界面上,区别在于第一种是以 canvas 标签显示,在微信中长按是无法识别的。第二种是以 img 标签显示,在微信中长按会自动识别并可以直接以图片形式分享出去。

做到这一步,需求已经完成了一半,下一步就是按设计图要求把二维码定位到海报背景上,将二维码和海报合成为一张图片。之所以要合成为一张图片还是为了让用户在微信中操作方便。合成为一张图片后,用户在微信中直接长按合成后的海报就可以分享或者识别二维码。

合成海报时碰到的坑

合成海报时需要用到另一个工具库 html2canvas ,基本使用方法也很简单,先获取要合成图片的 dom 对象,然后调用 html2canvas ,它会返回一个 promise,里面的 canvas 就是合成后的图片信息,同样的,这里的 canvas 可以直接显示出来,也可以转成 base64 之后放到 img 标签里显示,但是为了分享或者下载方便,基本都是转成了 base64

let poster = document.getElementById('poster')
            html2canvas(poster).then(canvas => {
              this.posterDataUrl = canvas.toDataURL()
});

到这里,基本需求就完成了。然而世界上的事情往往都不会是一帆风顺的,在测试的时候发现出了问题。

我前面二维码是用上面说的第二种方法显示的,将二维码的 canvas 转成了 base64 显示在 img 标签上,再将这个二维码 img 和海报背景 img 合成。这样的实现方式在 iOS 和浏览器中都没有问题,然而在安卓版微信里面却是只有海报背景而没有二维码。

在查了N多资料和尝试了好多遍之后终于发现,是因为我的二维码是 base64 的,如果二维码是以 canvas 形式显示,再去合成海报,将合成后的海报转为 base64 就没有问题了。 所以我在前面写生成二维码的时候写了二种方法。至此,整个需求也就真正的完成了。

下面是完整代码

<template>
  <div class="ypl-flex">
    <mt-header title="邀请用户" go-back></mt-header>
    
    <div class="invitePosterPage flex">
      <p class="title">分享专属海报,邀请用户注册,即可成功邀请</p>
      <p class="remark">(注:只能通过此二维码注册用户才可成功邀请)</p>
      
      <img v-if="posterDataUrl" :src="http://t.zoukankan.com/posterDataUrl"   alt="邀请海报"/>
      <div v-else     style="position: relative">
        <img   src="http://t.zoukankan.com/assets/img/img_poster_bg.png" alt="邀请海报背景"/>
        <canvas   id="qrCode-canvas"></canvas>
      </div>
    </div>
  </div>
</template>

<script>
  /**
   * 这是邀请海报组件
   */
  import QRCode from 'qrcode'
  import html2canvas from 'html2canvas';
  
  export default {
    name: 'Poster',
    data () {
      return {
        posterDataUrl:'',
        qrCodeUrl: 'https://www.baidu.com'
      }
    },
  
    async mounted () {
    	this.createQRCode()
    },
    
    methods: {
      createQRCode () {
        //先用 QRCode 生成二维码 canvas,然后用 html2canvas 合成整张海报并转成 base64 显示出来
        let canvas = document.getElementById('qrCode-canvas')
        QRCode.toCanvas(canvas, this.qrCodeUrl, (error) => {
          if (error) {
            console.log(error)
          } else {
            //qrcode 生成的二维码会带有一些默认样式,需要调整下
            canvas.style. 
            canvas.style. 
            
            let poster = document.getElementById('poster')
            html2canvas(poster).then(canvas => {
              this.posterDataUrl = canvas.toDataURL()
            });
          }
        })
      }
    },
  }
</script>

  

这次做这个需求的过程中,查到了一些 html2canvas 的资料,有很多文章都提到 html2canvas 有一些坑,我是没碰到,现在将这些文章列出来,给需要的人。
html2canvas 用法详解
Html2canvas - 项目中遇到的那些坑点汇总(更新中…)
一次 H5 「保存页面为图片」 的踩坑之旅
微信H5实现网页长按保存图片及识别二维码
基于html2canvas实现网页保存为图片及图片清晰度优化
Vue.js结合Canvas制作二维码和图片的合成(qrcanvas + html2canvas)

然后就是 canvas 转 base64 的 .toDataURL()] 这个方法,这个方法里面其实是可以配置参数的,有需要的可以去看下这个文档
HTMLCanvasElement.toDataURL()

免责声明:文章转载自《前端动态生成二维码后合成海报,下载分享》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇spark学习笔记-java调用spark简单demoSpringBoot集成redisson分布式锁下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Protobuf API安全测试启示 admin

ProtoBuf介绍 protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。 Protocol Buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单。 因此具有以下特点: 语言...

Hutool-二维码生成

Hutool工具类生成二维码 示例代码: import cn.hutool.core.io.FileUtil; import cn.hutool.extra.qrcode.QrCodeUtil; import cn.hutool.extra.qrcode.QrConfig; import com.google.zxing.qrcode.decoder.Er...

java实现二维码生成的几个方法

1: 使用SwetakeQRCode在Java项目中生成二维码http://swetake.com/qr/ 下载地址或着http://sourceforge.jp/projects/qrcode/downloads/28391/qrcode.zip这个是日本人写的,生成的是我们常见的方形的二维码可以用中文如:5677777ghjjjjj 2: 使用BarC...

vue中通过WeixinJSBridge关闭微信公众号当前页面,返回微信公众号首页

之前有个需求,点击菜单进入到微信公众号模块,然后点击返回的时候不知道到哪里去,后来觉得点返回的时候直接关闭页面,但是window.close()并不能关闭页面,然后经过查找资料,发现通过以下方法可以 setTimeout(function() { //这个可以关闭安卓系统的手机 document.addEventListener( "Wei...

用chrome模拟微信浏览器访问页面

有的网页通过限制user agent 来达到禁止在微信浏览器以外的地方访问,我们通过chrome修改user agent即可破解。 CHROME浏览器,进入开发者模式 切换到手机浏览模板 打开 Network,有下拉菜单中选择Custom->Add 选择Devices,再点击Add custom device 然后在user agent中填写下面的...

java-二维码生成页面输出

二维码现在很流行。 前端也有二维码的生成方式: jquery.qrcode qrcode其实是通过使用jQuery实现图形渲染,支持Html5技术的才能实现,只要是canvas实现的。传输门 而java生成二维码已经很成熟了,兼容性也很好。 直接下载jar包  传输门 下载文件里有core-3.0.0.jar和BASE64Encoder.jar两个jar包...