当前位置:   article > 正文

H5实现手机扫描二维码识别_h5扫码识别

h5扫码识别

主要依赖于二维码解析库jsQR,它是一个纯javascript的二维码阅读库。 这个库接收原始图像,并将定位、提取和解析其中发现的任何QR码。

jsQR 被设计成一个完全独立的库,用于扫描二维码。按照设计,它不包含任何特定于平台的代码。这使它可以轻松扫描前端网络摄像头流、用户上传的图像,或用作后端 Node.js 进程的一部分。

主要用法

npm install jsqr --save

// ES6 import
import jsQR from "jsqr";

const code = jsQR(imageData, width, height, options?);
if (code) {
  console.log("Found QR code", code);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

其中,imageData数据格式与表示元素区域的底层像素数据的ImageData接口相同。

大致原理步骤:

  1. h5摄像头mediaDevices获取stream流
  2. video.src = 1
  3. canvas.drawImage(2)
  4. ctx.getImageData(3)
  5. jsQR(4)

具体代码

<script setup>
import {
    ref,
    nextTick,
    onMounted,
    onBeforeUnmount
} from 'vue';
import jsQR from 'jsqr';
import './index.scss';

let video = ref(null);
let canvas = ref(null);
let ctx = null;
let videoWH = {
    width: document.documentElement.clientWidth,
    height: document.documentElement.clientHeight
};

onMounted(async () => {
    await nextTick();
    init();
});
onBeforeUnmount(() => {
    fullStop();
});
const tick = () => {
    if (
        video.value &&
        video.value.readyState === video.value.HAVE_ENOUGH_DATA
    ) {
        canvas.value.height = videoWH.height;
        canvas.value.width = videoWH.width;
        ctx.drawImage(
            video.value,
            0,
            0,
            canvas.value.width,
            canvas.value.height
        );
        const imageData = ctx.getImageData(
            0,
            0,
            canvas.value.width,
            canvas.value.height
        );
        let code = false;
        try {
            code = jsQR(imageData.data, imageData.width, imageData.height);
        } catch (e) {
            console.error(e);
        }
        if (code) {
            found(code.data);
        }
    }
    run();
};
// 初始化
const init = () => {
    ctx = canvas.value.getContext('2d');
    const facingMode = { exact: 'environment', video: true };
    const handleSuccess = (stream) => {
        video.value.src = stream;
        video.value.playsInline = true;
        const playPromise = video.value.play();
        playPromise.then(run);
    };
    navigator.mediaDevices.getUserMedia({ video: { facingMode } })
        .then(handleSuccess)
        .catch(() => { 
            errorCaptured(error); 
        });
    }
};
const run = () => {
    requestAnimationFrame(tick);
};
const found = (code) => {
    codeScanned(code);
    stop()
};
// 完全停止
const stop = () => {
    if (video.value && video.value.srcObject) {
        video.value.srcObject.getTracks().forEach((t) => t.stop());
    }
};
const codeScanned = (code) => {
    setTimeout(() => {
        alert(`扫码解析成功: ${code}`);
    }, 200);
};
const errorCaptured = (error) => {
    console.error(error);
};
</script>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/964078
推荐阅读
相关标签
  

闽ICP备14008679号