JS实现网页二维码扫描功能

最近接到一个任务,实现网页版的二维码扫描,刚开始以为会很简单,没想到大意失荆州,网上的教程资料很多,可是可以用的不多,所幸我最终做了出来,所以分享给大家,大家一起进步。

代码

HTML部分代码
<html>
	<head>
        <meta charset="utf-8" />
		<title>Scanner</title>
        <script src="jquery.min.js"></script>
        <script src="jsQR.js"></script>
	</head>
	<body>
		<canvas id="qr-canvas" width="800" height="600"></canvas>
		<video id="v" autoplay></video>
		<script type="text/javascript" src="qrcode.js"></script>
		<script type="text/javascript" src="scan.js"></script>
	</body>
</html>
共通JS文件路径

https://gitee.com/kedu666/scanner/blob/master/JS/jquery.min.js
https://gitee.com/kedu666/scanner/blob/master/JS/jsQR.js
https://gitee.com/kedu666/scanner/blob/master/JS/qrcode.js

scan.js的代码
   //是否成功调用getUserMedia标识
   var gUM=false;
   //画布getContext对象
   var gCtx = null;
   // 数据流对象
   var imageData =null;
   //视频展示对象
   var v=document.getElementById("v");
   var n=navigator;
   // 画布元素
   var gCanvas = document.getElementById("qr-canvas");
   gCtx = gCanvas.getContext('2d');
   qrcode.callback = function(e){
	  //结果回调
	  alert(e);
   }
   //不同getUserMedia处理
   if(n.getUserMedia){
	  // 移动设备打开后置摄像头【 facingMode: "environment"】 
	  n.getUserMedia({video: { facingMode: "environment"}}, success, error);
	  }
   else
   if(n.mediaDevices.getUserMedia){
	  n.mediaDevices.getUserMedia({video: { facingMode: "environment"} , audio: false})
			.then(success)
			.catch(error);
	}
   else
   if(n.webkitGetUserMedia)
   {
	  webkit=true;
	  n.webkitGetUserMedia({video:{ facingMode: "environment"}}, success, error);
   }
   else
   if(n.mozGetUserMedia)
   {
	  moz=true;
	  n.mozGetUserMedia({video: { facingMode: "environment"}}, success, error);
   }
   //getUserMedia调用成功
   function success(stream) {			   
		v=document.getElementById("v");	
		try{
			 v.srcObject = stream;
		}catch{
		//这里是兼容写法
			let compatibleURL = window.URL || window.webkitURL;
			v.src = compatibleURL.createObjectURL(stream);
		}
	  gUM=true;
	  setTimeout(captureToCanvas, 500);
   }
   //getUserMedia调用失败
   function error(error) {
	  gUM=false;
	  return;
   }
 
   //将视频流放到画布
function captureToCanvas() {
  if(gUM){
		gCtx.drawImage(v,0,0);
		
		setTimeout(captureToCanvas, 500);
		
		imageData = gCtx.getImageData(0,0,600,800);
		
		const code = jsQR(imageData.data, imageData.width, imageData.height, {
			inversionAttempts: "dontInvert",
		});
		
		alert('code.data:'+code.data);
		
		if(code){
			window.location.href = code.data;
		}else{
			alert("识别错误")
		}
	}
   }

代码运行步骤

第一步:将这些文件下载到本地文件夹
第二步:将文件见打包成.zip压缩包
第三步:通过微信上传到移动端,
第四步:通过zip压缩工具将文件解压缩
第五步:以浏览器的形式打开html文件,打开的同时将启用摄像头
第六步:对准提前准备好的二维码图片进行扫描。

由于本人一直从事数据库后端开发,对前端了解不多,所以页面比较简陋,但是基本功能实现了,希望这些代码对正在进行二维码扫描开发的朋友们有帮助,有问题可以给我留言,我们一起探讨,一起进步。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐