Vue?調(diào)用攝像頭掃描條碼功能實(shí)現(xiàn)代碼
以下是一個(gè)基于 Vue.js 的頁(yè)面代碼示例,用于調(diào)用攝像頭并掃描條碼。我們將使用 jsQR 庫(kù)來(lái)解析二維碼(或條形碼),這是一個(gè)輕量級(jí)的 JavaScript 庫(kù)。
實(shí)現(xiàn)步驟:
- 安裝依賴:需要引入
jsQR庫(kù)。 - 調(diào)用攝像頭:通過(guò)
navigator.mediaDevices.getUserMedia獲取攝像頭視頻流。 - 解析條碼:使用
jsQR對(duì)視頻幀進(jìn)行解析。
代碼實(shí)現(xiàn)
1. 安裝依賴
在項(xiàng)目中安裝 jsQR:
npm install jsqr
2. Vue 頁(yè)面代碼
以下是完整的 Vue 頁(yè)面代碼:
<template>
<div class="scanner-container">
<h2>條碼掃描</h2>
<video ref="video" autoplay playsinline></video>
<canvas ref="canvas" style="display: none;"></canvas>
<p v-if="barcode">掃描結(jié)果: {{ barcode }}</p>
<button @click="startScanner" :disabled="isScanning">開始掃描</button>
<button @click="stopScanner" :disabled="!isScanning">停止掃描</button>
</div>
</template>
<script>
import jsQR from "jsqr";
export default {
data() {
return {
isScanning: false,
barcode: null,
videoStream: null,
};
},
methods: {
async startScanner() {
try {
// 請(qǐng)求訪問(wèn)攝像頭
this.videoStream = await navigator.mediaDevices.getUserMedia({
video: { facingMode: "environment" }, // 使用后置攝像頭
});
this.$refs.video.srcObject = this.videoStream;
// 等待視頻元數(shù)據(jù)加載完成
await new Promise((resolve) => {
this.$refs.video.onloadedmetadata = resolve;
});
this.isScanning = true;
this.scanBarcode(); // 開始掃描
} catch (error) {
console.error("無(wú)法訪問(wèn)攝像頭:", error);
alert("無(wú)法訪問(wèn)攝像頭,請(qǐng)檢查權(quán)限設(shè)置!");
}
},
stopScanner() {
if (this.videoStream) {
const tracks = this.videoStream.getTracks();
tracks.forEach((track) => track.stop());
this.videoStream = null;
this.isScanning = false;
}
},
scanBarcode() {
if (!this.isScanning) return;
const video = this.$refs.video;
const canvas = this.$refs.canvas;
const context = canvas.getContext("2d", { willReadFrequently: true }); // 添加此選項(xiàng)
// 設(shè)置 canvas 尺寸與視頻一致
canvas.width = video.videoWidth;
canvas.height = video.videoHeight;
// 繪制視頻幀到 canvas
context.drawImage(video, 0, 0, canvas.width, canvas.height);
// 獲取圖像數(shù)據(jù)
const imageData = context.getImageData(0, 0, canvas.width, canvas.height);
// 使用 jsQR 解析條碼
const code = jsQR(imageData.data, imageData.width, imageData.height);
if (code) {
this.barcode = code.data; // 保存掃描結(jié)果
this.stopScanner(); // 停止掃描
} else {
// 繼續(xù)掃描下一幀
requestAnimationFrame(this.scanBarcode);
}
},
},
beforeDestroy() {
this.stopScanner(); // 離開頁(yè)面時(shí)停止攝像頭
},
};
</script>
<style scoped>
.scanner-container {
text-align: center;
margin-top: 20px;
}
video {
width: 100%;
max-width: 400px;
margin: 20px auto;
border: 1px solid #ccc;
}
button {
margin: 10px;
padding: 10px 20px;
font-size: 16px;
cursor: pointer;
}
</style>功能說(shuō)明
開始掃描:
- 點(diǎn)擊“開始掃描”按鈕后,頁(yè)面會(huì)請(qǐng)求訪問(wèn)設(shè)備攝像頭,并顯示實(shí)時(shí)視頻流。
- 使用
jsQR對(duì)每一幀視頻進(jìn)行解析,直到成功識(shí)別條碼。
停止掃描:
- 點(diǎn)擊“停止掃描”按鈕后,攝像頭會(huì)被關(guān)閉,掃描停止。
掃描結(jié)果顯示:
- 當(dāng)成功解析條碼后,掃描結(jié)果會(huì)顯示在頁(yè)面上,并自動(dòng)停止掃描。
注意事項(xiàng)
瀏覽器兼容性:
- 需要在支持
getUserMedia的現(xiàn)代瀏覽器中運(yùn)行(如 Chrome、Edge)。 HTTPS環(huán)境下才能正常使用攝像頭。
權(quán)限問(wèn)題:
- 用戶需授予攝像頭訪問(wèn)權(quán)限,否則無(wú)法正常工作。
性能優(yōu)化:
- 如果掃描速度較慢,可以調(diào)整
canvas的分辨率以提高性能。
到此這篇關(guān)于Vue 調(diào)用攝像頭掃描條碼的文章就介紹到這了,更多相關(guān)Vue 調(diào)用掃描條碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決vue單頁(yè)路由跳轉(zhuǎn)后scrollTop的問(wèn)題
今天小編就為大家分享一篇解決vue單頁(yè)路由跳轉(zhuǎn)后scrollTop的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
vue3路由跳轉(zhuǎn)params傳參接收不到的解決辦法
這篇文章主要給大家介紹了關(guān)于vue3路由跳轉(zhuǎn)params傳參接收不到的解決辦法,Vue3是目前前端開發(fā)中非常流行的框架之一,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06
Nuxt 嵌套路由nuxt-child組件用法(父子頁(yè)面組件的傳值)
這篇文章主要介紹了Nuxt 嵌套路由nuxt-child組件用法(父子頁(yè)面組件的傳值),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11
vue踩坑記錄之?dāng)?shù)組定義和賦值問(wèn)題
這篇文章主要給大家介紹了關(guān)于vue踩坑記錄之?dāng)?shù)組定義和賦值問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用vue具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
關(guān)于vue3.0使用axios報(bào)錯(cuò)問(wèn)題
這篇文章主要介紹了vue3.0使用axios報(bào)錯(cuò)問(wèn)題記錄,vue-cli3.0安裝插件的時(shí)候要注意區(qū)分vue-cli2.0的命令,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08

