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 相关文章推荐
如何判断图片地址是否失效
Feb 02 Javascript
JavaScript 用cloneNode方法克隆节点的代码
Oct 15 Javascript
JS文本框默认值处理详解
Jul 10 Javascript
jquery插件jTimer(jquery定时器)使用方法
Dec 23 Javascript
js中arguments,caller,callee,apply的用法小结
Jan 28 Javascript
js制作简易年历完整实例
Jan 28 Javascript
jQuery循环动画与获取组件尺寸的方法
Feb 02 Javascript
快速实现jQuery多级菜单效果
Feb 01 Javascript
js实现适合新闻类图片的轮播效果
Feb 05 Javascript
微信小程序实现锚点定位楼层跳跃的实例
May 18 Javascript
微信小程序列表时间戳转换实现过程解析
Oct 12 Javascript
ES6实现图片切换特效代码
Jan 14 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+Mysql+jQuery实现发布微博程序 jQuery篇
2011/10/08 PHP
跟我学Laravel之请求(Request)的生命周期
2014/10/15 PHP
IE8 引入跨站数据获取功能说明
2008/07/22 Javascript
学习从实践开始之jQuery插件开发 菜单插件开发
2012/05/03 Javascript
通过复制Table生成word和excel的javascript代码
2014/01/20 Javascript
基于Node.js实现nodemailer邮件发送
2016/01/26 Javascript
jQuery基础的工厂函数以及定时器的经典实例分析
2016/05/20 Javascript
十大热门的JavaScript框架和库
2017/03/21 Javascript
详解微信小程序 通过控制CSS实现view隐藏与显示
2017/05/24 Javascript
深入理解JavaScript创建对象的多种方式以及优缺点
2017/06/01 Javascript
vue 本地服务不能被外部IP访问的完美解决方法
2018/10/29 Javascript
jQuery事件绑定和解绑、事件冒泡与阻止事件冒泡及弹出应用示例
2019/05/13 jQuery
Node.js 实现远程桌面监控的方法步骤
2019/07/02 Javascript
超轻量级的js时间库miment使用解析
2019/08/02 Javascript
Vue实现页面添加水印功能
2019/11/09 Javascript
小程序跳转H5页面的方法步骤
2020/03/06 Javascript
2020京东618叠蛋糕js脚本(亲测好用)
2020/06/02 Javascript
Openlayers实现地图全屏显示
2020/09/28 Javascript
Openlayers绘制地图标注
2020/09/28 Javascript
Python语言的面相对象编程方式初步学习
2016/03/12 Python
在windows下快速搭建web.py开发框架方法
2016/04/22 Python
利用python模拟sql语句对员工表格进行增删改查
2017/07/05 Python
python如何将图片转换为字符图片
2020/08/19 Python
python装饰器实现对异常代码出现进行自动监控的实现方法
2020/09/15 Python
韩国CJ食品专卖网:CJonmart
2016/09/11 全球购物
英国运动服、设备及配件网站:DW Sports
2019/12/04 全球购物
简述数组与指针的区别
2014/01/02 面试题
超市促销实习自我鉴定
2013/09/23 职场文书
自荐信结尾
2013/10/27 职场文书
行政人员工作职责
2013/12/05 职场文书
关于工资低的辞职信
2014/01/14 职场文书
房地产经营管理专业自荐信
2014/09/02 职场文书
2014年单位工作总结范文
2014/11/27 职场文书
前台文员岗位职责
2015/02/04 职场文书
2016年教代会开幕词
2016/03/04 职场文书
2016年“5.12”国际护士节活动总结
2016/04/06 职场文书