使用jsqr解析二维码

使用jsqr识别二维码

1、vue

使用画布

<el-form-item
  label="设备识别码"
  prop="deviceSerialNo"
  class="position:relative"
>
  <dataInput
    v-if="qrFlag"
    v-model.trim="form.deviceSerialNo"
    :placeholder="$t('lang.pleaseInput')"
    :clearable="false"
    maxlength="32"
  />
  <el-upload
    ref="uploadQr"
    action=""
    :show-file-list="false"
    :http-request="successFnQr"
    class="img-upload"
  >
    <img
      :src="require('@/modules/authMng/assets/scaner.png')"
      alt=""
      style="vertical-align: middle;"
    >
  </el-upload>
  <canvas
    id="myCanvas"
    width="600"
    height="600"
    style="display: none"
  />
</el-form-item>

 2、js

引入jsqr,上传成功后解析二维码

import jsqr from 'jsqr'

data () {
    return {
      fileListQr: [],
      qrFlag: true,
      qrcode: ''
    }
},
methods: {
    successFnQr (event) {
      const isJPG = event.file.type === 'image/jpeg'
      const isPNG = event.file.type === 'image/png'
      const flag = Boolean(!isJPG && !isPNG)
      if (flag) {
        this.form.deviceSerialNo = ''
        this.error('只能上传 JPG(JPEG) / PNG 格式!')
        return
      }
      // jsqr解析二维码
      var img = new Image()
      var reader = new FileReader()
      reader.readAsDataURL(event.file)
      let _this = this
      reader.onload = function (e) {
        img.src = e.target.result
        var myCanvas = document.getElementById('myCanvas')
        var myCanvaswd = myCanvas.getContext('2d')
        img.onload = function () {
          myCanvaswd.drawImage(img, 0, 0, 600, 600)
          var imageData = myCanvaswd.getImageData(0, 0, 600, 600)
          var picData = {}
          picData = jsqr(imageData.data, imageData.width, imageData.height, {
            inversionAttempts: 'dontInvert'
          })
          if (picData && picData.data) {
            _this.form.deviceSerialNo = picData.data
            _this.$refs.form.validateField(`deviceSerialNo`)
            _this.success('识别二维码成功!')
          } else {
            _this.form.deviceSerialNo = ''
            _this.error('识别二维码失败,请重新上传')
          }
          _this.qrFlag = false
          _this.$nextTick(() => {
            _this.qrFlag = true
          })
        }
      }
}

3、css 

.img-upload {
  position: absolute;
  height: 30px;
  width: 30px;
  margin-top: -30px;
  margin-left: 94%;
  cursor: pointer;
}

4、效果图 

jsqr的解析参数

  1. imageData:要解析的图像数据。

  2. imageWidth:图像的宽度。

  3. imageHeight:图像的高度。

  4. threshold:阈值,用于控制二维码的识别精度。默认值为128。threshold 的数值越大,意味着需要更暗的像素才能被识别为黑色区域,因此可能会导致更多的噪点被误判为白色区域。相反,如果 threshold 的数值太小,那么可能会将一些本应识别为白色区域的像素误判为黑色区域,从而影响扫描结果。

  5. inversionAttempts:反转尝试次数,用于解决颜色反转问题。默认值为1。

  6. resultSize:解析结果大小,用于限制解析出的二维码大小。默认值为-1,表示不限制大小。

  7. debug:是否开启调试模式,开启后会输出更多信息以帮助调试。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值