vue3开启摄像头并进行拍照的实现示例

 更新时间:2024年01月15日 09:53:17   作者:小马甲丫  
本文主要介绍了vue3开启摄像头并进行拍照的实现示例,主要是使用navigator.mediaDevices.getUserMedia这个API来实现,具有一定的参考价值,感兴趣的可以了解一下

一、前言

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、效果

四、最后

到此这篇关于vue3开启摄像头并进行拍照的实现示例的文章就介绍到这了,更多相关vue3开启摄像头拍照内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue中v-model如何绑定多循环表达式实战案例

    vue中v-model如何绑定多循环表达式实战案例

    v-model绑定的变量无论是对象还是数组都是绑定的value值,下面这篇文章主要给大家介绍了关于vue中v-model如何绑定多循环表达式的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • 如何快速上手Vuex

    如何快速上手Vuex

    本文主要介绍了Javascript中Vuex的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • 详解Vue适时清理keepalive缓存方案

    详解Vue适时清理keepalive缓存方案

    说到Vue缓存,我们肯定首先选择官方提供的缓存方案keep-alive,本文主要介绍了详解Vue适时清理keepalive缓存方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • vue @ ~ 相对路径 路径别名设置方式

    vue @ ~ 相对路径 路径别名设置方式

    这篇文章主要介绍了vue @ ~ 相对路径 路径别名设置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • vue项目打包发布上线的方法步骤

    vue项目打包发布上线的方法步骤

    本文主要介绍了vue项目打包发布上线的方法步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • vue中map()快速使用方法小结

    vue中map()快速使用方法小结

    map()函数是在JS的数组中定义的,它返回一个新的数组,下面这篇文章主要给大家介绍了关于vue中map()快速使用的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • Vue自定义指令详解

    Vue自定义指令详解

    这篇文章主要为大家详细介绍了Vue自定义指令的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • Vue实现输入框@功能的示例代码

    Vue实现输入框@功能的示例代码

    这篇文章主要为大家介绍了如何利用Vue实现输入框@功能,文中的示例代码讲解详细,对我们学习Vue有一定的帮助,感兴趣的可以学习一下
    2022-05-05
  • vue的无缝滚动组件vue-seamless-scroll实例

    vue的无缝滚动组件vue-seamless-scroll实例

    本篇文章主要给大家讲解了vue的无缝滚动组件vue-seamless-scroll的用法,需要的朋友参考学习下吧。
    2017-12-12
  • vue之子组件如何修改父组件的值

    vue之子组件如何修改父组件的值

    这篇文章主要介绍了vue之子组件如何修改父组件的值问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07

最新评论