zoukankan      html  css  js  c++  java
  • javascript调用摄像头并截图转file对象

    <!DOCTYPE html>
    <html>
    <head>
      <title>js调用摄像头并截图转file对象</title>
      <meta charset="utf-8"/>
    </head>
    <body>
    <video id="video" width="300" height="300"></video>
    <canvas id="canvas" width="300" height="300"></canvas>
    <p>
      <button onclick="startFun()">打开摄像头</button>
      <button onclick="snapFun()">截取图像</button>
      <button onclick="closeFun()">关闭摄像头</button>
    </p>
    <script>
      var videoObj = document.getElementById('video')
      var canvasObj = document.getElementById('canvas')
      var MediaStreamTrackArr = null
    
      function startFun() {
        navigator.mediaDevices.getUserMedia({
          video: true,//视频
          audio: true//音频
        }).then(function (stream) {
          MediaStreamTrackArr = stream.getTracks();
          videoObj.srcObject = stream
          videoObj.play();
        })
      }
    
      function snapFun() {
        var context2d = canvasObj.getContext('2d')
        context2d.drawImage(videoObj, 0, 0, 300, 300);
    
        // canvas转base64
        const base64Data = canvasObj.toDataURL('image/png');
        // 方式1
        // base64转blob
        const blob = base64ToBlob(base64Data);
        // blob转file
        const file1 = blobToFile(blob, '文件名');
    
        // 方式2
        // base64转file
        const file2 = base64ToFile(base64Data, '文件名');
        console.log(file2)
      }
    
      function closeFun() {
        for (var i = 0; i < MediaStreamTrackArr.length; i++) {
          MediaStreamTrackArr[i].stop()
        }
      }
    
      function base64ToBlob(base64Data) {
        let arr = base64Data.split(','),
          fileType = arr[0].match(/:(.*?);/)[1],
          bstr = atob(arr[1]),
          l = bstr.length,
          u8Arr = new Uint8Array(l);
    
        while (l--) {
          u8Arr[l] = bstr.charCodeAt(l);
        }
        return new Blob([u8Arr], {type: fileType});
      }
    
      function blobToFile(newBlob, fileName) {
        newBlob.lastModifiedDate = new Date();
        newBlob.name = fileName;
        return newBlob;
      }
    
      function base64ToFile(base64Data, fileName) {
        let arr = base64Data.split(','),
          fileType = arr[0].match(/:(.*?);/)[1],
          bstr = atob(arr[1]),
          l = bstr.length,
          u8Arr = new Uint8Array(l);
    
        while (l--) {
          u8Arr[l] = bstr.charCodeAt(l);
        }
        return new File([u8Arr], fileName, {type: fileType});
      }
    </script>
    </body>
    </html>
  • 相关阅读:
    RabbitMQ 均衡调度(公平分发机制)
    RabbitMQ 循环调度
    模型绑定与验证笔记
    Controller总结
    JQuery事件绑定,bind与on区别
    View的呈现(一)ActionResult
    C#操作sql时注意点
    mvc4中的过滤器
    Bundle、Intent、SharedPreferences
    SharedPreferences的基本用法
  • 原文地址:https://www.cnblogs.com/linding/p/14634961.html
Copyright © 2011-2022 走看看