首页 > 其他分享 >vue使用qrcodejs2生成二维码且底部带文字描述,支持下载(日常记录)

vue使用qrcodejs2生成二维码且底部带文字描述,支持下载(日常记录)

时间:2023-05-31 15:00:11浏览次数:45  
标签:canvas vue ctx qrcodejs2 param 文字描述 二维码 var qrcodeContent

使用qrcodejs2生成二维码的方法:

/**
 * 二维码生成
 * @param content 生成二维码内容
 * @param desc 二维码底部描述
 * @param qrcodeDom 挂在dom
 * @returns {*|HTMLDivElement}
 */
export function generatorQrcode (content, desc, qrcodeDom = null) {
  const qrcodeContent = qrcodeDom || document.createElement('div')
  qrcodeContent.width = '400px'
  qrcodeContent.height = '400px'
  const qrcodeCanvas = new QRCode(qrcodeContent, {
    text: content, // 需要转换为二维码的内容
    width: 300,
    height: 300,
    colorDark: '#000000',
    colorLight: '#ffffff',
    correctLevel: QRCode.CorrectLevel.H
  })
  var resolutionMultiple = 1 // 分辨率倍数
  var borderSize = 5 * resolutionMultiple // 边框留白
  var canvasWidth = 300 * resolutionMultiple // 图片宽度
  // 判断 参数为空的命名情况
  var text = desc || ''// 底部文字
  var fontSize = 16 * resolutionMultiple // 文字大小

  var canvasHeight = canvasWidth + fontSize * 5
  var canvas = document.createElement('canvas')
  if (!canvas.getContext) return
  canvas.width = canvasWidth
  canvas.height = canvasHeight

  var ctx = canvas.getContext('2d')
  ctx.fillStyle = 'rgb(255,255,255)' // 调色(纯白)
  ctx.fillRect(0, 0, canvasWidth, canvasHeight) // 绘制背景

  var qrcodeSize = canvasWidth - borderSize * 2
  ctx.drawImage(
    qrcodeContent.querySelector('canvas'),
    borderSize,
    borderSize,
    qrcodeSize,
    qrcodeSize
  ) // 填充二维码

  ctx.fill() // 填充背景

  ctx.fillStyle = 'rgb(0,0,0)' // 调色(纯黑)
  ctx.font = fontSize + 'px Arial' // 文本大小, 字体
  ctx.textAlign = 'center'
  //处理文字描述太长换行问题
  ctx = drawText(ctx, text, canvasWidth / 2, qrcodeSize + borderSize, qrcodeSize)
  // ctx.fillText(
  //   text,
  //   canvasWidth / 2,
  //   qrcodeSize + borderSize,
  //   qrcodeSize
  // ) // 绘制文本
  // 清除原二维码
  // qrcodeCanvas.clear()
  qrcodeContent.appendChild(canvas)
  Array.from(qrcodeContent.querySelectorAll('img')).forEach((item) => {
    // item.style.display = 'none'
    item.remove()
    // console.log('img', item)
  })
  return qrcodeContent
}

/**
 *  文字换行
 * canvas文本换行处理
 * @param ctx canvas的 2d 对象
 * @param desc 绘制的文字
 * @param x 文字X坐标
 * @param y 文字Y坐标
 * @param w 文字最大宽度
 * @param space 每行字体y坐标间隔默认17
 */
function drawText (ctx, desc, x, y, w, space = 17) {
  // ctx:canvas的 2d 对象,t:绘制的文字,x,y:文字坐标,w:文字最大宽度
  const chr = desc
  let temp = ''
  const row = []

  for (let a = 0; a < chr.length; a++) {
    if (ctx.measureText(temp).width < w && ctx.measureText(temp + (chr[a])).width <= w) {
      temp += chr[a]
    } else {
      row.push(temp)
      temp = chr[a]
    }
  }
   row.push(temp)
  for (let b = 0; b < row.length; b++) {
    ctx.fillText(row[b], x, y + (b + 1) * space)// 每行字体y坐标间隔20
  }
  return ctx
}

使用: 只需要传二维码内容,底部文字描述和dom节点即可

//节点
<div id="qrcode" ref="qrCodeUrl"></div>

//使用生成二维码
this.qrcode = generatorQrcode(contentText, desc, this.$refs.qrCodeUrl)

 

下载:

download () {
  const a = document.createElement('a')
  //获取二维码画布,实质是canvas节点
  a.href = this.$refs.qrCodeUrl.children[1].toDataURL('image/png', 0.5)
  a.download = this.qrDesc + '.png'
  a.click()
},

 

标签:canvas,vue,ctx,qrcodejs2,param,文字描述,二维码,var,qrcodeContent
From: https://www.cnblogs.com/qiushuiyu-108/p/17352350.html

相关文章

  • vue3 整数还是显示整数,有小数的保留两位小数显示,写一个指令
    1、新建number-format.tsimport{Directive,DirectiveBinding}from"vue";constnumberFormat:Directive={ mounted(el,binding:DirectiveBinding){  constvalue=binding.value.text||"0";  constparsedValue=parseFloat(valu......
  • vue3 整数还是显示整数,有小数的保留两位小数显示,并显示千分符,写一个指令
    1、新建number-thousander-format.tsimport{Directive,DirectiveBinding}from"vue";constnumberThousanderFormat:Directive={ mounted(el,binding:DirectiveBinding){  constvalue=binding.value.text||"0";  constparsedV......
  • 第五篇 - 搭建一个Vue项目
    上一节创建了一个SpringBoot的后端登录功能,接下来创建一个Vue项目实现前端登录页面一、创建一个Vue项目将Vue项目创建到springbootdemo1项目中。打开idea的Terminal,运行【vueinitwebpackvuetest】,后面都按enter/Y/n等就行。稍等一会,vue项目就创建好了。 二、运行Vue项......
  • Vue07-Axios
    Axiosaxios是一个网络请求相关的库。axios:ajaxi/osystem使用axios编写的网络请求代码,可以运行在浏览器端,也可以在Node环境中运行。01.支持的请求方式axios(config)axios.request(config)axios.get(url[,config])axios.delete(url[,config])axios.head......
  • Vue+.net core 7 api跨域
    nginx的不说,直接说在项目中配置的。重点:前端要配代理,后端要设置返回的头文件信息。双管齐下1、前端在项目中的vue.config.js配置中进行设置module.exports={publicPath:'/',outputDir:'dist',//发布输入文件assetsDir:'static',//需要/demo目录下放打包后......
  • Vue computed property values was assigned to but it has no setter
    vue文件中的核心代码写法<template><div><v-select:items="filters"label="查询条件"solodenseclass="select-size"v-model="filterKey"clearable></v-sele......
  • vue监听浏览器窗口大小变化,做对应的操作
    页面初始化mounted的时候,通过document.body.clientWidth和document.body.clientHeight获取到浏览器的宽和高,然后通过window.onresize来监听浏览器窗口的变化,在这里来改变我们的变量宽和高即可。(created()的时候不行,因为此时document还没有生成)<template><sectionclass="p-1......
  • Vue+element搭建后台管理系统-六、实现权限管理
    在一些后台管理系统中,每个身份登录的权限不一样,以至于配置的菜单不一样。就我做过的小区物业管理系统而言,举个例子:业主登录网站只能看到社区服务中的投诉、维修以及查看公告。而管理员可以看到一些对本小区的基本操作,例如查看楼栋,查看业主,账单催缴等等…而超级管理员,可以看到所有......
  • Pycharm中开发vue element项目时eslint的安装和使用
    在PyCharm中使用ESLint对ElementUI进行语法检查和代码风格检查的配置步骤如下:确保你的项目已经配置了ESLint并且可以正常运行。如果尚未安装ESLint,请先使用npm(或者你的包管理器)在项目中安装ESLint:npminstalleslint--save-dev在项目根目录下创建一个名为.eslintrc.......
  • vue-cli详细说明
    vue-cli单页面应用程序单页面应用程序(SinglePageApplication)一个web网站只有唯一一个HTMl页面,所有功能&交互都在唯一一个页面完成vue-clivue-cli是vue.js开发的标准工具,简化了基于webpack创建工程化的Vue项目的过程。创建项目基于vue-cli快速生成工程化的Vue项目:vuecrea......