vue3开启摄像头并进行拍照

news2024/11/26 18:22:09

文章目录

  • 一、前言
  • 二、文档
  • 三、实现
    • 3.1、封装
    • 3.2、使用
    • 3.3、效果
  • 四、最后

一、前言

Vue3 调用本地摄像头实现拍照功能,由于调用摄像头有使用权限,只能在本地运行,线上需用 https 域名才可以使用。主要是使用navigator.mediaDevices.getUserMedia这个API来实现。

二、文档

navigator.mediaDevices.getUserMediaMDN的官方文档点击【前往】。

向用户请求获得媒体输入的许可,返回一个MediaStream,我们可以使用MediaStreamvideo组件绑定输出摄像头拍摄的视频,也能记录麦克风的音频

三、实现

3.1、封装

封装组件take-photo.vue

/**
 * @Description: 拍照
 * @author 小马甲丫
 * @date 2024-01-07 12:03:04
*/

<template>
  <a-modal
    :width="800"
    :height="600"
    title="读身份证"
    @cancel="hideModal"
    v-model:visible="visibleFlag"
  >
    <!-- 画笔控件 用来拍照 -->
    <canvas style="display: none" ref="canvasDom"></canvas>
    <!-- 播放器,用来播放拍摄的视频 -->
    <video v-if="!imgurl" class="camera_video" ref="videoDom"></video>
    <!--  显示照片  -->
    <img v-else :src="imgurl" />
    <template #footer>
      <a-space>
        <a-button @click="hideModal">关闭</a-button>
        <a-button type="primary" @click="takePhoto">{{ imgurl ? "重拍" : "拍照" }}</a-button>
      </a-space>
    </template>
  </a-modal>
</template>

<script setup>
  import { ref, nextTick } from "vue";
  // canvas控件对象
  const canvasDom = ref(null);
  // video 控件对象
  const videoDom = ref(null);
  // 照片路径
  const imgurl = ref(null);

  const emits = defineEmits(['save']);

  // ------------------ 显示,关闭 ------------------
  // 显示
  const visibleFlag = ref(false);
  function showModal() {
    imgurl.value = ''
    visibleFlag.value = true;
    openCamera();
  }

  // 关闭
  function hideModal() {
    visibleFlag.value = false;
  }

  const openCamera = () => {
    // 检测浏览器是否支持mediaDevices
    if (navigator.mediaDevices) {
      navigator.mediaDevices
      // 开启视频,关闭音频
      .getUserMedia({audio: false, video: true})
      .then((stream) => {
        // 将视频流传入viedo控件
        videoDom.value.srcObject = stream;
        // 播放
        videoDom.value.play();
      })
      .catch((err) => {
        console.log(err);
      });
    } else {
      window.alert("该浏览器不支持开启摄像头,请更换最新版浏览器");
    }
  };

  // 拍照
  const takePhoto = () => {
    // 如果已经拍照了就重新启动摄像头
    if (imgurl.value) {
      imgurl.value = null;
      openCamera()
      return;
    }

    // 设置画布大小与摄像大小一致
    canvasDom.value.width = videoDom.value.videoWidth;
    canvasDom.value.height = videoDom.value.videoHeight;
    // 执行画的操作
    canvasDom.value.getContext("2d").drawImage(videoDom.value, 0, 0);
    // 将结果转换为可展示的格式
    imgurl.value = canvasDom.value.toDataURL("image/webp");
    // 关闭摄像头
    stop();
    nextTick(() => {
      emits('save', imgurl.value)
      hideModal()
    })
  }

  // 关闭摄像头
  const stop = () => {
    let stream = videoDom.value.srcObject;
    if (!stream) return;
    let tracks = stream.getTracks();
    tracks.forEach((x) => {
      x.stop();
    });
  };

  // ----------------------- 以下是暴露的方法内容 ------------------------
  defineExpose({
    showModal,
    hideModal
  });
</script>

<style lang="less" scoped>
.camera_video {
  width: 100%;
  height: 100%;
  border: 2px black solid;
}
</style>

3.2、使用

/**
 * @Description: 使用
 * @author 小马甲丫
 * @date 2023-12-20 08:07:47
*/

<template>
  <div>
  	<img :src="photo" />
    <a-button ghost type="primary" @click="readCard">拍照</a-button>
    <TakePhoto ref="photoRef" @save="handlePhoto" />
  </div>
</template>
<script setup>
  import { ref } from 'vue';
  import TakePhoto from './take-photo.vue';

  const photoRef = ref()
  const photo = ref()

  // 拍照
  function readCard() {
    photoRef.value.showModal()
  }

  // 拍照回调
  function handlePhoto(img) {
  	photo.value = img
  }
</script>

3.3、效果

四、最后

本人每篇文章都是一字一句码出来,希望对大家有所帮助,多提提意见。顺手来个三连击,点赞👍收藏💖关注✨,一起加油☕

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

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

相关文章

SpringBoot-自定义监听器

Spring Boot提供了强大的事件模型&#xff0c;其中包括多种内置监听器&#xff0c;同时也支持开发者自定义监听器。通过实现ApplicationListener接口&#xff0c;开发者可以创建自己的监听器&#xff0c;并在Spring Boot应用程序中进行配置。这样一来&#xff0c;在特定的应用程…

神经网络的核心:简单易懂理解 PyTorch 非线性激活函数

目录 torch.nn子函数非线性激活详解 nn.Softmin Softmin 函数简介 函数工作原理 参数详解 使用技巧与注意事项 示例代码 nn.Softmax Softmax 函数简介 函数工作原理 参数详解 使用技巧与注意事项 示例代码 nn.Softmax2d Softmax2d 函数简介 函数工作原理 输入…

FineBI实战项目一(9):每日不同支付方式订单总额/订单笔数

1 明确数据分析目标 统计每种支付方式的订单个数以及订单总金额 2 创建用于保存数据分析结果的表 create table app_order_paytype(id int primary key auto_increment,dt date,pay_type varchar(20),total_money double,total_cnt int ); 3 编写SQL语句进行数据分析 selec…

vue3 修饰符大全(近万字长文)

系列文章目录 TypeScript 从入门到进阶专栏 文章目录 系列文章目录前言一、事件修饰符&#xff08;Event Modifiers&#xff09;1、.stop&#xff08;阻止事件冒泡&#xff09;2、.prevent&#xff08;阻止事件的默认行为&#xff09;3、.capture&#xff08;使用事件捕获模式…

何为算法之空间复杂度

前言 不知前面所讲的算法的十大特征你是否记住了呢&#xff1f;其实除了这十大特征之外&#xff0c;算法还有两个衡量标准。 不同的问题需要使用不同的算法作为策略&#xff0c;不同的算法也可能占用不同的时间和空间来完成相同的任务&#xff0c;这时候&#xff0c;对算法的选…

强化学习的数学原理学习笔记 - RL基础知识

文章目录 Roadmap&#x1f7e1;基础概念贝尔曼方程&#xff08;Bellman Equation&#xff09;基本形式矩阵-向量形式迭代求解状态值 vs. 动作值 &#x1f7e1;贝尔曼最优方程&#xff08;Bellman Optimality Equation&#xff0c;BOE&#xff09;基本形式迭代求解 本系列文章介…

alibabacloud学习笔记02(小滴课堂)

什么是注册中心和常见的注册中心有哪些 介绍什么是Nacos和搭建实战 启动Nacos 使用前要先安装jdk。 linux学习专栏笔记中有&#xff0c;大家可以去看。 关闭nacos: 这样我们就登录了nacos。 项目集成Nacos实现服务直接的调用 每个子模块都去添加。 给每个子模块配置nacos配…

ReentrantLock底层原理学习二

以 ReentrantLock 作为切入点&#xff0c;来看看在这个场景中是如何使用 AQS 来实现线程的同步的 ReentrantLock 的时序图 调用 ReentrantLock 中的 lock()方法&#xff0c;源码的调用过程我使用了时序图来展现。ReentrantLock.lock() 这个是 reentrantLock 获取锁的入口 pu…

小H靶场笔记:DC-4

DC-4 January 4, 2024 2:37 PM Tags: teehee提权 Owner&#xff1a;只惠摸鱼 信息收集 探测靶机ip&#xff0c;发现应该是192.168.199.134 扫一下开放端口&#xff08;22、80&#xff09;、服务、版本、漏洞 根据扫描结果&#xff0c;在80端口可能有CSRF漏洞&#xff0c;…

好书推荐丨人工智能B2B落地实战:基于云和Python的商用解决方案(清华社)

文章目录 写在前面人工智能推荐图书图书简介简明目录 推荐理由粉丝福利写在后面 写在前面 本期博主给大家推荐一本全新正版的好书&#xff1a;《人工智能B2B落地实战&#xff1a;基于云和Python的商用解决方案》&#xff01;这本书来自清华大学出版社&#xff0c;是今年刚刚出…

十八:爬虫-JS逆向(下)

一&#xff1a;AES与DES DES对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥&#xff0c;信息的发送者。和信息的接收者在进行信息的传输与处理时&#xff0c;必须共同持有该密钥(称为对称密码),是一种对称加密算法。一般来说加密用的是encrypt()函…

Linux服务器安装操作Nginx

1.下载nginx压缩包 //进入/usr/local目录创建一个文件夹 cd /usr/local mkdir nginx cd nginx //下载tar包 wget http://nginx.org/download/nginx-1.20.1.tar.gz 2.配置nginx安装所需的环境 1. 安装gcc 安装 nginx 需要先将官网下载的源码进行编译&#xff0c;编译依赖 gc…

Linux查找命令@which、find

目录 which概念语法作用 find概念语法按文件名查找按文件大小查找 作用演示一演示二演示三 通配符 总结 which 概念 which 是一个常用的 Linux/Unix 命令&#xff0c;用于查找并显示指定命令的绝对路径。 语法 which 要查找的命令 》无参数。 》 which后面&#xff0c;跟要查…

Android studio Progress Bar 进度条应用设计

一、水平进度条: 1)、xml布局文件: 2)、java文件: progressBar1 = findViewById(R.id.progressBar); progressBar2 = findViewById(R.id.progressBar2); public class AlarmTask extends TimerTask {@Overridepublic void run() {progressValue++;if (progressVa…

计网知识点回归

概述 计算机网络的定义&#xff1a; 不同地理位置的计算机通过通信电路实现资源共享 计算机网络的组成&#xff1a; 资源子网——提供共享的软硬件资源 通信子网——提供信息交换的网络接点和通信线路 计算机网络分类&#xff1a; 按拓扑分&#xff1a;星形 树形 总线型 环形…

清华大学生物信息学课件资料分享

清华大学鲁志老师实验室在网上分享了他们的生信课程学习资料&#xff0c;有电子书&#xff0c;PPT和视频&#xff0c;真是生信学习者的福音。 实验室网址是&#xff1a; https://www.ncrnalab.org/courses/#bioinfo2 可以看到&#xff0c;课程有针对本科生的&#xff0c;也有针…

shp文件与数据库(创建表)

前言 第三方库准备 shp文件是什么&#xff1f;笔者就不多做解释。后面将使用python的一些第三方库 1、sqlalchemy 2、pyshp 3、geoalchemy2 4、geopandas 这四个是主要的库&#xff0c;具体怎么使用可以参考相关教程&#xff0c;当然还有其他库&#xff0c;后面在介绍。…

uniapp 微信小程序跳转外部链接

一、背景&#xff1a; 开发小程序时&#xff0c;跳转到内部路径通常会使用&#xff1a;uni.navigateTo&#xff0c;uni.redirectTo&#xff0c;uni.reLaunch&#xff0c;uni.switchTab等方法&#xff0c;可以跳转到pages.json中已经注册的页面 uni.navigateTo(OBJECT) | uni-…

【KingbaseES】DataGrip配置链接KingbaseES V8R6数据库

新建驱动 填写内容如下&#xff1a; defaultjdbc:kingbase8://{host::localhost}:[{port::54321}]/[{:database::test}] 点击OK保存 测试链接 出现上图证明已经能链接了&#xff0c;保存链接看看数据库是否有我们的数据 发现好像什么都没有 再尝试&#xff0c;发现现在可以…

前端发开的性能优化 请求级:请求前(资源预加载和预读取)

预加载 预加载&#xff1a;是优化网页性能的重要技术&#xff0c;其目的就是在页面加载过程中先提前请求和获取相关的资源信息&#xff0c;减少用户的等待时间&#xff0c;提高用户的体验性。预加载的操作可以尝试去解决一些类似于减少首次内容渲染的时间&#xff0c;提升关键资…