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/png')
        _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.png") 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>

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作为AI语言模型,我无法直接进行编程或访问硬件设备。但是,我可以向您提供一些指导。 要使用Vue调用手机前置摄像头,您需要使用Cordova或Vue Native将Vue应用打包为移动应用程序,并使用Cordova插件或原生库来访问设备摄像头。 以下是一些相关的Cordova插件: - cordova-plugin-camera:提供访问设备摄像头的功能。 - cordova-plugin-media-capture:提供录制视频和音频的功能。 - cordova-plugin-ios-camera-permissions:在iOS上请求相机权限。 - cordova-plugin-android-permissions:在Android上请求相机权限。 您可以在Vue应用程序中使用这些插件,具体取决于您的需求。例如,您可以使用cordova-plugin-camera来捕获照片或视频,并在Vue组件中显示它们。 以下是一个简单的Vue组件示例,演示如何使用cordova-plugin-camera捕获照片: ```html <template> <div> <button @click="capturePhoto">Capture Photo</button> <img :src="photoData" v-if="photoData"> </div> </template> <script> export default { data() { return { photoData: null } }, methods: { capturePhoto() { navigator.camera.getPicture( imageData => { this.photoData = 'data:image/jpeg;base64,' + imageData }, error => { console.error('Camera error:', error) }, { quality: 50, destinationType: Camera.DestinationType.DATA_URL } ) } } } </script> ``` 在上面的代码中,我们使用了navigator.camera对象来调用设备摄像头。当用户点击“Capture Photo”按钮时,我们调用capturePhoto方法来启动摄像头,并在成功拍摄照片后将其转换为Base64编码的数据,并将其显示在img元素中。 请注意,上述代码仅适用于Cordova应用程序。如果您使用Vue Native,您需要使用相应的原生库来访问设备摄像头。例如,对于React Native,您可以使用react-native-camera库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值