首页 > 其他分享 >js 如何调用摄像头拍照

js 如何调用摄像头拍照

时间:2023-08-15 13:57:57浏览次数:40  
标签:拍照 canvas js width let video height 摄像头

1.第一种 

业务逻辑需要人脸验证,需要通过调用摄像头获取人脸来调用接口做对比,所以学习了一下js关于调用摄像头拍照。主要通过video调用摄像头和canvas截取画面。

<!DOCTYPE html>
<html lang="en">
 
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
 
<body>
    <video width="500" height="500" autoplay class="video"></video>
    <canvas width="500" height="500"></canvas>
    <button onclick="openx()">调用摄像头</button>
    <button onclick="pho()">拍照</button>
    <button onclick="exit()">关闭摄像头</button>
</body>
 
</html>
<script>
    let video = document.querySelector('.video');
    let canvas = document.querySelector('canvas');
    function openx() {
        let constraints = {
            video: {            //这里是摄像头的信息
                height: 500,
                width: 500
            },
        // audio: true,  //是否开启麦克风
        }
        let isok = navigator.mediaDevices.getUserMedia(constraints); //这里主要是用于请求用户打开摄像头的权限
        isok.then(res => {     //可以看出是使用promise封装的 那么我们就可以使用then和catch
            video.srcObject = res;    //用户允许时 将摄像头对象的画面转移到video上面
            video.play();                //打开video的画面
        }).catch((err) => {
            console.log(err)            //拒绝时打印错误信息
        })
    }
    function pho() {
        canvas.getContext("2d").drawImage(video, 0, 0, 300, 300);   //第一个参数为要截取的dom对象,第二个和第三个为xy轴的偏移值    3-4为截取图像的大小
    }
    function exit() {
        video.srcObject.getTracks()[0].stop();   //这里如果打开了麦克风、getTracks是一个数组,我们同样需要获取下标[1]来关闭摄像头 打开麦克风[0]就是麦克风
    }
</script>
View Code

上述代码看起来并不多,包含了打开-截取图像-关闭 摄像头的功能,足以满足功能需求。

https://blog.csdn.net/m0_72436362/article/details/128321359

外接摄像头没错,笔记本的摄像头报错

$("img").css("src", canvas.toDataURL("image/png"));

2.第二种,笔记本的摄像头打开没报错

 

<!DOCTYPE html>
<html lang="ZH-CN">
<head>
  <meta charset="utf-8">
  <title>web RTC 测试</title>
  <style>
    .booth {
      width:400px;
     
      background:#ccc;
      border: 10px solid #ddd;
      margin: 0 auto;
    }
  </style>
</head>
<body>
    <article>
      <section>
        <video id="video"></video>
      </section>
      <section>
        <audio id="audio"></audio>
      </section>
      <button id="btn">拍照</button>
      <section>
        <canvas id="canvas"></canvas>
      </section>
      <section><img src="" alt="" id="img"></section>
    </article>

    <article>
      <header>相关知识</header>
      <h2>获取用户媒体:</h2>
      <p>
        <code>navigator.mediaDevices.getUserMedia({video: true, audio: true})  // 异步操作</code>
      </p>

      <h2>枚举媒体数:video,audio输入输出设备</h2>
      <p><code>navigator.mediaDevices.enumerateDevices()  // 异步操作</code></p>
    </article>
  <script>
    let convas = document.querySelector("#canvas"); //
    let video = document.querySelector("#video");
    let audio = document.querySelector("audio");
    let img = document.querySelector("#img");
    let btn = document.querySelector("button");
    let context = canvas.getContext('2d');
    let width = 320; //视频和canvas的宽度
    let height = 0; //
    let streaming = false; // 是否开始捕获媒体
    
    // 获取用户媒体,包含视频和音频
    navigator.mediaDevices.getUserMedia({video: true, audio: true})
      .then(stream => {
      video.srcObject = stream; // 将捕获的视频流传递给video  放弃window.URL.createObjectURL(stream)的使用
      video.play(); //  播放视频
      audio.srcObject = stream;
      audio.play();
    });
    
    
    function tackcapture() {
      // 需要判断媒体流是否就绪
      if(streaming){
          context.drawImage(video, 0, 0, 350, 200);// 将视频画面捕捉后绘制到canvas里面
          img.src = canvas.toDataURL('image/png');// 将canvas的数据传送到img里
      }
    
    }
    
    btn.addEventListener('click',tackcapture,false); // 按钮点击事件
    
    // 监听视频流就位事件,即视频可以播放了
    video.addEventListener('canplay', function(ev){
          if (!streaming) {
            height = video.videoHeight / (video.videoWidth/width);
          
            video.setAttribute('width', width);
            video.setAttribute('height', height);
            canvas.setAttribute('width', width);
            canvas.setAttribute('height', height);
            streaming = true;
          }
        }, false);
  </script>
</body>
</html>
View Code
  1. 有些浏览器可能不支持此功能
  2. 必须通过服务器打开页面,通过files://打开无效
  3. 如果通过远程服务器打开则必须是https协议, http协议也无法使用

转:https://www.cnblogs.com/scarecrowlxb/p/6804747.html

3.第三种

<script src="https://cdn.bootcss.com/zepto/1.2.0/zepto.min.js"></script>

 

<!DOCTYPE html>
<html lang="zh">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>使用js调用设备摄像头并实现拍照</title>
    <script src="https://cdn.bootcss.com/zepto/1.2.0/zepto.min.js"></script>
    <style type="text/css">
      * {
        margin: 0;
        padding: 0;
      }
      video {
        width: 200px;
      }
      button {
        width: 100px;
        height: 60px;
      }
    </style>
  </head>
  <body>
    <div class="box">
      <video src=""></video> <button class="shot">拍照</button>
      <canvas id="canvas"></canvas> <img src="" />
    </div>
    <a href="https://codesandbox.io/s/811w1z2xwj">点击编辑</a>

    <script type="text/javascript">
      // 视频大小
      var constraints = { audio: true, video: { width: 200, height: 250 } };
      // 开启视频
      navigator.mediaDevices
        .getUserMedia(constraints)
        .then(function(mediaStream) {
          console.log("getUserMedia:", mediaStream);
          var video = document.querySelector("video");
          video.srcObject = mediaStream;
          video.onloadedmetadata = function(e) {
            video.play();
          };

          // 使用canvas进行拍照
          var canvas = document.getElementById("canvas");
          $("button").on("click", function() {
            canvas.getContext("2d").drawImage(video, 0, 0, 200, 250);
            $("img").css("src", canvas.toDataURL("image/png"));
          });
        })
        .catch(function(err) {
          console.log(err.name + ": " + err.message);
        });
    </script>
    
</body>
</html>
View Code

 

转:http://www.taodudu.cc/news/show-6195164.html?action=onClick

https://811w1z2xwj.codesandbox.io/

 

标签:拍照,canvas,js,width,let,video,height,摄像头
From: https://www.cnblogs.com/love201314/p/17631094.html

相关文章

  • 网页播放海康,威视,大华,华为摄像头RTSP流,延迟毫秒级,支持多路播放、H.264/H.265
    一、背景:在遍地都是摄像头的今天,往往需要在各种信息化、数字化、可视化B/S系统中集成实时视频流播放等功能,海康、大华、华为等厂家摄像头或录像机等设备一般也都遵循监控行业标准,支持国际标准的主流传输协议RTSP输出,而Chrome、Firefox、Edge等新一代浏览器从2015年开始取消了NPAPI......
  • “优雅”的js
    ......
  • 如何单独在js中引入elementUI的通知组件
    在页面上可以直接使用的通知:open1(){this.$notify({title:'成功',message:'这是一条成功的提示消息',type:'success'});}, 但是在单独的js当中使用时,会提示  .$notify未定义,原因是在单独的js当中未引入el......
  • nodejs的版本管理工具NVM
    nvm(NodeVersionManager)是一个node的版本管理工具,可以快捷的进行node版本的安装、切换、卸载、查看等。它能够在项目开发中根据不同需求轻松切换所依赖不同版本的Node.js,从而让开发者可以在不同的环境之间进行切换,从而更好地保证软件的稳定性运行。1.从官网下载安装包https://g......
  • Jackson解析JSON
    Jackson有三个核心包,分别是Streaming、Databind、Annotations,通过这些包可以方便的对JSON进行操作1.Streaming:在jackson-core模块。定义了一些流处理相关的API以及特定的JSON实现2.Annotations:在jackson-annotations模块,包含了Jackson中的注解3.Databind:在j......
  • js判断多条件
     if((String(properties.SYDMC).includes(String(attributeValue))||String(properties.SYDMC)==String(attributeValue))&&(String(properties.AnotherField).includes(String(anotherAttributeValue))||String(properties.A......
  • 使用 JScript 查找操作系统名称/版本
    varwbemFlagReturnImmediately=0x10;varwbemFlagForwardOnly=0x20;varobjWMIService=GetObject("winmgmts:\\\\.\\root\\CIMV2");varcolItems=objWMIService.ExecQuery("SELECT*FROMWin32_OperatingSystem","WQL",......
  • JSON对象和字符串之间的相互转换
    比如我有两个变量,我要将a转换成字符串,将b转换成JSON对象:1vara={"name":"tom","sex":"男","age":"24"};23varb='{"name":"Mike","sex":"女","age":"29......
  • 深入浅出node.js游戏服务器开发——Pomelo框架的设计动机与架构介绍
    一、Pomelo的定义和组成以下是Pomelo官网给出的最初定义:Pomelo是基于node.js的高性能,分布式游戏服务器框架。它包括基础的开发框架和相关的扩展组件(库和工具包),可以帮助你省去游戏开发枯燥中的重复劳动和底层逻辑的开发。Pomelo最初的设计初衷是为了游戏服务器,不过我们在设计、开......
  • JS加密、JS混淆的好处与作用。
    JS加密、JS混淆,有这些用:1、前端JS代码,如果不加密,它人可以随便copy、任意修改。自己写的代码,可以轻易成为别人的成果。对JS代码混淆加密,则可以防止这种他人随意白嫖的问题,代码是自己辛辛苦苦写的,通常情况下,很少有人愿意自己的劳动成果被他人免费享用。注:如果是毫无用处的代码、无任......