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 获得服务器控件值的方法小结
May 11 Javascript
JavaScript Scoping and Hoisting 翻译
Jul 03 Javascript
js日期相关函数总结分享
Oct 15 Javascript
JavaScript中双叹号!!作用示例介绍
Sep 21 Javascript
使用Chrome调试JavaScript的断点设置和调试技巧
Dec 16 Javascript
JQuery中extend的用法实例分析
Feb 08 Javascript
jquery对象访问是什么及使用方法介绍
May 03 Javascript
Angularjs单选改为多选的开发过程及问题解析
Feb 17 Javascript
详解vue-cli3开发Chrome插件实践
May 29 Javascript
深入理解Vue keep-alive及实践总结
Aug 21 Javascript
vue调用语音播放的方法
Sep 27 Javascript
Javascript 类型转换、封闭函数及常见内置对象操作示例
Nov 15 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
用PHPdig打造属于你自己的Google[图文教程]
2007/02/14 PHP
解决163/sohu/sina不能够收到PHP MAIL函数发出邮件的问题
2009/03/13 PHP
PHP函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
2011/07/01 PHP
php设计模式之工厂模式用法经典实例分析
2019/09/20 PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
2019/11/26 PHP
laravel数据库查询结果自动转数组修改实例
2021/02/27 PHP
javascript 基础篇1 什么是js 建立第一个js程序
2012/03/14 Javascript
基于jquery的滚动条滚动固定div(附演示下载)
2012/10/29 Javascript
代码获取历史上的今天发生的事
2014/04/11 Javascript
js实现简单的验证码
2015/12/25 Javascript
js数组操作方法总结(必看篇)
2016/11/22 Javascript
js实现打地鼠小游戏
2017/02/13 Javascript
AngularJS模糊查询功能实现代码(过滤内容下拉菜单排序过滤敏感字符验证判断后添加表格信息)
2017/10/24 Javascript
express+mockjs实现模拟后台数据发送功能
2018/01/07 Javascript
Vue二次封装axios为插件使用详解
2018/05/21 Javascript
jQuery实现获取选中复选框的值实例详解
2018/06/28 jQuery
layer弹出子iframe层父子页面传值的实现方法
2018/11/22 Javascript
Vue动态路由缓存不相互影响的解决办法
2019/02/19 Javascript
Nodejs异步流程框架async的方法
2019/06/07 NodeJs
BootStrap表单验证中的非Submit类型按钮点击时触发验证的坑
2019/09/05 Javascript
对layui数据表格动态cols(字段)动态变化详解
2019/10/25 Javascript
JS求解两数之和算法详解
2020/04/28 Javascript
python reduce 函数使用详解
2017/12/05 Python
Python函数中不定长参数的写法
2019/02/13 Python
Python paramiko模块使用解析(实现ssh)
2019/08/30 Python
Python StringIO如何在内存中读写str
2020/01/07 Python
PyInstaller运行原理及常用操作详解
2020/06/13 Python
在keras里面实现计算f1-score的代码
2020/06/15 Python
django有哪些好处和优点
2020/09/01 Python
澳大利亚购买健身器材网站:Gym Direct
2019/12/19 全球购物
西安当代医院管理研究院笔试题
2015/12/11 面试题
北京捷通华声语音技术有限公司Java软件工程师笔试题
2012/04/10 面试题
委托书如何写
2014/08/30 职场文书
群众路线党员自我评议范文2014
2014/09/24 职场文书
IDEA 2022 Translation 未知错误 翻译文档失败
2022/04/24 Java/Android
详解Mysql数据库平滑扩容解决高并发和大数据量问题
2022/05/25 MySQL