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 相关文章推荐
jQuery 性能优化手册 推荐
Feb 23 Javascript
jQuery.lazyload+masonry改良图片瀑布流代码
Jun 20 Javascript
JavaScript对数字的判断与处理实例分析
Feb 02 Javascript
javascript手风琴下拉菜单实现代码
Nov 12 Javascript
JS简单模拟触发按钮点击功能的方法
Nov 30 Javascript
JavaScript判断对象是否为数组
Dec 22 Javascript
jQuery可见性过滤选择器用法示例
Sep 09 Javascript
JS正则RegExp.test()使用注意事项(不具有重复性)
Dec 28 Javascript
详解如何在Node.js的httpServer中接收前端发送的arraybuffer数据
Nov 11 Javascript
jQuery实现模拟搜索引擎的智能提示功能简单示例
Jan 27 jQuery
layui table 获取分页 limit的方法
Sep 20 Javascript
Vue+tracking.js 实现前端人脸检测功能
Apr 16 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
ThinkPHP 404页面的设置方法
2015/01/14 PHP
php查询whois信息的方法
2015/06/08 PHP
Yii2中YiiBase自动加载类、引用文件方法分析(autoload)
2016/07/25 PHP
利用php获得flv视频长度的实例代码
2017/10/26 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
2020/04/04 PHP
动态加载iframe
2006/06/16 Javascript
Mootools 1.2教程 Fx.Tween的使用
2009/09/15 Javascript
js function定义函数使用心得
2010/04/15 Javascript
javascript时间自动刷新实现原理与步骤
2013/01/06 Javascript
JS实现跟随鼠标闪烁转动色块的方法
2015/02/26 Javascript
javascript 中的console.log和弹出窗口alert
2016/08/30 Javascript
AngularGauge 属性解析详解
2016/09/06 Javascript
2种简单的js倒计时方式
2017/10/20 Javascript
vue 项目常用加载器及配置详解
2018/01/22 Javascript
Vue入门之animate过渡动画效果
2018/04/08 Javascript
Vue手把手教你撸一个 beforeEnter 钩子函数
2018/04/24 Javascript
vue项目中axios请求网络接口封装的示例代码
2018/12/18 Javascript
Vue学习笔记之计算属性与侦听器用法
2019/12/07 Javascript
mpvue实现微信小程序快递单号查询代码
2020/04/03 Javascript
vue路由跳转传递参数的方式总结
2020/05/10 Javascript
JavaScript组合模式---引入案例分析
2020/05/23 Javascript
VUE项目axios请求头更改Content-Type操作
2020/07/24 Javascript
[00:35]DOTA2上海特级锦标赛 EG战队宣传片
2016/03/04 DOTA
Python获取linux主机ip的简单实现方法
2016/04/18 Python
django 在原有表格添加或删除字段的实例
2018/05/27 Python
python 将list转成字符串,中间用符号分隔的方法
2018/10/23 Python
Python实现批量执行同目录下的py文件方法
2019/01/11 Python
Html5应用程序缓存(Cache manifest)
2018/06/04 HTML / CSS
蒂娜商店:Tiina the Store
2019/12/07 全球购物
俄罗斯三星品牌商店:Samsungstore
2020/04/05 全球购物
历史系自荐信范文
2013/12/24 职场文书
教师个人自我鉴定
2014/02/08 职场文书
2014学校领导四风对照检查材料思想汇报
2014/09/23 职场文书
中学教师教学工作总结
2015/08/13 职场文书
导游词之岳阳楼
2019/09/25 职场文书
详解python网络进程
2021/06/15 Python