H5自定义相机,同时兼容IOS

H5自定义相机,同时兼容IOS

文章目录

由于H5和小程序自定义相机的方法不同,今天先讲一下H5自定义相机



前言

H5主要使用video、canvas标签


一、使用过程

先通过navigator.mediaDevices.getUserMedia调用摄像头,拍照通过canvas画图拿到base64格式的图片信息。

二、创建相机

const opencamera = () => {
    // 老的浏览器可能根本没有实现 mediaDevices,所以我们可以先设置一个空的对象
    if (navigator.mediaDevices === undefined) {
      navigator.mediaDevices = {};
    }
    if (navigator.mediaDevices.getUserMedia === undefined) {
      navigator.mediaDevices.getUserMedia = function (constraints) {
        // 首先,如果有getUserMedia的话,就获得它
        var getUserMedia = navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;

        // 一些浏览器根本没实现它 - 那么就返回一个error到promise的reject来保持一个统一的接口
        if (!getUserMedia) {
          return Promise.reject(new Error('getUserMedia is not implemented in this browser'));
        }

        // 否则,为老的navigator.getUserMedia方法包裹一个Promise
        return new Promise(function (resolve, reject) {
          getUserMedia.call(navigator, constraints, resolve, reject);
        });
      };
    }
    const constraints = {
      video: {
        facingMode: 'environment',
        // width: 720,
        // height: 1280,
        // width: { ideal: 1280 },
        // height: { ideal: 720 },
      },
      audio: false,
    };

    let promise = navigator.mediaDevices.getUserMedia(constraints);

    promise
      .then(stream => {
        let v = document.getElementById('v');
        if (v.srcObject !== undefined) {
          v.srcObject = stream;
        } else if (window.videoEl.mozSrcObject !== undefined) {
          v.mozSrcObject = stream;
        } else if (window.URL.createObjectURL) {
          v.src = window.URL.createObjectURL(stream);
        } else if (window.webkitURL) {
          v.src = window.webkitURL.createObjectURL(stream);
        } else {
          v.src = stream;
        }
        v.playsInline = true;
        v.onloadedmetadata = function () {
          v.play();
        };
      })

      .catch(err => {
        console.error(err.name + ': ' + err.message);
      });
  };

三 、HTML部分

<View className='camera-content'>
      <View className='top-box'>
        <View className='icon-left'>
          <Image className='img_self' src={flashValue ? flashActive : flash} onClick={flashBtn} />
        </View>
        <View className='icon' onClick={explainBtn}>
          <Image className='img_self' src={wenhao}></Image>
        </View>
      </View>

      <View className='content-box'>
        <View className='videoout'>
          <video id='v' className='video_self1'></video>
        </View>
        <View className='canvnsout'>
          <canvas id='canvas' className='canvns_self' />
        </View>
        <View className='tips_frame'></View>
        <View className='tips_div'>一次拍一页,将试卷置于框中,对准四个角</View>
      </View>

      <View className='bottom'>
        <View className='take_out'>
          <View className='icon-left' onClick={goback}>
            <Image className='img_self' src={icon_xxx}></Image>
          </View>

          {/* 按钮 */}
          <Image className='bnt' src={btn} mode='aspectFit' onClick={!showloading && takePhoto} />
          {/* 相册 */}
          <View className={duoTiPicture.length > 0 ? 'icon-photo' : 'icon'} onClick={openXiangCe}>
            {duoTiPicture.length > 0 ? (
              <Image className='img_self' src={duoTiPicture[duoTiPicture.length - 1].imageBase64}></Image>
            ) : (
              <Image className='img_self' src={ambule}></Image>
            )}
            {duoTiPicture.length > 0 ? <View className='jiaobiao'>{duoTiPicture.length}</View> : null}
          </View>
        </View>
      </View>


    </View>

四、拍照获取base64格式的图片

 const takePhoto = async () => {
    Taro.showLoading({
      title: '拍摄中',
    });
    setshowloading(true);
    // 用于拍摄快照的元素,添加canvas里面
    const canvas = document.getElementById('canvas');
    const context = canvas.getContext('2d');
    const video = document.getElementById('v');
    // 获取视频的宽高
    const width = video.videoWidth;
    const height = video.videoHeight;
    // 设置canvas宽高与视频宽高一致
    canvas.width = width;
    canvas.height = height;

    // 绘制画面
    context.drawImage(video, 0, 0, width, height);
    // context.drawImage(video, 0, 0, 641, 668, 0, 0, 300, 300);
    const data = canvas.toDataURL('image/png');
    // 获取base64格式的图片
    console.log('data', data);

   
  };

总结

在H5使用video自定义相机时,测试需要使用https安全协议。移动端需要使用https才能调用,谷歌浏览器可以设置不验证https。
谷歌不验证https的地址

chrome://flags/#unsafely-treat-insecure-origin-as-secure

示例

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸟很沉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值