热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

H5利用JS调用摄像头实现拍照效果

首先不说废话,直接上代码的测试效果利用canvas画布将视频当前帧转换成图片的实例,其中用到了mediaDevices.getUserMedia方法。

请添加图片描述
首先不说废话,直接上代码的测试效果

利用canvas画布将视频当前帧转换成图片的实例,其中用到了 mediaDevices.getUserMedia 方法。该方法提示用户允许使用媒体输入,产生包含所请求类型的媒体轨道。包括视频轨道(由诸如照相机,视频记录设备,屏幕共享服务等的硬件或虚拟视频源产生),音频轨道(类似地,由物理或虚拟音频源,如麦克风,A / D转换器等),以及其他可能的轨道类型。

它返回一个 Promise 解析为一个 MediaStream 对象。用户如果拒绝许可,或者匹配媒体不可用,则请求会被拒绝,抛出 PermissionDeniedError 或 NotFoundError 错误。
注意:该方法只适用于本地和 https 请求,http 会提示没有权限,报 PermissionDeniedError 错误。
代码如下:

DOCTYPE html>
<html>
<head><meta charset&#61;"utf-8"><meta name&#61;"viewport" content&#61;"width&#61;device-width, initial-scale&#61;1.0"><title>testtitle><meta name&#61;"viewport" content&#61;"width&#61;device-width,height&#61;device-height,initial-scale&#61;1.0, minimum-scale&#61;1.0, maximum-scale&#61;1.0, user-scalable&#61;no"><meta name&#61;"keywords" content&#61;"test"><meta name&#61;"description" content&#61;"test"><link rel&#61;"shortcut icon" href&#61;"favicon.ico"><style>#camera{float: left;margin: 20px;}#contentHolder{width: 300px;height: 300px;margin-bottom: 10px;}#btn_snap{margin: 0 auto;border: 1px solid #f0f0f0;background: #5CACEE;color: #FFF;width: 100px;height: 36px;line-height: 36px;border-radius: 8px;text-align: center;cursor: pointer;cursor: pointer;/*禁止选择*/-webkit-touch-callout: none; /* iOS Safari */-webkit-user-select: none; /* Chrome/Safari/Opera */-khtml-user-select: none; /* Konqueror */-moz-user-select: none; /* Firefox */-ms-user-select: none; /* Internet Explorer/Edge */user-select: none; /* Non-prefixed version, currently not supported by any browser */}#imgBoxxx{width: 200px;margin: 60px 20px 20px;}
style>
head><body><div id&#61;"camera"><div id&#61;"contentHolder"><video id&#61;"video" width&#61;"300" height&#61;"300" autoplay>video><canvas style&#61;"display:none;" id&#61;"canvas" width&#61;"300" height&#61;"300">canvas>div><div id&#61;"btn_snap">拍照div>
div>body>
<script>var canvas &#61; document.getElementById("canvas"),pzBtn &#61; document.getElementById("btn_snap"),context &#61; canvas.getContext("2d"),video &#61; document.getElementById("video");alert(&#39;该页面会调用您的摄像头&#39;)// 旧版本浏览器可能根本不支持mediaDevices&#xff0c;我们首先设置一个空对象if (navigator.mediaDevices &#61;&#61;&#61; undefined) {navigator.mediaDevices &#61; {};}// 一些浏览器实现了部分mediaDevices&#xff0c;我们不能只分配一个对象// 使用getUserMedia&#xff0c;因为它会覆盖现有的属性。// 这里&#xff0c;如果缺少getUserMedia属性&#xff0c;就添加它。if (navigator.mediaDevices.getUserMedia &#61;&#61;&#61; undefined) {navigator.mediaDevices.getUserMedia &#61; function (constraints) {// 首先获取现存的getUserMedia(如果存在)var getUserMedia &#61; navigator.webkitGetUserMedia || navigator.mozGetUserMedia;// 有些浏览器不支持&#xff0c;会返回错误信息// 保持接口一致if (!getUserMedia) {return Promise.reject(new Error(&#39;getUserMedia is not implemented in this browser&#39;));}//否则&#xff0c;使用Promise将调用包装到旧的navigator.getUserMediareturn new Promise(function (resolve, reject) {getUserMedia.call(navigator, constraints, resolve, reject);});}}var constraints &#61; { audio: false, video: {width: 720,height:720} }navigator.mediaDevices.getUserMedia(constraints).then(function (stream) {var video &#61; document.querySelector(&#39;video&#39;);// 旧的浏览器可能没有srcObjectif ("srcObject" in video) {video.srcObject &#61; stream;} else {//避免在新的浏览器中使用它&#xff0c;因为它正在被弃用。video.src &#61; window.URL.createObjectURL(stream);}video.onloadedmetadata &#61; function (e) {video.play();};}).catch(function (err) {console.log(err.name &#43; ": " &#43; err.message);});pzBtn.addEventListener("click", function () {// 点击&#xff0c;canvas画图context.drawImage(video, 0, 0, 300, 300);// 获取图片base64链接var image &#61; canvas.toDataURL(&#39;image/png&#39;);// 定义一个imgvar img &#61; new Image();//设置属性和srcimg.id &#61; "imgBoxxx";img.src &#61; image;//将图片添加到页面中document.body.appendChild(img);// base64转文件function dataURLtoFile(dataurl, filename) {var arr &#61; dataurl.split(&#39;,&#39;), mime &#61; arr[0].match(/:(.*?);/)[1],bstr &#61; atob(arr[1]), n &#61; bstr.length, u8arr &#61; new Uint8Array(n);while (n--) {u8arr[n] &#61; bstr.charCodeAt(n);}return new File([u8arr], filename, {type: mime});}console.log(dataURLtoFile(image, &#39;aa.png&#39;));});
script>
html>

推荐阅读
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 本文介绍了使用Python解析C语言结构体的方法,包括定义基本类型和结构体类型的字典,并提供了一个示例代码,展示了如何解析C语言结构体。 ... [详细]
  • 本文介绍了在Python中使用zlib模块进行字符串的压缩与解压缩的方法,并探讨了其在内存优化方面的应用。通过压缩存储URL等长字符串,可以大大降低内存消耗,虽然处理时间会增加,但是整体效果显著。同时,给出了参考链接,供进一步学习和应用。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • ***byte(字节)根据长度转成kb(千字节)和mb(兆字节)**parambytes*return*publicstaticStringbytes2kb(longbytes){ ... [详细]
  • 本文介绍了解决java开源项目apache commons email简单使用报错的方法,包括使用正确的JAR包和正确的代码配置,以及相关参数的设置。详细介绍了如何使用apache commons email发送邮件。 ... [详细]
author-avatar
王艳kiki
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有