在數字化時代,二維碼已經滲透到我們生活的方方面面。從移動支付到產品溯源,二維碼憑借其便捷性和高效性,成為了信息傳遞的重要載體。而隨著前端技術的不斷發展,我們甚至可以使用 JavaScript 在網頁端實現二維碼掃描功能,為用戶提供更加便捷的操作體驗。
本文將帶您深入了解如何使用 JavaScript 調用攝像頭,結合 jsQR
庫,以及如何控制閃光燈,最終實現一個功能完善的網頁掃碼應用。
一、 項目概述
我們將創建一個簡單的網頁應用,該應用能夠:
調用設備攝像頭,獲取實時視頻流。
在網頁上創建一個掃描區域,用戶可以將二維碼放置在該區域內進行掃描。
使用 jsQR
庫解碼掃描區域內的二維碼圖像數據,獲取二維碼內容。
提供手動輸入二維碼內容的功能。
如果設備支持,還可以控制閃光燈的開關,以便在光線不足的情況下進行掃描。
二、 實現步驟
1. HTML 結構
首先,我們需要構建基本的 HTML 結構,包括:
<video>
標簽:用于展示攝像頭捕獲的實時視頻流。
<canvas>
標簽:用于繪制視頻幀和掃描區域,并從中獲取圖像數據。
<div>
標簽:用于創建掃描區域、按鈕組等 UI 元素。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>掃一掃</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<video id="video" autoplay></video>
<canvas id="overlay" hidden></canvas>
<div class="scan-area"></div>
<div class="btn-group">
<button id="manualInputBtn">手動輸入</button>
<button id="flashBtn">閃光燈</button>
</div>
<script src="https://cdn.jsdelivr.net/npm/jsqr@1.4.0/dist/jsQR.min.js"></script>
<script src="script.js"></script>
</body>
</html>
2. CSS 樣式
為了提升用戶體驗,我們需要為頁面元素添加一些樣式:
body {
margin: 0;
overflow: hidden;
}
#video {
width: 100%;
height: auto;
display: block;
}
#overlay {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
pointer-events: none;
}
.scan-area {
border: 3px solid yellow;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 80%;
height: 30%;
}
3. JavaScript 交互
JavaScript 代碼是實現掃碼功能的核心部分,主要包括以下幾個步驟:
獲取攝像頭權限: 使用 navigator.mediaDevices.getUserMedia()
方法請求訪問用戶的攝像頭。
播放視頻流: 將獲取到的視頻流賦值給 <video>
標簽的 srcObject
屬性,并調用 video.play()
方法開始播放。
創建掃描循環: 使用 requestAnimationFrame()
方法創建一個循環,不斷地從視頻流中獲取幀圖像,并進行二維碼解碼。
繪制視頻幀: 在每一幀中,使用 canvas.drawImage()
方法將視頻幀繪制到 <canvas>
元素上。
獲取掃描區域圖像數據: 使用 canvas.getImageData()
方法獲取掃描區域的圖像數據。
解碼二維碼: 使用 jsQR
庫的 jsQR()
方法解碼圖像數據,如果解碼成功,則獲取二維碼內容。
處理掃描結果: 對解碼后的二維碼內容進行處理,例如跳轉到鏈接、顯示信息等。
實現其他功能: 實現手動輸入二維碼內容和控制閃光燈等功能。
const video = document.getElementById('video');
const overlay = document.getElementById('overlay');
const manualInputBtn = document.getElementById('manualInputBtn');
const flashBtn = document.getElementById('flashBtn');
const scanArea = document.querySelector('.scan-area');
let stream;
let scanning = false;
let flashEnabled = false;
navigator.mediaDevices.getUserMedia({ video: { facingMode: "environment" } })
.then(s => {
stream = s;
video.srcObject = stream;
video.play();
scanning = true;
requestAnimationFrame(scan);
})
.catch(err => {
console.error("無法訪問攝像頭:", err);
});
function scan() {
if (scanning) {
const canvas = overlay.getContext('2d');
const videoWidth = video.videoWidth;
const videoHeight = video.videoHeight;
overlay.width = videoWidth;
overlay.height = videoHeight;
canvas.drawImage(video, 0, 0, videoWidth, videoHeight);
const code = jsQR(imageData.data, imageData.width, imageData.height);
if (code) {
scanning = false;
handleScanResult(code.data);
} else {
requestAnimationFrame(scan);
}
}
}
function handleScanResult(data) {
alert("掃描結果:" + data);
}
manualInputBtn.addEventListener('click', function() {
});
flashBtn.addEventListener('click', function() {
});
四、 總結
通過以上步驟,我們成功地使用 JavaScript 在網頁端實現了二維碼掃描功能。該功能可以廣泛應用于各種場景,例如:
移動支付: 用戶可以使用手機掃描網頁上的二維碼完成支付。
產品溯源: 用戶可以掃描產品上的二維碼,查看產品信息、生產日期、物流信息等。
活動簽到: 用戶可以使用手機掃描二維碼完成活動簽到。
轉自https://www.cnblogs.com/geekcjj/p/18352006
該文章在 2024/8/12 9:38:54 編輯過