vue调用电脑端摄像头实时拍照

vue调用电脑端摄像头实时拍照

需求描述

点击照相机拍照,弹出照相机拍照弹窗,点击拍照按钮,截取录像的帧,点击保存,提交数据给后台。

功能实现

1.html模块

//点击打开照相机拍照弹窗
<el-button @click="handleOpen">照相机拍照</el-button>

//照相机拍照弹窗
    <div class="public-mask mask-grey-bg" v-show="cameraOpen">
      <div class="mask-main camera-main">
        <div class="mask-title">
          <img src="../assets/images/icon_camera.png" class="title-icon"/>
          <span>照相机拍照</span>
          <img src="../assets/images/icon_close.png" class="title-close" @click="closeCameraMask"/>
        </div>
        <div class="camera-box">
          <div class="camera-left">
            <!-- 这里就是摄像头显示的画面 -->
            <video id="videoCamera" width="100%" height="100%"></video>
          </div>
          <div class="camera-right">
        
            <div class="camera-img-box">
              <div class="small-img">
               <!-- 这里是点击拍照显示的图片画面 -->
                <img v-if="imgSrc" :src="imgSrc" style="width: 200px;height: 150px;" />
                <canvas id="canvasCamera" class="canvas" :width='videoWidth' :height='videoHeight' style="display: none;"></canvas>
              </div>
              <div>
              <!-- 点击拍照和保存按钮 -->
                <el-button type="primary" class="save-camera-btn" icon="el-icon-camera" @click="drawImage" style="margin-top: 10px;">拍照</el-button>
                <el-button type="primary" class="save-camera-btn" icon="el-icon-check" @click="uploadPicture">保存</el-button>
              </div>
            </div>
            
          </div>
          
        </div>
      </div>
    </div>

2.css模块
就是一个弹窗,这里就不进行展示了。

3.js模块

export default {
  name: "Index",
  data() {
  	return {
  	  /** 照相机弹窗模块-start */
      cameraOpen: false,
      imgSrc: undefined,
      os: false,//控制摄像头开关
      thisVideo: null,
      thisContext: null,
      thisCancas: null,
      videoWidth: 800,
      videoHeight: 600,
      /** 照相机弹窗模块-end */
  	}
  },
  methods: {
  /** 调用摄像头拍照-start*/
  	// 打开照相机弹窗
  	handleOpen() {
  	  this.cameraOpen = true;
      this.getCompetence();
  	},
    // 调用摄像头权限
    getCompetence() {
      //必须在model中render后才可获取到dom节点,直接获取无法获取到model中的dom节点
      this.$nextTick(() => {
        const _this = this;
        this.os = false;//切换成关闭摄像头
        this.thisCancas = document.getElementById('canvasCamera');//这里是需要截取的canvas的Id名称
        this.thisContext = this.thisCancas.getContext('2d');
        this.thisVideo = document.getElementById('videoCamera');
        // 旧版本浏览器可能根本不支持mediaDevices,我们首先设置一个空对象
        if (navigator.mediaDevices === undefined) {
          navigator.menavigatordiaDevices = {}
        }
        // 一些浏览器实现了部分mediaDevices,我们不能只分配一个对象
        // 使用getUserMedia,因为它会覆盖现有的属性。
        // 这里,如果缺少getUserMedia属性,就添加它。
        if (navigator.mediaDevices.getUserMedia === undefined) {
          navigator.mediaDevices.getUserMedia = function (constraints) {
            // 首先获取现存的getUserMedia(如果存在)
            let 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, 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 => {
          this.$notify({
            title: '警告',
            message: '没有开启摄像头权限或浏览器版本不兼容.',
            type: 'warning'
          });
        });
      });
    },
    //绘制图片
    drawImage() {
      // 点击,canvas画图
      this.thisContext.drawImage(this.thisVideo, 0, 0, this.videoWidth, this.videoHeight);
      // 获取图片base64链接,展示到界面中的也是这个url地址
      this.imgSrc = this.thisCancas.toDataURL('image/png');
    },
    // 上传照相机图片
    uploadPicture() {
      // 这里就调用上传图片接口即可
      ...
    },
    //清空画布
    clearCanvas(id) {
      let c = document.getElementById(id);
      let cxt = c.getContext("2d");
      cxt.clearRect(0, 0, c.width, c.height);
    },
    //重置画布
    resetCanvas() {
      this.imgSrc = "";
      this.clearCanvas('canvasCamera');
    },
    //关闭摄像头
    stopNavigator() {
      if (this.thisVideo && this.thisVideo !== null) {
        this.thisVideo.srcObject.getTracks()[0].stop();
        this.os = true;//切换成打开摄像头
      }
    },
    // 关闭照相机弹窗
    closeCameraMask() {
      this.cameraOpen = false; // 关闭照相机弹窗
      this.resetCanvas(); // 重置画布
      this.stopNavigator(); // 关闭摄像头
      //this.getDetailList(); // 重新获取一下List,此方法不再书写
    },
    /** 调用摄像头拍照-end*/
  },
}

效果展示

在这里插入图片描述

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Vue调用摄像头进行拍照,你可以使用HTML5的getUserMedia()方法来实现。首先,确保你的应用程序在HTTPS环境下运行,因为只有在安全环境下才能访问用户的摄像头。然后,你可以在Vue组件中通过以下步骤来调用摄像头拍照: 1. 导入Vue和HTML5的getUserMedia()方法: ```javascript import Vue from 'vue'; Vue.prototype.$getUserMedia = navigator.mediaDevices.getUserMedia || navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia; ``` 2. 在Vue组件中,创建一个方法来调用摄像头拍照: ```javascript methods: { takePhoto() { const video = this.$refs.video; // 获取video元素 const canvas = this.$refs.canvas; // 获取canvas元素 const context = canvas.getContext('2d'); // 获取canvas上下文 this.$getUserMedia({ video: true }) // 调用摄像头 .then((stream) => { video.srcObject = stream; // 将摄像头数据流赋值给video元素 video.play(); // 播放摄像头视频 // 在视频播放后,可以通过canvas将视频帧转化为图像数据 video.addEventListener('play', () => { const width = video.videoWidth; // 获取视频宽度 const height = video.videoHeight; // 获取视频高度 // 设置canvas的宽度和高度与视频一致 canvas.width = width; canvas.height = height; // 在每一帧绘制视频图像到canvas上 function draw() { context.drawImage(video, 0, 0, width, height); requestAnimationFrame(draw); } draw(); }); }) .catch((error) => { console.log('无法访问摄像头:', error); }); } } ``` 3. 在Vue组件的模板中添加video和canvas元素,并绑定对应的引用: ```html <template> <div> <video ref="video" style="display: none;"></video> <canvas ref="canvas" style="display: none;"></canvas> <button @click="takePhoto">拍照</button> </div> </template> ``` 通过上述步骤,你可以在Vue调用摄像头进行拍照

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值