jsQR是一个纯粹的JavaScript二维码阅读库。 该库接收原始图像,并将定位、提取和解析其中找到的任何二维码。不需要开发APP、公众号和小程序,也能在网页实现二维码扫码功能!
在 npm 上可用。可以在 Node.js 程序中使用,也可以与模块捆绑器(如 Webpack 或 Browserify)一起使用。
npm install jsqr --save
// ES6 importimport jsQR from "jsqr";// CommonJS requireconst jsQR = require("jsqr");jsQR(...);
或者对于前端使用 jsQR.js可以包含在脚本标记中
<script src="jsQR.js"></script><script> jsQR(...);</script>
jsQR 被设计为一个完全独立的库,用于扫描 QR 码。根据设计,它不包含任何特定于平台的代码。这使其能够轻松扫描前端网络摄像头流、用户上传的图像或用作后端 Node.js 过程的一部分。
如果要使用 jsQR 扫描网络摄像头流,则需要从视频流中提取图像数据。然后可以将其传递给 jsQR。jsQR 演示包含网络摄像头扫描的准系统实现,可用作起点并根据您的需求进行定制。对于更高级的问题,您可以参考getUserMedia文档或相当全面的webRTC示例代码,这两者都是使用网络摄像头流的重要资源。
jsQR 导出一个方法,该方法接受 3 个参数,表示您要解码的图像数据。此外,还可以采用选项对象来进一步配置扫描行为。
const code = jsQR(imageData, width, height, options?);if (code) { console.log("Found QR code", code);}
如果 QR 能够解码,则库将返回具有以下键的对象。
由于库是用typescript编写的,因此您还可以查看类型定义以了解 API。
完整代码:
<html><head> <meta charset="utf-8"> <title>jsQR Demo</title> <script src="./jsQR.js"></script> <link href="https://fonts.googleapis.com/css?family=Ropa+Sans" rel="stylesheet"> <style> body { font-family: 'Ropa Sans', sans-serif; color: #333; max-width: 640px; margin: 0 auto; position: relative; } #githubLink { position: absolute; right: 0; top: 12px; color: #2D99FF; } h1 { margin: 10px 0; font-size: 40px; } #loadingMessage { text-align: center; padding: 40px; background-color: #eee; } #canvas { width: 100%; } #output { margin-top: 20px; background: #eee; padding: 10px; padding-bottom: 0; } #output div { padding-bottom: 10px; word-wrap: break-word; } #noQRFound { text-align: center; } </style></head><body><h1>jsQR Demo</h1><p>Pure JavaScript QR code decoding library.</p><div id="loadingMessage"> Unable to access video stream (please make sure you have a webcam enabled)</div><canvas id="canvas" hidden></canvas><div id="output" hidden> <div id="outputMessage">No QR code detected.</div> <div hidden><b>Data:</b> <span id="outputData"></span></div></div><script> var video = document.createElement("video"); var canvasElement = document.getElementById("canvas"); var canvas = canvasElement.getContext("2d"); var loadingMessage = document.getElementById("loadingMessage"); var outputContainer = document.getElementById("output"); var outputMessage = document.getElementById("outputMessage"); var outputData = document.getElementById("outputData"); function drawLine(begin, end, color) { canvas.beginPath(); canvas.moveTo(begin.x, begin.y); canvas.lineTo(end.x, end.y); canvas.lineWidth = 4; canvas.strokeStyle = color; canvas.stroke(); } // 打开手机上安装后置摄像头 navigator.mediaDevices.getUserMedia({ video: { facingMode: "environment" } }).then(function(stream) { video.srcObject = stream; // 阻止IOS视频全屏 video.setAttribute("playsinline", true); video.play(); requestAnimationFrame(tick); }); function tick() { loadingMessage.innerText = "Loading video..." if (video.readyState === video.HAVE_ENOUGH_DATA) { loadingMessage.hidden = true; canvasElement.hidden = false; outputContainer.hidden = false; canvasElement.height = video.videoHeight; canvasElement.width = video.videoWidth; canvas.drawImage(video, 0, 0, canvasElement.width, canvasElement.height); var imageData = canvas.getImageData(0, 0, canvasElement.width, canvasElement.height); var code = jsQR(imageData.data, imageData.width, imageData.height, { inversionAttempts: "dontInvert", }); if (code) { drawLine(code.location.topLeftCorner, code.location.topRightCorner, "#FF3B58"); drawLine(code.location.topRightCorner, code.location.bottomRightCorner, "#FF3B58"); drawLine(code.location.bottomRightCorner, code.location.bottomLeftCorner, "#FF3B58"); drawLine(code.location.bottomLeftCorner, code.location.topLeftCorner, "#FF3B58"); outputMessage.hidden = true; outputData.parentElement.hidden = false; outputData.innerText = code.data; } else { outputMessage.hidden = false; outputData.parentElement.hidden = true; } } requestAnimationFrame(tick); }</script></body></html>
参考上面代码,只要取到图片base64数据传给jsQR的方法即可。