​为了在QT上实现打开摄像头,拍照等操作。就写了这个。

1. 写一个vue组件

先写一个vue的组件,其内容基本如下:

<el-button type="primary" @click="openVideo">打开摄像头</el-button>
<el-button @click="closeVideo">关闭摄像头</el-button>
<el-button type="danger" @click="screenshot">截图</el-button>
<div><video id="video" ref="video" />
</div>
<canvas ref="canvas" width="400" height="300" style="display:none" />
<!-- 截图展示图片 -->
<img ref="screenshot">

2. 打开摄像头

// 打开摄像头openVideo() {// 老的浏览器可能根本没有实现 mediaDevices,所以我们可以先设置一个空的对象console.log("navigator.mediaDevices", navigator.mediaDevices);if (navigator.mediaDevices === undefined) {navigator.mediaDevices = {};}// 一些浏览器部分支持 mediaDevices。我们不能直接给对象设置 getUserMedia// 因为这样可能会覆盖已有的属性。这里我们只会在没有getUserMedia属性的时候添加它。if (navigator.mediaDevices.getUserMedia === undefined) {navigator.mediaDevices.getUserMedia = constraints => {// 首先,如果有getUserMedia的话,就获得它const getUserMedia =navigator.getUserMedia ||(navigator.getUserMedia =navigator.mozGetUserMedia ||navigator.webkitGetUserMedia ||navigator.msGetUserMedia);console.log("getUserMedia", getUserMedia);// 一些浏览器根本没实现它 - 那么就返回一个error到promise的reject来保持一个统一的接口if (!getUserMedia) {return Promise.reject(new Error("该浏览器暂不支持摄像头!"));}// 否则,为老的navigator.getUserMedia方法包裹一个Promisereturn new Promise((resolve, reject) => {getUserMedia.call(navigator, constraints, resolve, reject);});};}const constraints = {audio: true,video: {width: { ideal: 1280, max: 1920 },height: { ideal: 720, max: 1080 }}};console.log("window.navigator", window.navigator);window.navigator.mediaDevices.getUserMedia(constraints).then(stream => {const video = this.$refs.video;// 旧的浏览器可能没有srcObjectif ("srcObject" in video) {video.srcObject = stream;} else {// 防止在新的浏览器里使用它,因为它已经不再支持了video.src = window.URL.createObjectURL(stream);}video.onloadedmetadata = e => {video.play();};}).catch(err => {console.log(err.name + ": " + err.message);});}

没错,这个代码是在mdn上的,几乎没有任何改变,例子讲的挺好的。

3. 截图并保存

// 截图screenshot() {// 获取视频const video = this.$refs.video;// 获取截图的地址const screenshot = this.$refs.screenshot;// 获取canvasconst canvas = this.$refs.canvas;// 渲染一个2d平面的视图const ctx = canvas.getContext("2d");// 设置canvas 视图文件地址和大小ctx.drawImage(video, 0, 0, 400, 300);// 将数据转为base64赋值给img标签的src属性screenshot.src = canvas.toDataURL("image/png");console.log("screenshot.src", screenshot.src);const imgData = canvas.toDataURL("image/png").replace("image/png", "image/octet-stream");// 下载图片到本地const save_link = document.createElementNS("http://www.w3.org/1999/xhtml","a");save_link.href = imgData;save_link.download = "file_" + new Date().getTime() + ".png";save_link.click();}

4. 关闭摄像头

// 关闭摄像头closeVideo() {console.log("srcObject", this.$refs.video.srcObject);const srcObject = this.$refs.video.srcObject ? this.$refs.video.srcObject.getTracks() : this.$refs.video.src.getTracks()srcObject.forEach(track => {track.stop();this.$refs.video.src = null;});},

关闭摄像头,是先获取这个这个视频所在的任务,然后关闭每一个任务,并将其地址设为空。

5. 在electron遇到的问题

开发的时候,在electron中使用遇到调用不了摄像头的问题。经过多次debug之后,发现是http和https的原因。

所以打包好后的文件在electron中使用,是可以调用摄像头并截图保存的。

调用摄像头_摄像头 | 浏览器调用摄像头并实现截图保存的效果相关推荐

  1. 加载cv2调用摄像头_用Python获取摄像头并实时控制人脸

    Python基础视频教程 入门免费观看-创客学院​www.makeru.com.cn 实现流程 从摄像头获取视频流,并转换为一帧一帧的图像,然后将图像信息传递给opencv这个工具库处理,返回灰度图像 ...

  2. php h5 调用摄像头_利用html5调用本地摄像头拍照上传图片

    [php]代码库html5概念啥的就不废话了,不知道的 百度, 谷歌一堆..今天学了学html5中的Canvas结合新增的标签来获取本地摄像头,在html5之前,要在浏览器获取本地摄像头只有通过插件( ...

  3. html调起苹果手机摄像头_使用HTML5+调用手机摄像头和相册

    前言: 前端时间使用HTML5作了一个WEB端APP,其中用到了H5页面调用手机摄像头的功能,当时也是花了很多时间去研究.最终是采用了HTML5plus(HTML5+)的方式完成了该功能,现将具体方法 ...

  4. matlab打开笔记本摄像头_基于MATLAB调用电脑摄像头获取视频和图像

    clear all; h=waitbar(0.1,'请等待');%waitbar的作用是打开或者更新进度条 h = waitbar(x,'message')x表示进度条的比例长度,message是在进 ...

  5. python 控制手机摄像头_用Python获取摄像头并实时控制人脸 !

    实现流程从摄像头获取视频流,并转换为一帧一帧的图像,然后将图像信息传递给opencv这个工具库处理,返回灰度图像(就像你使用本地静态图片一样) 程序启动后,根据监听器信息,使用一个while循环,不断 ...

  6. python恶搞代码打开对方摄像头_用Python获取摄像头并实时控制人脸的实现示例

    实现流程 从摄像头获取视频流,并转换为一帧一帧的图像,然后将图像信息传递给opencv这个工具库处理,返回灰度图像(就像你使用本地静态图片一样) 程序启动后,根据监听器信息,使用一个while循环,不 ...

  7. python控制网络摄像头_用Python控制摄像头拍照并发邮件

    码农那点事儿 关注我们,一起学习进步 00 概述 前言 工具 思路 安装及导入包 设置参数 实现拍照 构造邮件内容 发送邮件 判断网络连接 开机自启 后记 o1 前言 为什么会有写这个程序的想法呢? ...

  8. usb 多路摄像头_拆解:升降摄像头的荣耀X10 5G,如何平衡内部空间?

    在5G手机发布后,由于器件的增多,占用空间不小的升降摄像头先前仅在Nex3中出现过.而近期新发布的华为荣耀X10也选择了升降摄像头,今天我们就来看看,荣耀X10是如何分布内部器件的,又是如何放置升降模 ...

  9. 两个前置摄像头_前后六颗摄像头?vivo V17 Pro率先实现升降式前置双摄

    9月8日消息,据外媒smeaker报道,近日,vivo Indonesia在网络上曝出了vivo V17 Pro手机的渲染图.据悉,vivo V17 Pro是vivo即将推出的最新旗舰系列,它也将是世 ...

最新文章

  1. class括号里的object_Python入门 类class 基础篇
  2. 【错误记录】Flutter 报错 ( Dart SDK is not configured )
  3. HighNewTech之Job:关于人工智能领域专业的公司求职数据分析(最全)
  4. CentOS 7 下安装 mysql ,以及用到的命令
  5. 图片日志:深拷贝和浅拷贝的区别/序列化及反序列化
  6. 第十周 11.1-11.7
  7. 微软与 OpenAI 达成合作,获得 GPT-3 独家使用授权!
  8. 在Fedora8上配置Apache Httpd
  9. GitHub 热榜:不用 PS,一键去除照片中的对象,这个神器可试玩
  10. PhpSpreadsheet 生成圆饼图
  11. OMNeT++下载、安装及实例tictoc1-tictoc18
  12. GTX高速收发器Transceiver之发射端Transmitter(UG476)
  13. 对抗样本生成算法之DeepFool算法
  14. java put方式提交_java – 通过HTTP PUT请求上传文件
  15. 推荐一个可能是最全的Venn图一站式绘制工具
  16. 大佬们抖音带货流水都过亿 普通人有什么抖音变现的好方式
  17. 常用的加密有哪些?在Java中如何实现?(MD5、AES、RSA)
  18. C.Defuse the Bombs(简单二分)
  19. el-table 点击单元格可编辑 点击表头可修改 右击表头删除表头和内容
  20. 希尔排序大详解,保证10分钟内学会希尔排序(进化版插入排序)

热门文章

  1. (四)Java B2B2C o2o多用户商城 springcloud架构-断路器(Hystrix)
  2. Git的学习与使用(五)——Git 创建仓库
  3. 亚马逊正发力人工智能
  4. 修改文档框架:word-多级列表与标题样式相结合
  5. 再次推荐数据安全清除软件----Eraser
  6. C 盘FAT32变为 RAW 格式
  7. Receiver ED、Link quality indicator (LQI)、Clear channel assessment (CCA)究竟是什么?802.15.4标准
  8. 编译microwindow(nano-X) 及flnx-0.18
  9. Manage Service Appointments
  10. JSP的概念||原理||JSP的脚本||JSP的内置对象||response.getWriter()和out.write()的区别||案例:改造Cookie案例