html5调用手机本地摄像头和相册识别二维码

        在官方H5+ APIbarcode通过调用设备的摄像头对二维码进行扫描识别,扫描到二维码后进行解码并返回码数据内容及码类型。但是暂未给出识别手机拍摄的二维码,以下代码实现了此功能。

完整demo:https://download.csdn.net/download/qq_37212970/11270805

 

<!doctype html>
<html>

	<head>
		<meta charset="UTF-8">
		<title></title>
		<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
		<script src="js/mui.min.js"></script>
		<link href="css/mui.min.css" rel="stylesheet" />
		<script type="text/javascript" src="js/llqrcode.js"></script>
		<style type="text/css">
			#bcid {
				width: 100%;
				height: 86%;
				margin-top: 45px;
				position: absolute;
				background: #000000;
			}
			
			.fbt {
				color: #0E76E1;
				width: 50%;
				background-color: #ffffff;
				float: left;
				line-height: 44px;
				text-align: center;
			}
			
			#outdiv {
				width: 320px;
				height: 240px;
				border: solid;
				border-width: 3px 3px 3px 3px;
			}
		</style>
	</head>

	<body>
		<header class="mui-bar mui-bar-nav" style="background-color: #ffffff;">
			<a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>
			<h1 class="mui-title" style="color: #0E76E1;">物品二维码扫描</h1>
			<span class="mui-icon mui-icon-spinner-cycle mui-spin mui-pull-right" id="turnTheLight"></span>
		</header>

		<div id="bcid">
			<!--盛放扫描控件的div-->
		</div>

		<div class="mui-bar mui-bar-footer" style="padding: 0px;">
			<div class="fbt" onclick="scanPicture();">从相册选择二维码</div>
			<div class="fbt mui-action-back">取  消</div>
		</div>
		<div align="center" style="display: none;">
			<div id="outdiv">
			</div>
		</div>
		<canvas id="qr-canvas" width="800" height="600"></canvas>
		<script type="text/javascript">
			scan = null; //扫描对象  
			mui.plusReady(function() {
				mui.init();
				startRecognize();
			});

			function startRecognize() {
				try {
					var filter;
					//自定义的扫描控件样式  
					var styles = {
						frameColor: "#29E52C",
						scanbarColor: "#29E52C",
						background: ""
					}
					//扫描控件构造  
					scan = new plus.barcode.Barcode('bcid', filter, styles);
					scan.onmarked = onmarked;
					scan.onerror = onerror;
					scan.start();
					//打开关闭闪光灯处理  
					var flag = false;
					document.getElementById("turnTheLight").addEventListener('tap', function() {
						if(flag == false) {
							scan.setFlash(true);
							flag = true;
						} else {
							scan.setFlash(false);
							flag = false;
						}
					});
				} catch(e) {
					alert("出现错误啦:\n" + e);
				}
			};

			function onerror(e) {
				alert(e);
			};

			function onmarked(type, result) {
				var text = '';
				switch(type) {
					case plus.barcode.QR:
						text = 'QR: ';
						break;
					case plus.barcode.EAN13:
						text = 'EAN13: ';
						break;
					case plus.barcode.EAN8:
						text = 'EAN8: ';
						break;
				}
				alert(text + " : " + result);

			};
		</script>
		<script type="text/javascript">
				load();
				var gCtx = null;
				var gCanvas = null;
				var c = 0;
				var stype = 0;
				var gUM = false;
				var webkit = false;
				var moz = false;
				var v = null;

				function dragenter(e) {
					e.stopPropagation();
					e.preventDefault();
				}

				function dragover(e) {
					e.stopPropagation();
					e.preventDefault();
				}

				function drop(e) {
					e.stopPropagation();
					e.preventDefault();

					var dt = e.dataTransfer;
					var files = dt.files;
					if(files.length > 0) {
						handleFiles(files);
					} else
					if(dt.getData('URL')) {
						qrcode.decode(dt.getData('URL'));
					}
				}

				function handleFiles(f) {
					var o = [];

					for(var i = 0; i < f.length; i++) {
						var reader = new FileReader();
						reader.onload = (function(theFile) {
							return function(e) {
								qrcode.decode(e.target.result);
							};
						})(f[i]);
						reader.readAsDataURL(f[i]);
					}
				}

				function initCanvas(w, h) {
					gCanvas = document.getElementById("qr-canvas");
					gCanvas.style.width = w + "px";
					gCanvas.style.height = h + "px";
					gCanvas.width = w;
					gCanvas.height = h;
					gCtx = gCanvas.getContext("2d");
					gCtx.clearRect(0, 0, w, h);
				}

				function captureToCanvas() {
					if(stype != 1)
						return;
					if(gUM) {
						try {
							gCtx.drawImage(v, 0, 0);
							try {
								qrcode.decode();
							} catch(e) {
								console.log(e);
								setTimeout(captureToCanvas, 500);
							};
						} catch(e) {
							console.log(e);
							setTimeout(captureToCanvas, 500);
						};
					}
				}

				function htmlEntities(str) {
					return String(str).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
				}

				function read(a) {

					alert(a);

				}

				function isCanvasSupported() {
					var elem = document.createElement('canvas');
					return !!(elem.getContext && elem.getContext('2d'));
				}

				function success(stream) {

					v.srcObject = stream;
					v.play();

					gUM = true;
					setTimeout(captureToCanvas, 500);
				}

				function error(error) {
					gUM = false;
					return;
				}

				function load() {
					if(isCanvasSupported() && window.File && window.FileReader) {
						initCanvas(800, 600);
						qrcode.callback = read;
					} else {
						alert("您当前浏览器不支持扫码!");
					}
				}

				function scanPicture() {
					//隐藏了从相册获取图片的情况
					var imghtml = '<div id="qrfile"><canvas id="out-canvas" width="320" height="240"></canvas>' +
						'<div id="imghelp"  style="display:none">' +
						'<span class="fileinput-button"> <input id="picselect" type="file"  onchange="handleFiles(this.files)"  > </span>' +
						'</div>' +
						'</div>';

					document.getElementById("outdiv").innerHTML = imghtml; //绘制选取样式
					//这里模拟点击事件
					var fileEle = document.getElementById('picselect');
					if(fileEle) {
						fileEle.click();
					}

					var qrfile = document.getElementById("qrfile");
					qrfile.addEventListener("dragenter", dragenter, false);
					qrfile.addEventListener("dragover", dragover, false);
					qrfile.addEventListener("drop", drop, false);
					stype = 2;
				}
		</script>
	</body>

</html>
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 实现html5调用手机本地摄像头相册识别二维码需要以下步骤: 1. 首先需要在网页中引入js库,例如jquery以及二维码库qrcode.js。 2. 在html页面中设置一个视频标签,用于显示摄像头捕获到的实时画面。 3. 使用getUserMedia方法调用手机本地摄像头。对于不同浏览器需要考虑一些兼容性问题。 4. 将捕获到的视频流绑定到视频标签中进行实时显示。 5. 在js文件中使用qrcode库对摄像头捕捉到的画面进行解析,识别其中的二维码。使用参数配置来控制解析二维码的方式。 6. 添加一个input标签,用于调用手机本地相册,因为调用相册需要用户操作。 7. 给input标签添加change事件,获取用户选择的图片,并将其绑定到img标签中。 8. 同样使用qrcode库对选择的图片进行解析,识别其中的二维码。 需要注意的是,因为html5调用手机摄像头相册在不同的浏览器上存在一些差异,因此需要根据具体浏览器的特点进行相应的调整。并且,在实际应用中还需要考虑到用户体验和数据安全等问题。 ### 回答2: HTML5调用手机本地摄像头相册识别二维码需要借助WebRTC技术和JavaScript编程语言实现,具体实现过程如下: 1. 检测用户设备是否支持WebRTC技术。如果支持,则可以继续进行下一步操作。如果不支持,则无法调用摄像头相册。 2. 使用JavaScript编程语言创建一个视频元素来显示摄像头实时画面,代码如下: ``` <video id="video" autoplay></video> ``` 3. 获取用户授权,允许使用摄像头相册。代码如下: ``` navigator.mediaDevices.getUserMedia({ video: true, audio: false }) .then(function(stream) { var video = document.querySelector('video'); video.srcObject = stream; video.onloadedmetadata = function(e) { video.play(); }; }) .catch(function(err) { console.log(err.name + ": " + err.message); }); ``` 4. 启动二维码识别器库QuaggaJS,开始识别摄像头中的二维码。代码如下: ``` Quagga.init({ inputStream : { name : "Live", type : "LiveStream" }, decoder : { readers : ["code_128_reader"] } }, function(err) { if (err) { console.log(err); return; } console.log("QuaggaJS is ready to start scanning."); Quagga.start(); }); Quagga.onDetected(function(result) { console.log("Barcode detected and processed : [" + result.codeResult.code + "]", result); }); ``` 5. 如果想识别相册中的二维码,则需为文件选择器添加一个“change”事件监听器,选择文件后即可发起识别。代码如下: ``` var inputElement = document.querySelector('input[type=file]'); inputElement.addEventListener('change', function(e) { var file = e.target.files[0]; Quagga.decodeSingle({ decoder: { readers: ["code_128_reader"] }, src: URL.createObjectURL(file) }, function(result) { console.log("Barcode detected and processed : [" + result.codeResult.code + "]", result); }); }, false); ``` 通过以上步骤,我们就可以使用HTML5调用手机本地摄像头相册识别二维码了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值