<template> <div class="camera_outer"> <video id="videoCamera" :width="videoWidth" :height="videoHeight" autoplay /> <canvas id="canvasCamera" :width="videoWidth" :height="videoHeight" style="display: none" /> </div> </template> <script> export default { name: 'FaceLogin', data() { return { videoWidth: 396, videoHeight: 297, thisCancas: null, thisContext: null, thisVideo: null } }, methods: { // 调用权限(打开摄像头功能) getCompetence() { const _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(如果存在) const 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) }) } } const constraints = { audio: false, video: { width: this.videoWidth, height: this.videoHeight } }; 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() _this.$emit('cameraReady') } }) .catch((err) => { console.log(err) }) }, // 绘制图片(拍照功能) setImage() { const _this = this // 点击,canvas画图 _this.thisContext.drawImage( _this.thisVideo, 0, 0, _this.videoWidth, _this.videoHeight ) // 获取图片base64链接 const image = this.thisCancas.toDataURL('image/png') this.$emit('captured', image) }, // 关闭摄像头 stopNavigator() { this.thisVideo.srcObject.getTracks()[0].stop() } } } </script> <style lang="scss" scoped> .camera_outer { position: relative; overflow: hidden; background-size: 100%; border: 2px solid #007eff; width: 400px; height: 301px; } </style>