js调用摄像头解析二维码

html/js 实现PC端网页调用摄像头扫描解析二维码 首先是二维码解析库,下载链接:https://pan.baidu.com/s/1MbVb_QqAjIIlAk9OEXy-6w  提取码:zip4    下面代码写在html中:   <script type="text/javascript" src="src/qrcode/grid.js"></script> <script type="text/javas... 阅读详情

因为需求做一个扫码功能,发觉网上的资料不是不能用就是不完善,遂借鉴各种资料把这个功能搞出来了。

注意要点:

    1、需要https验证通过才可以,

    2、仅支持安卓端,iOS理论上也没问题的 但是 就是摄像头是前置摄像头没办法改,如果谁研究出来了,求告知

逻辑流程:网上给出了各种借助照相机的办法,方法很多,我觉得最合适我的属于,js获取摄像头设备,然后获取打开摄像头,获取视频流,输出到video,设定定时器,定时将视频流放到画布,设定定时器,利用qccode扫描解码画布,扫描成功,停止定时器,继续之后操作,结束

遇到的困难:

    1、iOS无法后置摄像头问题

    2、扫码识别率太低,解决办法:修改生成二维码宽高设置,模式修改,给二维码加白色边框

引入文件:https://pan.baidu.com/s/1tcijinlX2DGMkqv6WGaArw 提取码:9utf

<html>

<head>

  <meta charset="UTF-8">

  <meta name="viewport" content="width=device-width, initial-scale=1.0">

  <meta http-equiv="X-UA-Compatible" content="ie=edge">

  <title>教博会门票扫描器</title>

  <script src="https://cdn.bootcss.com/vConsole/3.2.0/vconsole.min.js"></script>

  <script type="text/javascript" src="js/llqrcode.js"></script>

  <script>

    let vConsole = new VConsole();

  </script>

  <style>

    #scan {

      position: fixed;

      bottom: 5px;

      left: 50%;

      transform: translateX(-50%);

      display: block;

      text-decoration: none;

      margin: 0 auto;

      width: 100%;

      line-height: 2.5rem;

      text-decoration: none;

      color: #fff;

      text-align: center;

      border-radius: 20px 20px 20px 20px;

      font-size: .8rem;

      background-color: #0E76E1;

    }

    #qr-canvas {

      margin: 0px auto;      

      max-width: 300px;

    }

    #video{

      margin: 0px auto;

    }

  </style>

</head>

 

<body>

  

  <div id="output"></div>

  <!-- 由于llqrcode.js中写死了id,所以id必须为qr-canvas -->

  <video id="video" muted autoplay playsinline width="300" height="200"></video>

  <canvas id="qr-canvas" style="display:none;"></canvas>

  <a href="javascript:;" id="scan">扫码</a>

  <script type="text/javascript">

    const Scan = {

      videoInputDevice: [],

      videoElement: document.getElementById("video"),

      canvasElement: document.getElementById("qr-canvas"),

      decodeTimer: null,

      canvasTimer: null,

      canvasContext: document.getElementById("qr-canvas").getContext("2d"),

      // 获取到的媒体设备

      gotDevices (deviceInfos) {

        let that = this;

        for (let i = 0; i !== deviceInfos.length; ++i) {

          let deviceInfo = deviceInfos[i];

          if (deviceInfo.kind === 'audioinput') {

            // 音频设备

          } else if (deviceInfo.kind === 'videoinput') {

            // 视频设备

            that.videoInputDevice.push(deviceInfo);

          } else {

            // 其他设备

            console.log('Found one other kind of source/device: ', deviceInfo);

          }

        }

      },

      getStream () {

        let that = this;

        if (window.stream) {

          window.stream.getTracks().forEach((track) => {

            track.stop();

          });

        }

        // if(that.isIOS){

        //     let constraints = {

        //         video: { facingMode: { exact: "environment" } }

        //       };

        //     console.log('3: ', constraints);

        //     // let constraints = {

        //     //   video: {

        //     //     // environment表示后置摄像头

        //     //     // user表示前置摄像头

        //     //     facingMode: ("environment")

        //     //   }

        //     // };

        // }else{

            let constraints = {

              // 包含audio 可声明音频设备调用

              // 声明视频设备调用

              // video: true

              video: {

                deviceId: {

                  // [1].deviceId 表示后置摄像头,默认开启的是前置摄像头

                  exact: that.videoInputDevice[1].deviceId

                }

              }

            };

        // }

 

        // 视频设备初始化

        navigator.mediaDevices.getUserMedia(constraints).then(that.gotStream.bind(that)).catch(that.handleError.bind(that));

        that.captureToCanvas();

        that.decode();

      },

 

      // 解码

      decode () {

        let that = this;

        try {

          qrcode.decode();

        } catch (e) {

          console.log('1:'+e);

        };

        that.decodeTimer = setTimeout(that.decode.bind(that),100); // 解码频率为100毫秒一次

      },

 

      //将视频流放到画布

      captureToCanvas () {

        let that = this;

        try {

          // 根据视频大小设置canvas大小

          let w = that.videoElement.videoWidth;

          let h = that.videoElement.videoHeight;

          that.canvasElement.width = w;

          that.canvasElement.height = h;

          that.canvasContext.drawImage(that.videoElement, 0, 0, w, h);

        } catch (e) {

          console.log(e);

        };

        // 100毫秒绘制一次

        that.canvasTimer = setTimeout(that.captureToCanvas.bind(that),100);

      },

 

      handleError (error) {

        console.log('Error: ', error);

      },

 

      gotStream (stream) {

        let that = this;

        window.stream = stream; // make stream available to console

        that.videoElement.srcObject = stream;

      },

      isIOS(){

        var u = navigator.userAgent;

        var IOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端

        if(IOS){

            return true;

        }else{

            return false;

        }

      },

      init () {

        let that = this;

        // API参考

        // https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices/enumerateDevices

        // 先获取设备列表,方便调用后置摄像头

        let devices = navigator.mediaDevices.enumerateDevices().then(that.gotDevices.bind(that));

        document.querySelector('#scan').addEventListener('click', () => {

          document.getElementById('output').innerHTML = '';

          that.videoElement.style.display = 'block';

          // that.canvasElement.style.display = 'block';

          that.videoElement.play();

            

          devices.then(that.getStream.bind(that)).catch(that.handleError.bind(that));

 

          that.canvasContext.clearRect(0, 0, 300, 200);

          //结果回调

          qrcode.callback = (e) => {

            // 清除画布,停止摄像头

            clearTimeout(that.decodeTimer);

            clearTimeout(that.canvasTimer);

            that.canvasContext.clearRect(0, 0, 300, 200);

            if (window.stream) {

              window.stream.getTracks().forEach((track) => {

                track.stop();

              });

            }

            that.videoElement.style.display = 'none';

            that.canvasElement.style.display = 'none';

            if(e.indexOf("http")!=-1){

                window.location.href=e+'&token=xxxx';

            }else {

              document.getElementById('output').innerHTML = '结果:' + e;

            }

          }

        });

      }

    };

    Scan.init();

  </script>

</body>

</html>

手机移动端-纯js浏览器h5调用摄像头扫描识别解析 条形码+二维码 一、场景 h5原生js 浏览器端解决识别二维码条形码功能; 不借助Hbuilder.需要自己打包成APP,比如用Hbuilder打包,浏览器端项目h5无打包成app部署X不采用 不借助微信扫一扫,调用微信js-jdk有多麻烦,还要认证服务号,也不适用其它浏览器打开X不采用 二、思路 1.思路一:input(相机拍照)+条形码或二维码识别js支持库 通过h5-input[camera]调用相机进行拍照成图片,通过条形码等识别库解析出数据; <input @cha... 阅读详情

相关推荐

网页实现二维码扫描和解析

在做一个B/S模式的超市管理系统时,想要实现用户的自助结账服务。这无疑需要使用扫码功能,在网上找了很多网页实现二维码扫描资料,但都没有能够很完整的实现。最后找到了一个博客给出了部分代码和重要的指导思想,单由于众多原因博主不能公布源代码,所以我就根据他给出的思想实现了扫码的整个过程。 ...

qq_40561126的博客 2831

js实现web页面扫描二维码(html5-qrcode)

js实现web页面扫描二维码(html5-qrcode)

weixin_34403976的博客 4839

H5扫码功能实战:如何在微信和原生浏览器中实现二维码解析(附完整代码)

本文详细介绍了H5扫码功能的跨平台实现方案,重点解析了在微信和原生浏览器中调用摄像头、获取图片并进行二维码解析的技术难点。通过对比不同技术方案的优缺点,提供了完整的代码实现和性能优化建议,帮助开发者快速构建高效稳定的H5扫码系统。

weixin_30300225的博客 421

Vue,H5,JS网页调用摄像头解析二维码 -- 好长的标题

做项目的时候废了好大劲找的,第一次,没什么经验,好不容易做出来,记录一下,话不多说,开列关键点 关键点一 https 网页协议必须是https的,因为调用权限的某些(没太搞懂,我就不多说了,可以自己百度一下)限制,必须是在安全协议下,才可以调用这些方法 关键点二 qrcode.js 网络上应该都有资源(找到对的资源),同样是叫qrcode.js,内容还真的不一样,,,找到用来解析的qrcode....

网易游戏真辣鸡 3042

如何为微信小程序添加二维码扫描和识别功能

然后调用wx.scanCode()方法进行扫描,当扫描成功后,控制台会输出二维码的内容,并调用wx.hideLoading()方法隐藏加载中的提示框。在小程序的components目录中创建一个名为qrcode的文件夹,并在该文件夹中创建一个名为qrcode.wxml的文件和一个名为qrcode.wxss的文件。要在小程序中展示解析后的二维码内容,需要在相机扫描成功后调用setData()方法来更新qrCodeData变量,并在相机扫描失败后设置qrCodeData为null。

吃不胖. 1205

jsqrcode 通过Web摄像头识别QR二维码

jsqrcode (1)基于JavaScript&ZXing实现 (2)通过Web摄像头或文件输入有效识别QR二维码 (3)可大幅提高开发效率

纯浏览器通过摄像头识别二维码

先把做好的demo发出来,demo功能是摄像头扫二维码,将解码出来的所有字符串列出: 纯浏览器通过摄像头识别二维码demo 支持摄像头的浏览器及版本较少,以下几款浏览器笔者试了一下是不支持的: 华为浏览器、百度应用、微信浏览器 所以笔者新下了一个Firefox浏览器,打开上面的demo,才算扫码成功。其他浏览器的支持版本网上有,这里不再赘述,搜一下getUserMedia即可。 识别效果...

qq_27592745的博客 1236

JS调用安卓手机摄像头扫描二维码

主要为大家详细介绍了JS调用安卓手机摄像头扫描二维码,并用JS解析二维码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

qrcode.js 解析二维码(源码) 复制的

qrcode.js 解析二维码(源码) 复制的 var _aa = {}; _aa._ab = function(f, e) { var d = qrcode.width; var b = qrcode.height; var c = true; for (var g = 0; g < e.length && c; g += 2) { var a = Math.floor(e[g]); var h = Math.floor(e[g + 1]); if (a &lt

z_jing0927的博客 1万+

Flannel,Calico 和 Cilium 之间有哪些优缺点和差别?

例如,在一个多租户的容器集群中,可以通过Calico为不同租户的容器设置精细的访问控制策略,确保每个租户的资源安全。例如,在设置复杂的网络策略和BGP路由时,需要对网络概念和Calico的配置语法有比较深入的了解。它可以根据容器的标签、服务等信息来定义访问规则,并且可以实现更加细粒度的网络安全策略,如HTTP层的策略。性能损耗:在overlay网络模式下(如VXLAN),由于需要对数据包进行额外的封装和解封装操作,会带来一定的性能损耗,尤其是在高流量的场景下,这种性能损耗可能会更加明显。

chinansa的博客 1529

基于aarch64分析kernel源码 六:kernel_init进程(1号进程)、kthreadd进程(2号进程)

kernel_init进程(1号进程)、kthreadd进程(2号进程)分析

OnlyLove_的博客 764

JS调用安卓手机摄像头扫描二维码并用JS解析二维码

项目要求:使用H5模仿微信扫一扫付款功能经过一系列的查找最后发现可以使用 JS调用手机摄像头然后用画布把当前摄像头的数据转成Base64的png图片,经过QrCode直接再本地识别。优点:兼容大多数浏览器本地识别不占用服务端资源代码比较简单只有一个页面&lt;html lang="ZH-CN"&gt; &lt;head&gt; &lt;meta charset="utf-8"&gt; &l...

老四的博客 2万+

.ipynb文件深度解析:从JSON结构到Jupyter Notebook高效使用指南

在Python开发与数据处理领域,交互式编程正成为探索数据与验证思路的高效方式。Jupyter Notebook作为最流行的交互式环境之一,其默认文件格式.ipynb本质是一个基于JSON的文本文件,内部通过单元格组织代码、说明文字与运行结果。理解其JSON结构,不仅有助于掌握Notebook的存储原理,更能为文件损坏修复、版本控制与自动化转换提供基础。依托对单元格类型、魔法命令及输出可视化的熟练运用,数据分析和数据可视化流程可以变得更为流畅。同时,借助VS Code、nbconvert等工具,开发者能将.

weixin_28839629的博客 350

纯js浏览器h5调用摄像头扫描识别解析 条形码+二维码

一、场景 手机移动端-原生js 浏览器h5 解决 识别二维码 条形码功能; 不借助Hbuilder.需要自己打包成APP,比如用Hbuilder打包,浏览器端项目h5 无打包成app部署 X 不采用 不借助微信扫一扫,调用微信js-jdk有多麻烦,还要认证服务号,也不适用 其它浏览器打开 X 不采用 二、思路 1.思......

weixin_42684136的博客 2万+

ldpc编解码器设计与仿真

计算校验节点到变量节点的消息 m_{c \to v}=2 \cdot atanh(\prod_{v’ \in N©\setminus v}tanh(\frac{m_{v’ \to c}}{2}))。计算变量节点到校验节点的消息 m_{v \to c}=L_{v,0}+\sum_{c’ \in M(v)\setminus c}m_{c’ \to v}。◦ 对于每个变量节点 v,计算最终 LLR 值 L_{v,f}=L_{v,0}+\sum_{c \in M(v)}m_{c \to v}。

youngerwang的博客 809

RK3568-Linux-麒麟系统---更新制作麒麟rootfs

RK3568 Linux系统 麒麟国产麒麟镜像

qiuzw2003的博客 5360

HTML+两个JS实现 调用摄像头并解析二维码

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33682790的博客 1709

【系统架构设计师】论文模板样例:论软件系统架构风格

本人于年月参与项目,该系统为*,在该项目组中我担任系统架构师岗位,主要负责系统整体架构设计。本文以该车联网项目为例,主要讨论了软件架构风格在该项目中的具体应用。底层架构风格我们采用了虚拟机风格中的解释器,因该公交共有几十种不同的数据协议,使用解释器风格可以满足整车数据协议兼容性需求;中间层关于应用层的数据流转采用了独立构件风格中的隐式调用,以减低系统间耦合度、简化软件架构,提高可修改性方面的架构属性;应用系统层采用了B/S的架构风格,统一解决公交行业性难题“实施推广难、维护难”问题。

数据知道的博客 9928

关于web调用摄像头和进行反扫二维码等到信息

目的:实现web在浏览器中得到二维码(外部信息) 过程:1. 调用摄像头2.拍照3.解析二维码数据4.返回到网页中 总结:使用了别人的开源解析二维码,具体实现方法还没搞懂 步骤1:实现摄像头调用 <!doctype html> <html lang="en"> <head> <title>GET VIDEO</ti...

weixin_42401291的博客 2237

从SOMEIP看SOA,汽车电子电器架构的转变

从SOMEIP看SOA,汽车电子电器架构的转变

天赐好车的博客 242

实战|2026美团&大众点评餐饮数据抓取:Playwright/Selenium反爬全攻略

核心结论:2026年美团&大众点评的反爬核心是“多维度风控”,需组合使用“住宅IP+设备指纹伪装+真人行为模拟+动态验证处理”,Playwright是最优工具,Selenium仅作为补充。效率优化:单机爬取速度建议控制在“每小时500-800条”,避免高频请求触发风控;分布式爬取需确保每个节点使用独立住宅IP,且行为轨迹不一致。扩展方向集成WASM解密工具,破解2026年美团的Token加密;用AI识别动态点选验证,提升验证通过率;对接大数据平台,对抓取的餐饮数据进行可视化分析。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2465

react 调用手机摄像头识别二维码(pc端,移动端均可)

好久没有写博客,最近刚做完react 调用手机摄像头识别二维码的功能,做的过程中遇到了好多问题,也百度了很多方法结合实际情况最终实现了此功能。 在实现的过程中有很多都是在原声的HTML和JS里实现的,拿过来改改就行了。 首先安装组件,组件文档地址 npm i jsqr --save 看文档发现jsqr 使用很简单,只需要传递三个参数就可以使用了。但是难就难在这三个参数怎么获取,通过查看jsqr的事例发现是结合navigator.mediaDevices.getUserMedia实现的 mediaDevic

琞、小菜 4206

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

web/html5调用摄像头实现二维码扫描

web/html5调用摄像头实现二维码扫描 >  html>head>      title>HTML5 code Readertitle>      meta http-equiv="Content-Type" content="text/html; charset=gb2312">  head>  style type="text/css">   html, body

u010154380的专栏 1万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

H5页面实现扫一扫功能

H5 调用 扫描 二维码  做不到 ,因为浏览器没有那么大的权限 整体思路:我查了一下 一般有这个需求的 都是先做上传文件动作 调用摄像头或者图库  然后 把二维码传到服务器上 解析后 ajax传回来 在执行别的动作。 上代码: HTML: &lt;div class="right-three" onclick="saoYisao()"&gt; &lt;img class="goc...

qq_34873894的博客 3万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

电脑端扫描二维码(java)

  说明:js调去电脑摄像头拍照,然后获取图片base64位编码,再将base64为编码转为bolb,通过定时异步上传到后台,在后台对图片文件进行解码,返回解码结果到页面,然后页面重新加载结果(url) 第一种方式引入js &lt;script type="text/javascript" src="${basePath}js/jquery-1.9.min.js"&gt;&lt;/scri...

1284

简易JS HTML实现摄像头扫码功能

简易JS HTML实现摄像头扫码功能 去发现同类优质开源项目:https://gitcode.com/ 仓库简介 本仓库包含了一套简易的JS和HTML代码,实现了调用摄像头扫描静态图片并解析二维码数据的功能。同时,针对二维码数据中的中文乱码问题进行了优化处理,确保扫描结果的准确性。 功能特点 调用摄像头扫描二维码 解析二维码中的数据 解决中文乱码问题 使用说明 将仓库中的HTML文件和JS文...

gitblog_06751的博客 390
上一篇: layui全选,取消全选
下一篇: js外引文件添加随机字符串后缀
longzai89757
博客等级 码龄9年 14粉丝 67原创
评论 15
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值