Vue实现调用PC端摄像头实时拍照

 更新时间:2021年09月29日 17:00:38   作者:小咸鱼大翻身  
这篇文章主要为大家详细介绍了Vue实现调用PC端摄像头实时拍照,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

Vue之调用PC端摄像头实时拍照,供大家参考,具体内容如下

由于我使用的是点击按钮打开模态框拍照所以在这里吧按钮和模态框代码都粘贴如下。

<!-- 打开模态框按钮-->
        <el-form-item label="*照片:" prop="headImage">
          <el-input type="text" v-model="imgSrc" />
            <el-col :span="1.5">
              <el-button
                @click="onTake"
                icon="el-icon-camera"
                size="small">
                拍照上传
              </el-button>
            </el-col>
        </el-form-item>
        <!--拍照后显示图片-->
        <el-form-item label="" prop="imgSrc">
          <img v-if="imgSrc"  :src="imgSrc" style="width: 200px;height: 240px;" />
</el-form-item>

<!--拍照模态框-->
    <el-dialog
      title="拍照上传"
      :visible.sync="visible"
      @close="onCancel"
      width="1065px">
      <div class="box">
        <video id="videoCamera" class="canvas" :width="videoWidth" :height="videoHeight" autoPlay></video>
        <canvas id="canvasCamera" class="canvas" :width="videoWidth" :height="videoHeight"></canvas>
      </div>
      <div slot="footer">
        <el-button
          @click="drawImage"
          icon="el-icon-camera"
          size="small">
          拍照
        </el-button>
        <el-button
          v-if="os"
          @click="getCompetence"
          icon="el-icon-video-camera"
          size="small">
          打开摄像头
        </el-button>
        <el-button
          v-else
          @click="stopNavigator"
          icon="el-icon-switch-button"
          size="small">
          关闭摄像头
        </el-button>
        <el-button
          @click="resetCanvas"
          icon="el-icon-refresh"
          size="small">
          重置
        </el-button>
        <el-button
          @click="onCancel"
          icon="el-icon-circle-close"
          size="small">
          完成
        </el-button>
   </div>
</el-dialog>

下来我们来看js代码,我把不需要的部分删除了,因为涉及单位项目问题实属抱歉哈

<script>
export default {
  name: "XXX",
  data() {
    return {
      visible: false,//弹窗
      loading: false,//上传按钮加载
      os: false,//控制摄像头开关
      thisVideo: null,
      thisContext: null,
      thisCancas: null,
      videoWidth: 500,
      videoHeight: 400,
      postOptions:[],
      CertCtl:'',
      // 遮罩层
      loading: true,
      // 选中数组
      ids: [],
      // 非单个禁用
      single: true,
      // 非多个禁用
      multiple: true,
      // 总条数
      total: 0,
      // 项目人员表格数据
      akworkerList: [],
      //工种类别数据字典
      workerTypeOptions:[],
      // 弹出层标题
      title: "",
      // 是否显示弹出层
      open: false,
      // 查询参数
      queryParams: {
        pageNum: 1,
        pageSize: 10,
        imgSrc:undefined,
      },
      // 表单参数
      form: {},
      // 表单校验
      rules: {
      }
    };
  },
  created() {
   
  },
  methods: {
    /*调用摄像头拍照开始*/
    onTake() {
      this.visible = true;
      this.getCompetence();
    },
    onCancel() {
      this.visible = false;
     /* this.resetCanvas();*/
      this.stopNavigator();
    },
    // 调用摄像头权限
    getCompetence() {
      //必须在model中render后才可获取到dom节点,直接获取无法获取到model中的dom节点
      this.$nextTick(() => {
        const _this = this;
        this.os = false;//切换成关闭摄像头
        this.thisCancas = document.getElementById('canvasCamera');
        this.thisContext = this.thisCancas.getContext('2d');
        this.thisVideo = document.getElementById('videoCamera');
        // 旧版本浏览器可能根本不支持mediaDevices,我们首先设置一个空对象
        if (navigator.mediaDevices === undefined) {
          navigator.menavigatordiaDevices = {}
        }
        // 一些浏览器实现了部分mediaDevices,我们不能只分配一个对象
        // 使用getUserMedia,因为它会覆盖现有的属性。
        // 这里,如果缺少getUserMedia属性,就添加它。
        if (navigator.mediaDevices.getUserMedia === undefined) {
          navigator.mediaDevices.getUserMedia = function (constraints) {
            // 首先获取现存的getUserMedia(如果存在)
            let getUserMedia = navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.getUserMedia;
            // 有些浏览器不支持,会返回错误信息
            // 保持接口一致
            if (!getUserMedia) {
              return Promise.reject(new Error('getUserMedia is not implemented in this browser'))
            }
            // 否则,使用Promise将调用包装到旧的navigator.getUserMedia
            return new Promise(function (resolve, reject) {
              getUserMedia.call(navigator, constraints, resolve, reject)
            })
          }
        }
        const constraints = {
          audio: false,
          video: {width: _this.videoWidth, height: _this.videoHeight, transform: 'scaleX(-1)'}
        };
        navigator.mediaDevices.getUserMedia(constraints).then(function (stream) {
          // 旧的浏览器可能没有srcObject
          if ('srcObject' in _this.thisVideo) {
            _this.thisVideo.srcObject = stream
          } else {
            // 避免在新的浏览器中使用它,因为它正在被弃用。
            _this.thisVideo.src = window.URL.createObjectURL(stream)
          }
          _this.thisVideo.onloadedmetadata = function (e) {
            _this.thisVideo.play()
          }
        }).catch(err => {
          this.$notify({
            title: '警告',
            message: '没有开启摄像头权限或浏览器版本不兼容.',
            type: 'warning'
          });
        });
      });
    },
    //绘制图片
    drawImage() {
      // 点击,canvas画图
      this.thisContext.drawImage(this.thisVideo, 0, 0, this.videoWidth, this.videoHeight);
      // 获取图片base64链接
      this.imgSrc = this.thisCancas.toDataURL('image/png');
      /*const imgSrc=this.imgSrc;*/
    },
    //清空画布
    clearCanvas(id) {
      let c = document.getElementById(id);
      let cxt = c.getContext("2d");
      cxt.clearRect(0, 0, c.width, c.height);
    },
    //重置画布
    resetCanvas() {
      this.imgSrc = "";
      this.clearCanvas('canvasCamera');
    },
    //关闭摄像头
    stopNavigator() {
      if (this.thisVideo && this.thisVideo !== null) {
        this.thisVideo.srcObject.getTracks()[0].stop();
        this.os = true;//切换成打开摄像头
      }
    },
  /*调用摄像头拍照结束*/
  }
};
</script>

在此,本篇文章也就分享完毕了,若有什么不对之处还望各位大佬多多指点,若有相似之处还望联系修改删除,谢谢

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Vue实现数值型输入框并限制长度

    Vue实现数值型输入框并限制长度

    这篇文章主要介绍了Vue实现数值型输入框并限制长度,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • vue使用echarts实现折线图

    vue使用echarts实现折线图

    这篇文章主要为大家详细介绍了vue使用echarts实现折线图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • vue使用动态组件手写Router View实现示例

    vue使用动态组件手写Router View实现示例

    这篇文章主要为大家介绍了vue使用动态组件手写RouterView实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • 使用Plotly.js在Vue中创建交互式散点图的示例代码

    使用Plotly.js在Vue中创建交互式散点图的示例代码

    Plotly.js是一个功能强大的JavaScript库,用于创建交互式数据可视化,它支持各种图表类型,包括散点图、折线图和直方图,在Vue.js应用程序中,Plotly.js可用于创建动态且引人入胜的数据可视化,本文介绍了使用Plotly.js在Vue中创建交互式散点图,需要的朋友可以参考下
    2024-07-07
  • vue-cli自定义创建项目eslint依赖冲突解决方式

    vue-cli自定义创建项目eslint依赖冲突解决方式

    vue-cli是vue.js的脚手架,用于自动生成vue.js+webpack的项目模板,在创建项目时,如果遇到npm安装报错,通常是由于依赖版本冲突造成的,文中通过图文以及代码介绍的非常详细,需要的朋友可以参考下
    2024-09-09
  • Vue实现在线预览pdf文件功能(利用pdf.js/iframe/embed)

    Vue实现在线预览pdf文件功能(利用pdf.js/iframe/embed)

    项目要求需要预览pdf文件,网上找了很久,发现pdf.js的效果,这篇文章主要给大家介绍了关于Vue实现在线预览pdf文件功能,主要利用pdf.js/iframe/embed来实现的,需要的朋友可以参考下
    2021-06-06
  • VUE中v-on:click事件中获取当前dom元素的代码

    VUE中v-on:click事件中获取当前dom元素的代码

    这篇文章主要介绍了VUE中v-on:click事件中获取当前dom元素的代码,文中同时给大家提到了v-on:click获取当前事件对象元素的方法,需要的朋友可以参考下
    2018-08-08
  • Vue如何基于es6导入外部js文件

    Vue如何基于es6导入外部js文件

    这篇文章主要介绍了Vue如何基于es6导入外部js文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • axios请求中以params或body形式传递参数的区别浅析

    axios请求中以params或body形式传递参数的区别浅析

    最近在做自己项目中,做一个非常简单的新增用户场景,但是使用原生axios发送post请求的时候,还是踩了不少坑的,下面这篇文章主要给大家介绍了关于axios请求中以params或body形式传递参数的区别的相关资料,需要的朋友可以参考下
    2023-04-04
  • Vue实现点击箭头上下移动效果

    Vue实现点击箭头上下移动效果

    这篇文章主要介绍了Vue实现点击箭头上下移动效果,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06

最新评论