当前位置: 首页 > news >正文

使用HTML5拍照

原文连接地址: Camera and Video Control with HTML5 

演示地址: HTML5拍照演示 

翻译日期: 2013年8月6日


首先,我们看看HTML代码结构,当然,这部分的DOM内容应该是在用户允许使用其摄像头事件出发后,动态加载生成的。

注意: 我们采用的是 640X480的分辨率,如果采用JS动态生成,那么您是可以灵活控制分辨率的。

 

<!-- 
		声明: 此div应该在允许使用webcam,网络摄像头之后动态生成
		宽高: 640 *480,当然,可以动态控制啦!
		-->
		<!--
	Ideally these elements aren't created until it's confirmed that the 
	client supports video/camera, but for the sake of illustrating the 
	elements involved, they are created with markup (not JavaScript)
		-->
		<video id="video" width="640" height="480" autoplay></video>
		<button id="snap">Snap Photo</button>
		<canvas id="canvas" width="640" height="480"></canvas>


JavaScript

 

只要上面的HTML元素创建完成,那么JavaScript部分将简单的超乎你想象的简单:

 

// 设置事件监听,DOM内容加载完成,和jQuery的$.ready() 效果差不多。
	window.addEventListener("DOMContentLoaded", function() {
		// canvas 元素将用于抓拍
		var canvas = document.getElementById("canvas"),
			context = canvas.getContext("2d"),
			// video 元素,将用于接收并播放摄像头 的数据流
			video = document.getElementById("video"),
			videoObj = { "video": true },
			// 一个出错的回调函数,在控制台打印出错信息
			errBack = function(error) {
				if("object" === typeof window.console){
					console.log("Video capture error: ", error.code); 
				}
			};

		// Put video listeners into place
		// 针对标准的浏览器
		if(navigator.getUserMedia) { // Standard
			navigator.getUserMedia(videoObj, function(stream) {
				video.src = stream;
				video.play();
			}, errBack);
		} else if(navigator.webkitGetUserMedia) { // WebKit-prefixed
			navigator.webkitGetUserMedia(videoObj, function(stream){
				video.src = window.webkitURL.createObjectURL(stream);
				video.play();
			}, errBack);
		}
		// 对拍照按钮的事件监听
		document.getElementById("snap").addEventListener("click", function() {
			// 画到画布上
			context.drawImage(video, 0, 0, 640, 480);
		});

	}, false);

 


最后,记得讲您的网页放到web服务器下面,然后通过http协议来访问哦。

另外,需要浏览器版本较新,并且支持HTML5的相关新特性才可以。

译者不算称职啦,没有按原文来翻译。使用的浏览器是chrome 28。

最后,贴上完整的代码,比较呆板。

 

<!DOCTYPE html>
<html>
 <head>
  <title> 浏览器webcamera </title>
  <meta name="Generator" content="EditPlus">
  <meta name="Author" content="renfufei@qq.com">
  <meta name="Description" content="inveted by: http://davidwalsh.name/browser-camera">
  <script>
	// 设置事件监听,DOM内容加载完成,和jQuery的$.ready() 效果差不多。
	window.addEventListener("DOMContentLoaded", function() {
		// canvas 元素将用于抓拍
		var canvas = document.getElementById("canvas"),
			context = canvas.getContext("2d"),
			// video 元素,将用于接收并播放摄像头 的数据流
			video = document.getElementById("video"),
			videoObj = { "video": true },
			// 一个出错的回调函数,在控制台打印出错信息
			errBack = function(error) {
				if("object" === typeof window.console){
					console.log("Video capture error: ", error.code); 
				}
			};

		// Put video listeners into place
		// 针对标准的浏览器
		if(navigator.getUserMedia) { // Standard
			navigator.getUserMedia(videoObj, function(stream) {
				video.src = stream;
				video.play();
			}, errBack);
		} else if(navigator.webkitGetUserMedia) { // WebKit-prefixed
			navigator.webkitGetUserMedia(videoObj, function(stream){
				video.src = window.webkitURL.createObjectURL(stream);
				video.play();
			}, errBack);
		}
		// 对拍照按钮的事件监听
		document.getElementById("snap").addEventListener("click", function() {
			// 画到画布上
			context.drawImage(video, 0, 0, 640, 480);
		});

	}, false);
  </script>
 </head>

 <body>
  
	<div>
		<!-- 
		声明: 此div应该在允许使用webcam,网络摄像头之后动态生成
		宽高: 640 *480,当然,可以动态控制啦!
		-->
		<!--
	Ideally these elements aren't created until it's confirmed that the 
	client supports video/camera, but for the sake of illustrating the 
	elements involved, they are created with markup (not JavaScript)
		-->
		<video id="video" width="640" height="480" autoplay></video>
		<button id="snap">Snap Photo</button>
		<canvas id="canvas" width="640" height="480"></canvas>
	</div>
 </body>
</html>



 

 

相关文章:

  • java基本数据类型
  • 中文锐推榜的优化
  • 如何下载vSphere Big Data Extensions 1.0免费试用版
  • Android深度探索读后感 第四章
  • Android官方教程翻译(4)——启动另一个Activity
  • 动态生成自定义控件ascx如何给ascx传值
  • Android UI(二)DridView的菜单
  • HTML5 预加载
  • SonarQube简介
  • ​虚拟化系列介绍(十)
  • 用Python设计第一个游戏 - 零基础入门学习Python002
  • MFC 消息
  • Asp.net常用的三十多个代码(2)
  • 1、Nginx安装和配置文件
  • 小插曲之变量和字符串 - 零基础入门学习Python003
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • CentOS7简单部署NFS
  • Debian下无root权限使用Python访问Oracle
  • express.js的介绍及使用
  • Flex布局到底解决了什么问题
  • flutter的key在widget list的作用以及必要性
  • isset在php5.6-和php7.0+的一些差异
  • laravel 用artisan创建自己的模板
  • Netty源码解析1-Buffer
  • underscore源码剖析之整体架构
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 漂亮刷新控件-iOS
  • 前端路由实现-history
  • 我是如何设计 Upload 上传组件的
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (6)添加vue-cookie
  • (9)目标检测_SSD的原理
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (十六)一篇文章学会Java的常用API
  • (十五)使用Nexus创建Maven私服
  • (转) ns2/nam与nam实现相关的文件
  • (转)EOS中账户、钱包和密钥的关系
  • (转)scrum常见工具列表
  • *** 2003
  • 、写入Shellcode到注册表上线
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .Net8 Blazor 尝鲜
  • .NET大文件上传知识整理
  • @Autowired注解的实现原理
  • @RequestMapping 的作用是什么?
  • [ CTF ] WriteUp-2022年春秋杯网络安全联赛-冬季赛
  • [<死锁专题>]
  • [acwing周赛复盘] 第 94 场周赛20230311
  • [Android]使用Android打包Unity工程
  • [daily][archlinux][game] 几个linux下还不错的游戏