Vue项目扫描条码

Vue工程扫描条码

时隔半年,我终于克服了懒癌,回到了csdn创作区,成功补坑,可喜可贺可喜可贺

步骤一

先找到扫描条码的必备要素-quagga.js文件,这个可以去
找了一下,应该是这个网站https://serratus.github.io/quaggaJS/
先npm安装一下插件

步骤二
在自己的Vue项目中main.js文件中写入以下代码

import Quagga from 'quagga'
// 挂载到vue全局
//官网的方法在我的项目里不起作用,我只能这么加载了
Vue.prototype.$Quagga = Quagga 

步骤三
上代码

       //HTML
       <el-col :lg="10" :md="16" :xs="24">
          <div class="grid-content">
            <div class="titletext">扫描</div>
            <el-card class="box-card">
              <video id="camera" autoplay width="300" height="485"></video>
              <canvas id="canvas" width="800" height="800" hidden="hidden"></canvas>
              <img id="Tagimg" style="display:none" src="" alt=""/>
            </el-card>
            <div style="height:20px"></div>
            <div style="text-align:left">
              <el-input id="barCode" v-model="barCode" style="width:50%" placeholder="此处为识别的条码号"></el-input>
              <el-tooltip class="item" effect="light" content="年轻人不讲武德" placement="right-start">
                <el-button type="success" icon="el-icon-check" circle @click="forgetLove"></el-button>
              </el-tooltip>
            </div>
          </div>
        </el-col>
//参数不一定都在
return{
	barCode: '',//条码
    videoobj: null,//视频对象(全局)
}
//JS
    //摄像头开启
    camerastart() {
      let constraints = { video: { facingMode: { exact: 'environment' }  } ,audio:false  };
      let video = document.getElementById("camera"); //video标签的对象?展示的区域?
      //获得Canvas对象
      let canvas = document.getElementById("canvas");
      let Context = canvas.getContext("2d");
      //调用摄像头
      let promise = navigator.mediaDevices.getUserMedia(constraints); //好像现在这样调用是主流方法
      promise.then(mediaStream => {
          this.videoobj =  mediaStream.getTracks();
          try {
            video.srcObject = mediaStream;
          } catch (error) {
            console.log(error);
            video.src = window.URL.createObjectURL(mediaStream);
          }
          video.play();
        })
        .catch(err => {
          this.$message.error("调用摄像头失败,请检查摄像头连接是否有问题。错误信息:" + err);
        });
      //每过1秒获取一次图片
      const getimgsetInterval2 = setInterval(() => {this.takephoto(video,canvas,Context)}, 1000);
      this.$once('hook:beforeDestroy', () => {            
        clearInterval(getimgsetInterval2);                                    
      })
    },
    //拍照
    takephoto(video,canvas,Context) {
      Context.drawImage(video, 0, 0);
      // toDataURL  ---  可传入'image/png'  ---默认, 'image/jpeg'
      let imgurl = canvas.toDataURL("image/png");
      //调用识别方法
      this.analysisbarcode(imgurl);//如果img不好使,就用imgurl
    },
    //识别二维码
    analysisbarcode(imgpath) {
      this.$Quagga.decodeSingle({
        src: imgpath,
        numOfWorkers: 0,  // Needs to be 0 when used within node
        inputStream: {
          size: 800  // restrict input-size to be 800px in width (long-side)
        },
        decoder: {
          readers: ["code_128_reader"] // List of active readers
        },
      }, function(result) {
        if(result.codeResult) {
          alert(result.codeResult.code);
          //由于歪比八卜的原因,Vue的参数在这没起作用,就用原生的js先顶着
          document.getElementById('barCode').value = result.codeResult.code;
        } else {
          console.log("not detected");
        }
      });
    },
    forgetLove(){
      this.barCode = document.getElementById('barCode').value;
    }

总结
以上就是所有的代码了,我感觉黄色代码块的背景色更好看一点

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值