博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何用React, Webcam和JS Barcode SDK创建Web扫码App
阅读量:5879 次
发布时间:2019-06-19

本文共 3749 字,大约阅读时间需要 12 分钟。

hot3.png

这篇文章分享下如何结合和来创建Web扫码App。

Web实时扫码

从GitHub上下载放到React工程中。 打开这个JS文件。在render()函数中添加一个buttoncanvas:

render() {    return (      
); }

button用于触发扫码,canva用来绘制显示结果。为了让结果显示在video上方,创建一个react-webcam.css调整下布局:

#videoview {    position: relative;    width: 640px;    height: 480px;  } #video {    position: relative;    width: 100%;    height: 100%;    z-index: 1} #overlay {    position: absolute;    top: 100;    left: 0;    width: 100%;    height: 100%;    z-index: 2}

react-webcam.js中导入这个CSS文件:

import React, { Component } from 'react';import PropTypes from 'prop-types';import './react-webcam.css';

创建button的响应事件scanBarcode()。函数触发时,先把video绘制到一个临时canvas上。然后得到图像数据传入barcode解码接口中:

scanBarcode() {    if (window.reader) {      let canvas = document.createElement('canvas');      canvas.width = this.props.width;      canvas.height = this.props.height      let ctx = canvas.getContext('2d');      ctx.drawImage(this.video, 0, 0, this.props.width, this.props.height);           window.reader.decodeBuffer(        ctx.getImageData(0, 0, canvas.width, canvas.height).data,        canvas.width,        canvas.height,        canvas.width * 4,        window.dynamsoft.BarcodeReader.EnumImagePixelFormat.IPF_ARGB_8888      )      .then((results) => {        this.showResults(results);      });    }       }

构造函数中需要绑定this。如果不绑定,thisbutton点击的时候无法使用:

constructor() {    super();    this.state = {      hasUserMedia: false,    };     this.scanBarcode = this.scanBarcode.bind(this);  }

扫描触发之后需要持续调用scanBarcode(),并把结果显示在video上:

showResults(results) {    let context = this.clearOverlay();    let txts = [];    try {      let localization;      for (var i = 0; i < results.length; ++i) {        if (results[i].LocalizationResult.ExtendedResultArray[0].Confidence >= 30) {          txts.push(results[i].BarcodeText);          localization = results[i].LocalizationResult;          this.drawResult(context, localization, results[i].BarcodeText);        }      }             this.scanBarcode();           } catch (e) {      this.scanBarcode();    }  } clearOverlay() {    let context = document.getElementById('overlay').getContext('2d');    context.clearRect(0, 0, this.props.width, this.props.height);    context.strokeStyle = '#ff0000';    context.lineWidth = 5;    return context;  }   drawResult(context, localization, text) {    context.beginPath();    context.moveTo(localization.X1, localization.Y1);    context.lineTo(localization.X2, localization.Y2);    context.lineTo(localization.X3, localization.Y3);    context.lineTo(localization.X4, localization.Y4);    context.lineTo(localization.X1, localization.Y1);    context.stroke();       context.font = '18px Verdana';    context.fillStyle = '#ff0000';    let x = [ localization.X1, localization.X2, localization.X3, localization.X4 ];    let y = [ localization.Y1, localization.Y2, localization.Y3, localization.Y4 ];    x.sort(function(a, b) {      return a - b;    });    y.sort(function(a, b) {      return b - a;    });    let left = x[0];    let top = y[0];       context.fillText(text, left, top + 50);  }

public/index.html中加载dbr-6.4.1.3.min.js文件,并创建可用于全局访问的window.reader

                

这里必须把dynamsoft.dbrEnv.bUseWorker设置成true。只有使用了web worker,主线程才不会因为条形码识别耗时而卡住。

App.js中添加React Webcam

import React, { Component } from 'react';import logo from './logo.svg';import './App.css';import {Barcode} from './Barcode';import Webcam from './react-webcam'; class App extends Component {  render() {    return (      
); }} export default App;

运行程序:

npm start

在浏览器中访问localhost:3000

源码

转载于:https://my.oschina.net/yushulx/blog/3016688

你可能感兴趣的文章
异常处理汇总-开发工具
查看>>
[LeetCode] Excel Sheet Column Number 求Excel表列序号
查看>>
通过浏览器直接打开Android应用程序
查看>>
MVC调用SVC无法找到资源解决问题
查看>>
div加jquery实现iframe标签的功能
查看>>
解决Yapi 插件运行不支持文件上传的问题解决
查看>>
Windows路由表详解
查看>>
MySQL从库记录binlog日志出错一例
查看>>
2015年度扯淡
查看>>
phpcms2008列表页模板与内容页模板list.html show.html
查看>>
Java程序员从笨鸟到菜鸟之(八十四)深入浅出Ajax
查看>>
GNS3全面详解系列-GNS3的前世今生
查看>>
JDK 1.8.0_144 集合框架之CopyOnWriteArrayList
查看>>
linux 将大文件分成小文件
查看>>
CCNA- 距离矢量路由协议学习
查看>>
jira 配置 LDAP 访问
查看>>
Canonical发布Ubuntu server 11.10版本
查看>>
企业实践用户邮箱导入/导出(第2部分)
查看>>
我的友情链接
查看>>
nagios搭建(五):nagios监控mysql
查看>>