首页 > 其他分享 >HTML5调用系统摄像头结合canvas进行拍照以及文件上传,调用结束后关闭浏览器对摄像头的占用

HTML5调用系统摄像头结合canvas进行拍照以及文件上传,调用结束后关闭浏览器对摄像头的占用

时间:2024-06-22 15:59:57浏览次数:3  
标签:canvas 调用 image camera let video refs 摄像头

html5部分

 <!-- 摄像头拍照 -->
 <el-button size="mini" type="primary" class="cameraBtn"  @click="confirm_camera">拍照</el-button>
 
 <el-dialog :visible.sync="isShowCamera" title="拍照" width="600px">
  <video ref="video_camera" style="width: 100%;"></video>
   <div slot="footer" class="dialog-footer">
     <el-button type="primary" @click="clic_camera">拍 摄</el-button>
     <el-button @click="isShowCamera = false">取 消</el-button>
   </div>
 </el-dialog>

JS部分

// 拍照
    async confirm_camera() {
      let navigator = window.navigator.mediaDevices;
      navigator
        .getUserMedia({
          video: {
            width: 600,
            height: 400
          },
        })
        .then((mediaStream) => {
          this.isShowCamera = true;
          this.$nextTick(() => {
            this.$refs.video_camera.srcObject = mediaStream;
            let that = this;
            this.$refs.video_camera.onloadedmetadata = function (e) {
              that.$refs.video_camera.play();
            };
          })
        })
        .catch((err) => {
          console.log(err);
          this.$message.error('请连接摄像头并允许浏览器进行拍摄')
          this.isShowCamera = false;
        });
    },
    //拍摄按钮事件
    clic_camera() {
      const canvas = document.createElement("canvas");
      canvas.width = 600;
      canvas.height = 400;
      let ctx = canvas.getContext("2d");
      ctx.drawImage(this.$refs.video_camera, 0, 0, canvas.width, canvas.height);
      let image = canvas.toDataURL("image/png");
      this.isShowCamera = false;  //相机展示画面是弹窗,这里是关闭弹窗
      this.submitUpload(image)
    },
    submitUpload(image) {
      // console.log("image", image)  //base64
      let binaryData = atob(image.split(',')[1]); // base64格式转file格式
      let arrayBuffer = new ArrayBuffer(binaryData.length);
      let uint8Array = new Uint8Array(arrayBuffer);
      for (let i = 0; i < binaryData.length; i++) {
        uint8Array[i] = binaryData.charCodeAt(i);
      }
      let blob = new Blob([uint8Array], { type: 'image/jpeg' }); // 指定文件类型
      this.handleUpload({ file: blob, filename: "camera.jpg", fileMime: "image/jpeg", blob: blob }); //上传的业务代码
      //调用结束后关闭浏览器对摄像头的占用
      this.$refs.video_camera.srcObject = null;
      var stream = this.$refs.video_camera.srcObject;
      if (stream) {
        stream.getTracks().forEach(track => track.stop());
      }
    },

标签:canvas,调用,image,camera,let,video,refs,摄像头
From: https://blog.csdn.net/qq_39051175/article/details/139883551

相关文章

  • golang runtime.Caller 获取调用堆栈信息, Caller(1) 和 Caller(2) 的区别
     funcwhoCalledMe(){//获取调用堆栈信息_,fileName,lineNo,ok:=runtime.Caller(2)if!ok{fmt.Println("Failedtogetcallerinformation")return}fmt.Printf("Calledfrom:%s:%d\n",fileName,lineNo......
  • RAG与LLM原理及实践(2)--- RAG结合LLM function调用的原理及落地实践
    花一点时间继续写下,RAG结合LLM。通过上一篇文章你应该知道为什么RAG要结合LLM,或者说为什么LLM要结合RAG使得LLM更强大,特别是当LLM应用在人机对话等方面的时候。只要涉及一问一答,并通过上下文继续丰富对话,就会涉及到他。这个是看事情的两个维度。就像是买钟送电池还是买电池送......
  • C++系统相关操作1 - 调用命令行并获取返回值
    1.关键词2.sysutil.h3.sysutil.cpp3.1.system_util_unix.cpp3.2.system_util_win.cpp4.测试代码5.运行结果6.源码地址1.关键词关键词:C++系统调用systempopen跨平台应用场景:希望直接调用操作系统的某些命令,并获取命令的返回值。2.sysutil.h#pragm......
  • UE5笔记-实现Lumen实时渲染GI下的的类UCanvasRenderTarget实现多场景/自定义分辨率/方
    默认的SceneCapture不能用于实时Lumen光照模式下为了实现实时渲染GI下的的类似于UCanvasRenderTarget2D类.可以参考GameViewport类的源码尝试使用UE的渲染逻辑和数据多渲染一份视口副本到直接的FSceneView上,封装一份UCaptureRenderTarget出来从而实现一些例如自定义分辨率的......
  • quasar项目中用js调用串口
    参考链接:NodeSerialPort  (网站中https://serialport.io/docs/guide-electron提到了ElectronSerialportExample,这个项目中涉及到serialport的代码在renderer.js中)WebSerialAPI,web端通过串口与硬件通信电脑上已有的端口:(选择“在新标签页中打开图片”查看原图)看到网页......
  • uniapp中父组件调用子组件的方法
    1父组件<template>   <view>      <!--子组件-->      <recommen ref='xText'></recommen>    <view@click='onClick'>点击调用子组件方法</view>   </view></template><script>......
  • 一个简单的python脚本,把latex项目的调用资源放在同一级,以便arxiv
    据说上传arxiv时所有资源需要在同一目录,也就是不能有文件夹(只是据说,有人说有文件夹也行,我没试过),所以写了一个简单的小脚本把latex项目的资源(主要是图片)放在和.tex一个路径下:importosimportshutiltex_file='main.tex'img_folder='imgs'encoding_type='utf-8'withopen......
  • ToDesk勾上摄像头会看到我吗?如何关闭摄像头
    ToDesk远程控制软件除了能跨系统跨设备进行远控连接外,其实还有很多实用的小功能在日常生活派上用场。就比如远程摄像头,可以用来远程查看被控电脑的环境情况,用来监控家里宠物和小孩的情况等等。可能很多小伙伴使用的时候会顾虑,远程开启摄像头后是否会看到主控端的本人?如何关闭......
  • 使用Microsoft.SemanticKernel基于本地运行的Ollama大语言模型实现Agent调用函数
    大语言模型的发展日新月异,记得在去年这个时候,函数调用还是gpt-4的专属。到今年本地运行的大模型无论是推理能力还是文本的输出质量都已经非常接近gpt-4了。而在去年gpt-4尚未发布函数调用时,智能体框架的开发者们依赖构建精巧的提示词实现了gpt-3.5的函数调用。目前在本机运行的大......
  • 使用Sentinel进行服务调用的熔断和限流管理(SpringCloud2023实战)
    你好,这里是codetrend专栏“SpringCloud2023实战”。本文简单介绍SpringCloud2023中使用Sentinel进行限流管理。前言随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控......