<!doctype html>
<html lang="en">
<head>
<title>页面扫码测试</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" type="text/css" href="css/colorbox.css" />
</head>
<body>
<button id="scan">二维码扫描</button>
<div id="log">
</div>
<div hidden="hidden">
<div id="divQRScan">
<div class="tab-content">
<!-- 由于llqrcode.js中写死了id,所以id必须为qr-canvas -->
<video id="QRvideo" muted autoplay playsinline width="300" height="400" style="display: block;"></video>
<canvas id="qr-canvas" style="display:none;"></canvas>
</div>
</div>
</div>
<script src="js/jquery.js" type="text/javascript" charset="utf-8"></script>
<script src="js/jquery.colorbox-min.js" type="text/javascript" charset="utf-8"></script>
<script src="js/llqrcode.js"></script>
<script>
function log(msg) {
$("#log").append(msg + "<br/>");
}
var videoInputDevice = [];
var videoElement = document.getElementById("QRvideo");
var canvasElement = document.getElementById("qr-canvas");
var canvasContext = document.getElementById("qr-canvas").getContext("2d");
var canvasTimer = null;
var decodeTimer = null;
function captureToCanvas() {
try {
// 根据视频大小设置canvas大小
let w = videoElement.videoWidth;
let h = videoElement.videoHeight;
canvasElement.width = w;
canvasElement.height = h;
canvasContext.drawImage(videoElement, 0, 0, w, h);
} catch (e) {
//log(e);
};
// 100毫秒绘制一次
canvasTimer = setTimeout(captureToCanvas, 100);
}
function decode() {
try {
qrcode.decode();
} catch (e) {
//log(e);
};
// 100毫秒绘制一次
decodeTimer = setTimeout(decode, 100);
}
//扫码识别完成
qrcode.callback = (e) => {
// 清除画布,停止摄像头
if (!!decodeTimer) clearTimeout(decodeTimer);
if (!!canvasTimer) clearTimeout(canvasTimer);
canvasContext.clearRect(0, 0, 300, 400);
if (window.stream) {
window.stream.getTracks().forEach((track) => {
track.stop();
});
}
$.colorbox.close();
log("得到扫码结果:" + e);
}
//获取摄像头列表
navigator.mediaDevices.enumerateDevices().then(function(devices) {
for (let i = 0; i !== devices.length; ++i) {
let deviceInfo = devices[i];
//log(deviceInfo.kind + ":" + deviceInfo.label + "; id = " + deviceInfo.deviceId)
if (deviceInfo.kind === 'videoinput') {
// 视频设备
videoInputDevice.push(deviceInfo);
}
}
});
//开始扫码
document.querySelector('#scan').addEventListener('click', () => {
try {
//显示拍照框
$.colorbox({
scrolling: false,
reposition: true,
inline: true,
href: "#divQRScan"
});
//开启摄像头
navigator.mediaDevices.getUserMedia({
audio: false,
video: {
deviceId: {
// [1].deviceId 表示后置摄像头,默认开启的是前置摄像头
exact: videoInputDevice[1].deviceId
}
}
}).then(function(stream) {
window.stream = stream;
videoElement.srcObject = stream;
videoElement.play();
captureToCanvas();
decode();
}).catch(function(error) {
$.colorbox.close();
if (error.toString().indexOf("TypeError: Cannot read property 'deviceId' of undefined") != -1) {
alert("无法访问摄像头!请授予手机浏览器摄像头权限或切换至有摄像头权限的浏览器!");
} else {
log(error.toString());
}
});
canvasContext.clearRect(0, 0, 300, 400);
} catch (e) {
log(e);
}
});
</script>
</body>
</html>
【Web】H5页面扫码qrcode识别成功,测试项目源码完整下载.zip
4星 · 超过85%的资源 需积分: 47 65 浏览量
2020-04-26
11:55:12
上传
评论 1
收藏 101KB ZIP 举报
qq_40909318
- 粉丝: 1
- 资源: 3
最新资源
- 实现了7种排序算法.三种复杂度排序.三种nlogn复杂度排序(堆排序,归并排序,快速排序)一种线性复杂度的排序.zip
- 冒泡排序 直接选择排序 直接插入排序 随机快速排序 归并排序 堆排序.zip
- 课设-内部排序算法比较 包括冒泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、归并排序和堆排序.zip
- Python排序算法.zip
- C语言实现直接插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序、归并排序、计数排序,并带图详解.zip
- 常用工具集参考用于图像等数据处理
- 音乐展示网页、基于Stenography的图像数字水印添加与提取,以及基于颜色矩和Tamura算法的图像相似度评估算法py源码
- 基于EmguCV(OpenCV .net封装),图像数字水印加解密算法的实现,其中包含最低有效位算法,离散傅里叶变换算法+文档书
- 基于matlab+DWT的图像水印项目,数字水印+源代码+文档说明+图片+报告pdf
- (优秀毕业设计)基于python实现的数字图像可视化水印系统的设计与实现,多种数字算法实现+源代码+文档说明+理论演示pdf
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈