vue调用本地摄像头实现拍照功能


Posted in Javascript onAugust 14, 2020

前言:

vue调用本地摄像头实现拍照功能,由于调用摄像头有使用权限,只能在本地运行,线上需用https域名才可以使用。实现效果:

1、摄像头效果:

vue调用本地摄像头实现拍照功能

2、拍照效果:

vue调用本地摄像头实现拍照功能

实现代码:

<template>
  <div class="camera_outer">
   <video id="videoCamera" :width="videoWidth" :height="videoHeight" autoplay></video>
   <canvas style="display:none;" id="canvasCamera" :width="videoWidth" :height="videoHeight" ></canvas>
 
   <div v-if="imgSrc" class="img_bg_camera">
    <img :src="imgSrc" alt="" class="tx_img">
   </div>
   <button @click="getCompetence()">打开摄像头</button>
   <button @click="stopNavigator()">关闭摄像头</button>

 <button @click="setImage()">拍照</button>
 
 
  
  </div>
 </template>
 <script>
 export default {
  data () {
   return {
    videoWidth: 3000,
    videoHeight: 300,
    imgSrc: '',
    thisCancas: null,
    thisContext: null,
    thisVideo: null,
   }
  },
  methods: {
// 调用权限(打开摄像头功能)
   getCompetence () {
    var _this = this
    this.thisCancas = document.getElementById('canvasCamera')
    this.thisContext = this.thisCancas.getContext('2d')
    this.thisVideo = document.getElementById('videoCamera')
    // 旧版本浏览器可能根本不支持mediaDevices,我们首先设置一个空对象
    if (navigator.mediaDevices === undefined) {
     navigator.mediaDevices = {}
    }
    // 一些浏览器实现了部分mediaDevices,我们不能只分配一个对象
    // 使用getUserMedia,因为它会覆盖现有的属性。
    // 这里,如果缺少getUserMedia属性,就添加它。
    if (navigator.mediaDevices.getUserMedia === undefined) {
     navigator.mediaDevices.getUserMedia = function (constraints) {
      // 首先获取现存的getUserMedia(如果存在)
      var 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)
      })
     }
    }
    var 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 => {
     console.log(err)
    })
   },
// 绘制图片(拍照功能)
 
   setImage () {
    var _this = this
    // 点击,canvas画图
    _this.thisContext.drawImage(_this.thisVideo, 0, 0, _this.videoWidth, _this.videoHeight)
    // 获取图片base64链接
    var image = this.thisCancas.toDataURL('image/jpg')
    _this.imgSrc = image
    this.$emit('refreshDataList', this.imgSrc)
   },
// base64转文件
 
   dataURLtoFile (dataurl, filename) {
    var arr = dataurl.split(',')
    var mime = arr[0].match(/:(.*?);/)[1]
    var bstr = atob(arr[1])
    var n = bstr.length
    var u8arr = new Uint8Array(n)
    while (n--) {
     u8arr[n] = bstr.charCodeAt(n)
    }
    return new File([u8arr], filename, { type: mime })
   },
// 关闭摄像头
 
   stopNavigator () {
    this.thisVideo.srcObject.getTracks()[0].stop()
   }
  },
 
 }
  
 </script>
 <style lang="less" scoped>
 .camera_outer{
  position: relative;
  overflow: hidden;
  background: url("../../assets/img/user_0608_04.jpg") no-repeat center;
  background-size: 100%;
  video,canvas,.tx_img{
   -moz-transform:scaleX(-1);
   -webkit-transform:scaleX(-1);
   -o-transform:scaleX(-1);
   transform:scaleX(-1);
  }
  .btn_camera{
   position: absolute;
   bottom: 4px;
   left: 0;
   right: 0;
   height: 50px;
   background-color: rgba(0,0,0,0.3);
   line-height: 50px;
   text-align: center;
   color: #ffffff;
  }
  .bg_r_img{
   position: absolute;
   bottom: 0;
   left: 0;
   right: 0;
   top: 0;
  }
  .img_bg_camera{
   position: absolute;
   bottom: 0;
   left: 0;
   right: 0;
   top: 0;
   img{
    width: 100%;
    height: 100%;
   }
   .img_btn_camera{
    position: absolute;
    bottom: 0;
    left: 0;
    right: 0;
    height: 50px;
    line-height: 50px;
    text-align: center;
    background-color: rgba(0,0,0,0.3);
    color: #ffffff;
    .loding_img{
     width: 50px;
     height: 50px;
    }
   }
  }
 }
 </style>

总结

到此这篇关于vue调用本地摄像头实现拍照功能的文章就介绍到这了,更多相关vue调用本地摄像头实现拍照内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
浅析js中2个等号与3个等号的区别
Aug 06 Javascript
网站繁简切换的JS遇到页面卡死的解决方法
Mar 12 Javascript
详解JavaScript中的异常处理方法
Jun 16 Javascript
解决jquery实现的radio重新选中的问题
Jul 03 Javascript
jQuery学习笔记之回调函数
Aug 15 Javascript
JS实现浏览器打印、打印预览示例
Feb 28 Javascript
JS操作input标签属性checkbox全选的实现代码
Mar 02 Javascript
js运算符的一些特殊用法
Jul 29 Javascript
vue通信方式EventBus的实现代码详解
Jun 10 Javascript
js使用文档就绪函数动态改变页面内容示例【innerHTML、innerText】
Nov 07 Javascript
安装多版本Vue-CLI的实现方法
Mar 24 Javascript
JavaScript读取本地文件常用方法流程解析
Oct 12 Javascript
解决vue axios跨域 Request Method: OPTIONS问题(预检请求)
Aug 14 #Javascript
解决在Vue中使用axios POST请求变成OPTIONS的问题
Aug 14 #Javascript
Vue的Options用法说明
Aug 14 #Javascript
Vue 构造选项 - 进阶使用说明
Aug 14 #Javascript
vue 扩展现有组件的操作
Aug 14 #Javascript
如何HttpServletRequest文件对象并储存
Aug 14 #Javascript
解决element-ui里的下拉多选框 el-select 时,默认值不可删除问题
Aug 14 #Javascript
You might like
PHP实现简单实用的验证码类
2015/07/29 PHP
php正则提取html图片(img)src地址与任意属性的方法
2017/02/08 PHP
PHP基础之输出缓冲区基本概念、原理分析
2019/06/19 PHP
ArrayList类(增强版)
2007/04/04 Javascript
jquery随意添加移除html的实现代码
2011/06/21 Javascript
JS关闭窗口与JS关闭页面的几种方法小结
2013/12/17 Javascript
JavaScript数组深拷贝和浅拷贝的两种方法
2014/04/16 Javascript
jQuery如何取id有.的值一般的方法是取不到的
2014/04/18 Javascript
Javascript让DEDECMS告别手写Tag
2014/09/01 Javascript
node.js中的events.EventEmitter.listenerCount方法使用说明
2014/12/08 Javascript
Bootstrap模态对话框的简单使用
2016/04/29 Javascript
js的各种排序算法实现(总结)
2016/07/23 Javascript
[原创]JavaScript语法高亮插件highlight.js用法详解【附highlight.js本站下载】
2016/11/01 Javascript
Vue响应式添加、修改数组和对象的值
2017/03/20 Javascript
webpack开发跨域问题解决办法
2017/08/03 Javascript
JS和JQuery实现雪花飘落效果
2017/11/30 jQuery
js使用swiper实现层叠轮播效果实例代码
2018/12/12 Javascript
图解NodeJS实现登录注册功能
2019/09/16 NodeJs
解决vue+ element ui 表单验证有值但验证失败问题
2020/01/16 Javascript
javascript设计模式 ? 享元模式原理与用法实例分析
2020/04/15 Javascript
Nodejs实现微信分账的示例代码
2021/01/19 NodeJs
python在windows下实现ping操作并接收返回信息的方法
2015/03/20 Python
在Python3中使用asyncio库进行快速数据抓取的教程
2015/04/02 Python
python简单实现刷新智联简历
2016/03/30 Python
详解Python list 与 NumPy.ndarry 切片之间的对比
2017/07/24 Python
python  Django中的apps.py的目的是什么
2018/10/15 Python
Python 中的参数传递、返回值、浅拷贝、深拷贝
2019/06/25 Python
Python用Try语句捕获异常的实例方法
2019/06/26 Python
python 求定积分和不定积分示例
2019/11/20 Python
Django 用户认证Auth组件的使用
2020/11/30 Python
用HTML5制作一个简单的弹力球游戏
2015/05/12 HTML / CSS
HTML5图片层叠的实现示例
2020/07/07 HTML / CSS
威盛公司软件C++工程师笔试题面试题
2012/07/16 面试题
Ajax主要包含了哪些技术
2014/06/12 面试题
中学生关于梦想的演讲稿
2014/08/22 职场文书
创业计划书之健康营养产业
2019/10/15 职场文书