服务器之家

服务器之家 > 正文

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

时间:2021-08-23 17:27     来源/作者:浩星

前言:

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

1、摄像头效果:

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

2、拍照效果:

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

实现代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
<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调用本地摄像头实现拍照内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_41619796/article/details/107952904

标签:

相关文章

热门资讯

yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
2021年耽改剧名单 2021要播出的59部耽改剧列表
2021年耽改剧名单 2021要播出的59部耽改剧列表 2021-03-05
返回顶部