前端实现扫一扫,扫描二维码(VUE,H5);jsQR,zxing两种方式

文章介绍

        这里使用了jsQR和zxing两种方式,分别在普通的H5和vue中使用,文章附上完整demo和一些注意事项

注意事项

        这里H5也好,vue也好,如果想要部署到服务器上,需要用https协议,否则无法使用。本地启动项目的时候,很多人在vue中无法实现该效果,那是因为需要我们从localhost路径打开,否则也无法使用摄像头

vue 或 H5,使用jsQR

使用jsQR这个JS库

这里附上这个库的地址:https://s3.gendome.net/activity/js/jsQR.js

先把上面这个JS文件下载下来,比如我这里命名为jsQR.js,使用我这样的写法

H5中

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script src="./jsQR.js"></script>
</head><body><video style="display: none;" id="video"></video><canvas style="width: 100%; height: 100%;" id="canvas"></canvas><canvas style="display: none;" id="2d"></canvas>
</body>
<script type="text/javascript">var video = document.createElement("video");var canvasElement = document.getElementById("canvas");var canvas = canvasElement.getContext("2d");// 尝试打开手机上安装后置摄像头navigator.mediaDevices.getUserMedia({video: { facingMode: "environment" }}).then(function (stream) {video.srcObject = stream;// 阻止IOS视频全屏video.setAttribute("playsinline", true);video.play();requestAnimationFrame(tick);});function tick() {if (video.readyState === video.HAVE_ENOUGH_DATA) {canvasElement.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);// QR码解析var code = jsQR(imageData.data,   // 图像数据imageData.width,  // 宽度imageData.height, // 高度{inversionAttempts: "dontInvert",});if (code) {console.log(code.data);}}requestAnimationFrame(tick);}
</script></html>

vue中

<template><div><video style="display: none" id="video"></video><canvas style="width: 100vw; margin-top: 13vw" id="canvas"></canvas><canvas style="display: none" id="2d"></canvas> </div>
</template>
<script setup>
import { ref, onMounted} from "vue";
import "@/utils/jsQR.js"; // 添加关闭摄像头的函数const stopMediaTracks = () => {if (streams) {streams.getTracks().forEach((track) => track.stop());}video.srcObject = null;
};
const streams = ref(null); // 初始化 stream 变量onMounted(() => {var video = document.createElement("video");var canvasElement = document.getElementById("canvas");var canvas = canvasElement.getContext("2d");console.log(navigator.mediaDevices);// 尝试打开手机上安装后置摄像头navigator.mediaDevices.getUserMedia({video: { facingMode: "environment" },}).then(function (stream) {streams.value = stream;video.srcObject = stream;// 阻止IOS视频全屏video.setAttribute("playsinline", true);video.play();requestAnimationFrame(tick);});function tick() {if (video.readyState === video.HAVE_ENOUGH_DATA) {canvasElement.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);// QR码解析var code = jsQR(imageData.data, // 图像数据imageData.width, // 宽度imageData.height, // 高度{inversionAttempts: "dontInvert",});if (code) {console.log(code.data);alert(code.data);}}requestAnimationFrame(tick);} 
});
</script>

优点:

jsQR是一个完全独立的javascript脚本库,可以用于扫描QR码。

它不限制于任何平添,可以轻松地扫描前端网络摄像头流、用户上传的图像。

如果使用jsQR扫描网络摄像头流,则需要从视频流中提取图像数据。接着可以将其传递给jsQR。

VUE中,使用zxing库

zxing 是一款由用 Typescript 编写的一维/二维条码图像处理库,即条形码与二维码,它是由 Java 版本 ZXing 库移植而来的。

git地址:https://github.com/zxing-js/library

在线案例:ZXing TypeScript | Demo & Examples

首先安装:

npm install @zxing/library -S

vue文件中:

<template><button @click="scanner">扫码</button>&nbsp;<button @click="close">关闭</button>&nbsp;<div class="container"><video id="video"></video><div v-if="mask" class="mask"></div></div><h4>识别到的信息:<span style="color: red;">{{ message }}</span></h4>
</template><script setup>
import { onMounted, ref } from "vue";
import { BrowserMultiFormatReader } from '@zxing/library';let message = ref('');
let codeReader = null;
let selectedDeviceId = '';
let mask = ref(false);function init() {// 识别和处理多种常见的条形码和二维码格式codeReader = new BrowserMultiFormatReader();// 获取当前设备上可用的视频输入设备列表codeReader.getVideoInputDevices().then(videoInputDevices => {if (videoInputDevices.length > 1) {// 后缀摄像头(手机)selectedDeviceId = videoInputDevices[1].deviceId;}else {// 前置摄像头selectedDeviceId = videoInputDevices[0].deviceId;}})
}onMounted(() => {init();
})function scanner() {mask.value = true// 自动打开指定的视频输入设备,并实时对视频流中的每一帧图像进行条形码和二维码的解码操作,此方法不是只进行一次解码尝试,而是在视频流持续传输的过程中,不断地对每一帧图像进行解码分析codeReader.decodeFromVideoDevice(selectedDeviceId, 'video', (result, err) => {if (result) {message.value = result.text;}if (err) {}})
}
function close() {codeReader.reset();message.value = '';mask.value = false;
}
</script><style>
.container {width: 100%;height: 60vh;position: relative;margin-top: 10px;overflow: hidden;
}
.container > video {width: 100%;height: 100%;object-fit: cover;
}
.mask {position: absolute;left: 15%;top: 20%;max-width: 100%;width: 70%;height: 60%;border-radius: 2px;outline: rgba(0, 0, 0, .25) solid 20vmax;
}
</style>

收尾

        在调用摄像头的时候,当前页面或者组件销毁时,一定要记得关闭摄像头,否则在某些设备上,摄像头会一直保持开启状态,如果后面我发现了更好用,更方便的组件,我也会继续补充到当前文章中

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/64212.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 事务与锁机制:确保数据一致性

一、MySQL 事务与锁机制概述 &#xff08;一&#xff09;事务的概念与 ACID 特性简述 在数据库操作中&#xff0c;事务是一种极为重要的机制&#xff0c;它可以看作是一组数据库操作命令的集合。简单来说&#xff0c;事务将这些命令整合为一个不可分割的整体&#xff0c;它们…

2024.12.14 TCP/IP 网络模型有哪几层?

2024.12.14 TCP/IP 网络模型有哪几层? 2024.12.14 今天周六 看到大伙都在考六级&#xff0c;我来复盘小林coding的计算机网络的知识点&#xff1a; TCP/IP 网络模型有哪几层? 问大家&#xff0c;为什么要有 TCP/IP 网络模型? 对于同一台设备上的进程间通信&#xff0c;有…

一次Mysql查询踩坑经历(查询索引失效问题)

1、之前的sql建表脚本 CREATE TABLE crm_driver (id bigint(22) NOT NULL AUTO_INCREMENT COMMENT 主键,clue_id bigint(20) NOT NULL COMMENT 线索表id,driver_name varchar(128) NOT NULL COMMENT 试驾人姓名,driver_phone varchar(32) NOT NULL COMMENT 试驾人手机号,drive…

从 SSM 视角剖析校园一卡通密钥管理系统的技术架构演进

第2章 开发环境与技术 开发校园一卡通密钥管理系统需要搭建编程的环境&#xff0c;也需要通过调查&#xff0c;对各个相关技术进行分析&#xff0c;选取适合本系统开发的技术与工具。 2.1 MYSQL数据库 题目确定了是一个应用程序之后&#xff0c;就开始按部就班的进行设计与分析…

Vue3之响应式系统详解

Vue3中的响应式系统是其核心功能之一&#xff0c;它使得数据变化能够自动触发视图更新&#xff0c;从而简化了开发过程&#xff0c;提高了开发效率。本文将详细阐述Vue3中的响应式系统&#xff0c;包括其核心概念、工作原理、实现方式、应用场景以及优势。同时&#xff0c;本文…

RabbitMQ中的Publish-Subscribe模式

在现代分布式系统中&#xff0c;消息队列&#xff08;Message Queue&#xff09;是实现异步通信和解耦系统的关键组件。RabbitMQ 是一个功能强大且广泛使用的开源消息代理&#xff0c;支持多种消息传递模式。其中&#xff0c;Publish/Subscribe&#xff08;发布/订阅&#xff0…

【iOS】OC高级编程 iOS多线程与内存管理阅读笔记——自动引用计数(四)

目录 ARC规则 规则 对象型变量不能作为C语言结构体的成员 显式转换id和void* 属性 数组 ARC规则 规则 在ARC有效的情况下编译源代码必须遵守一定的规则&#xff1a; 主要解释一下最后两条 对象型变量不能作为C语言结构体的成员 要把对象型变量加入到结构体成员中时&a…

C++小白实习日记——Pollnet,Efvi,UDP,数据类型转换(上)

上周主要是熟悉了一下公司内部一些自定义结构体对应的数据类型&#xff0c;要求&#xff1a;读取文件&#xff0c;将文件中数据转化为定义的结构体中的数据类型&#xff0c;按照时间进行排序&#xff0c;用UDP发送数据&#xff1b;在另一台服务器上接收数据&#xff0c;按照定义…

路由引入问题(双点双向路由回馈问题)

简介 总所周知&#xff0c;路由引入import又称路由重分发redistribute&#xff0c;为了解决不同路由协议进程间路由信息不互通而使用的技术&#xff0c;由于不同路由协议的算法、机制、开销等因素的差异&#xff0c;它们之间无法直接交换路由信息。因此&#xff0c;路由引入技…

26. Three.js案例-自定义多面体

26. Three.js案例-自定义多面体 实现效果 知识点 WebGLRenderer WebGLRenderer 是 Three.js 中用于渲染场景的主要类。它支持 WebGL 渲染&#xff0c;并提供了多种配置选项。 构造器 new THREE.WebGLRenderer(parameters) 参数类型描述parametersObject可选参数对象&…

【在Linux世界中追寻伟大的One Piece】HTTP Session

目录 1 -> 引入HTTP Session 1.1 -> 定义 1.2 -> 工作原理 1.3 -> 安全性 1.4 -> 超时和失效 1.5 -> 用途 2 -> 模拟session行为 3 -> 实验测试session 1 -> 引入HTTP Session 1.1 -> 定义 HTTP Session是服务器用来跟踪用户与服务器交…

Docker-Dockerfile、registry

Dockerfile 一、概述 1、commit的局限 很容易制作简单的镜像&#xff0c;但碰到复杂的情况就十分不方便&#xff0c;例如碰到下面的情况&#xff1a; 需要设置默认的启动命令需要设置环境变量需要指定镜像开放某些特定的端口 2、Dockerfile是什么 Dockerfile是一种更强大的镜…

蓝桥杯刷题——day1

蓝桥杯刷题——day1 题目一题干题目解析代码 题目二题干题目解析代码 题目一 题干 给定一个字符串 s &#xff0c;验证 s 是否是 回文串 &#xff0c;只考虑字母和数字字符&#xff0c;可以忽略字母的大小写。本题中&#xff0c;将空字符串定义为有效的 回文串 。 题目链接&a…

【多模态文档智能】OCR-free感知多模态大模型技术链路及训练数据细节

目前的一些多模态大模型的工作倾向于使用MLLM进行推理任务&#xff0c;然而&#xff0c;纯OCR任务偏向于模型的感知能力&#xff0c;对于文档场景&#xff0c;由于文字密度较高&#xff0c;现有方法往往通过增加图像token的数量来提升性能。这种策略在增加新的语言时&#xff0…

如何在 Ubuntu 22.04 上使用 Fail2Ban 保护 SSH

前言 SSH&#xff0c;这玩意儿&#xff0c;简直是连接云服务器的标配。它不仅好用&#xff0c;还很灵活。新的加密技术出来&#xff0c;它也能跟着升级&#xff0c;保证核心协议的安全。但是&#xff0c;再牛的协议和软件&#xff0c;也都有可能被攻破。SSH 在网上用得这么广&…

供应链系统设计-中台系统设计系列(三)- 好中台的标准之稳定原则

概述 在上一篇供应链系统设计-中台系统设计系列&#xff08;二&#xff09;- 好中台的标准之复用原则中&#xff0c;我们以复用原则为主&#xff0c;讨论了以下3点&#xff1a; 前台业务效率提升&#xff1a;好的中台能够显著提高前台业务的效率&#xff0c;通过将前台业务中通…

CTF 攻防世界 Web: FlatScience write-up

题目名称-FlatScience 网址 index 目录中没有发现提示信息&#xff0c;链接会跳转到论文。 目前没有发现有用信息&#xff0c;尝试目录扫描。 目录扫描 注意到存在 robots.txt 和 login.php。 访问 robots.txt 这里表明还存在 admin.php admin.php 分析 在这里尝试一些 sql…

axios请求拦截器和响应拦截器,封装naive-ui的 Loading Bar加载条和useMessage消息提示

接之前的博客设计从0开始边做边学&#xff0c;用vue和python做一个博客&#xff0c;非规范化项目&#xff0c;怎么简单怎么弄&#xff0c;跑的起来有啥毛病解决啥毛病&#xff08;三&#xff09;&#xff0c;目前已经完成了基本的功能demo&#xff0c;但是请求接口不可能每个页…

Blue Ocean 在Jenkins上创建Pipeline使用详解

BlueOcean是Jenkins的一个插件,它提供了一套可视化操作界面来帮助用户创建、编辑Pipeline任务。以下是对BlueOcean中Pipeline操作的详细解释: 一、安装与启动BlueOcean 安装:在Jenkins的“系统管理”->“插件管理”->“可选插件”中搜索“BlueOcean”,然后点击“Ins…

opencv——识别图片颜色并绘制轮廓

图像边缘检测 本实验要用到Canny算法&#xff0c;Canny边缘检测方法常被誉为边缘检测的最优方法。 首先&#xff0c;Canny算法的输入端应为图像的二值化结果&#xff0c;接收到二值化图像后&#xff0c;需要按照如下步骤进行&#xff1a; 高斯滤波。计算图像的梯度和方向。非极…