WebcamJS
官网, 本文仅是WebcamJS在Github中的文档前半部分的简单翻译(最后两个话题自我感觉不实用),如果有喜欢英文或欲览全文的话请点我。
WebcamJS是一个可以通过电脑的相机进行拍照功能,并将Jpeg、png分享为Uri的库,我们可以把图片用来显示在网页中、渲染到canvas或提交到服务器。WebcamJS基于HTML5 getUserMedia,不过提供了自动且隐式的Flash回调,当浏览器不支持HTML5的getUserMedia时,WebCam会自动使用Flash,并且使用同样的Api回调(所以代码中不需要关心)。
如果想要寻找更高级的工具来替代WebcamJS的话,JpegCamera是一个不错的选择,他有很多WebcamJS不具备的高级功能,比如:一次性上传多张图片,失败重试,跨站请求伪造token,确认相机准备完成。并且他是一个很纯净的面向对象的设计。
Chrome 47版本以上中注意
谷歌浏览器对网站的安全提出了严格的要求,如果想要访问电脑的相机的,就需要使你的网站使用SSL/HTTPS。当然,WebCam也是如此。 查看详情
当然在 localhost/ 127.0.0.1. 中并不需要HTTPS,下表是Chrome中使用相机的一些规则
Scheme | Host | Port |
---|---|---|
https:// |
* |
* |
wss:// |
* |
* |
* |
localhost |
* |
* |
*.localhost |
* |
* |
127/8 |
* |
* |
::1/128 |
* |
file:// |
* |
- |
chrome-extension:// |
* |
- |
浏览器支持
WebcamJS 已经在下面的浏览器/系统中进行了测试:
OS | Browser | Notes |
---|---|---|
Mac OS X | Chrome 30+ | Works -- Chrome 47+ requires HTTPS |
Mac OS X | Firefox 20+ | Works |
Mac OS X | Safari 6+ | Requires Adobe Flash Player |
Windows | Chrome 30+ | Works -- Chrome 47+ requires HTTPS |
Windows | Firefox 20+ | Works |
Windows | IE 9 | Requires Adobe Flash Player |
Windows | IE 10 | Requires Adobe Flash Player |
Windows | IE 11 | Requires Adobe Flash Player |
例子
这里有一些关于这个库的演示(demo):
链接 | 描述 |
---|---|
Basic Demo | 展示了一个基于 320x240 相机 |
Large Demo | 实时预览时图片为320x240,实际拍摄为640x480 |
Crop Demo | 演示裁剪240x240平方出320x240的摄像头图像的中心 |
Large Crop Demo | 显示一个从640*480中采集的480x480图像,用240X240分辨率实时预览。 |
HD Demo | 拍摄一张720p HD (1280x720) 的图,(仅支持个别浏览器). |
SFX Demo | 快门声 |
Flash Demo | 强制使用flash方式 |
Freeze Demo | 在点击保存之前冻结摄像头 |
Mirror Demo | 演示翻转图像水平(镜像模式) |
Full Combo Demo | 集所有功能完成的小例子( 放大招 ) |
开源
webcamjs是开源的,MIT许可,并可以在GitHub上: https://github.com/jhuckaby/webcamjs
快速开始
把 webcam.js
和 webcam.swf
放倒你的网站中,(两个放倒同一个文件夹中),并复制下面的代码片段:
<script src="webcam.js"></script>
<div id="my_camera" style="width:320px; height:240px;"></div>
<div id="my_result"></div>
<script language="JavaScript">
Webcam.attach( '#my_camera' );
function take_snapshot() {
Webcam.snap( function(data_uri) {
document.getElementById('my_result').innerHTML = '<img src="'+data_uri+'"/>';
} );
}
</script>
<a href="javascript:void(take_snapshot())">Take Snapshot</a>
现在会放置一个相机到 my_camera
Div中,当点击Take Snapshot 时会抓取一张快照,转换为JPEG,分享一个数据的URI并将它作为<IMG SRC>
展示到my_result
DIV中,数据的URI可以绕过任何URL,可以提交到服务器(下面的例子将会展示这些)。
配置
如果你想修改默认的配置,调用 Webcam.set()
方法,填入一个hash表,key值见下表:
key值 | 默认值 | 描述 |
---|---|---|
width |
(Auto) | 相机视图的宽度,默认是Dom元素的宽度 |
height |
(Auto) | 相机视图的高度,默认是Dom元素的高度 |
dest_width |
(Auto) | 拍摄的照片的宽度,默认是相机元素的宽度 |
dest_height |
(Auto) | 拍摄的照片的高度,默认是相机元素的高度 |
crop_width |
(Disabled) | 剪切后的照片宽度,默认等于dest_width |
crop_height |
(Disabled) | 剪切后的照片高度,默认等于dest_height |
image_format |
jpeg | 拍摄照片的格式, 可以是 "jpeg" 或 "png". |
jpeg_quality |
90 | 用于JPEG 的图片, 图片的质量, 值域从 0 (最差) 到 100 (最好) |
force_flash |
false | 设置为 true将会永远使用Adobe Flash fallback 模式. |
flip_horiz |
false | 设置此为true的将翻转图像水平(镜像模式)。 |
fps |
30 | fps (frames per second) 拍摄的速率 |
swfURL |
"./webcam.swf" | 指定 Adobe Flash fallback SWF 文件的的位置 |
flashNotDetectedText |
"ERROR: No Adobe Flash Player detected. Webcam.js relies on Flash for browsers that do not support getUserMedia (like yours)." | text/html 用于没有检测到Flash时的提示 |
下面是一个重写一些配置的的例子,记住:设置属性要早于把相机赋给视图(Webcam.set()
早于Webcam.attach()
)
Webcam.set({
width: 320,
height: 240,
dest_width: 640,
dest_height: 480,
image_format: 'jpeg',
jpeg_quality: 90,
force_flash: false,
flip_horiz: true,
fps: 45
});
// Attach camera here
初始化
WebcamJS 初始化并激活通过将相机赋给一个DOM元素,这个DOM元素必须已经被创建且为空,传一个ID或则CSS的选择器给 Webcam.attach()
方法. 例如:
Webcam.attach( '#my_camera' );
这将激活用户的相机,询问必须的权限,并且开始在我们选择的DOM元素中展示相机。
注意,浏览器会询问是否允许访问用户的相机,WebcamJS没有权利越过这些,也没有方法去修改它的UI样式,不同的浏览器又一些不一样,典型的有在网页上发弹出一个窗台,Flash会在它的试图中进行提示。
拍照
拍照只需要调用 Webcam.snap()
方法,图片的URI将会通过回调方法传递给你。例如:
Webcam.snap( function(data_uri) {
document.getElementById('my_result').innerHTML = '<img src="'+data_uri+'"/>';
} );
你的function同样可以通过一个HTML5 Canvas 和 2D上下文对象(Context),所以 Your function is also passed a HTML5 Canvas and a 2D Context object, 所以你可以获得原始像素,而不是压缩图像数据的URI的.
上例子:
Webcam.snap( function(data_uri, canvas, context) {
// copy image to my own canvas
myContext.drawImage( canvas, 0, 0 );
} );
如果你仅想要WebcamJS把图片复制到你的canvas,而不是生成的数据的URI(这是一个昂贵的操作),只需要把你的canvas对象作为 Webcam.snap()
方法的第二个参数,回调函数的右边。
例如:
// assumes 'myCanvas' is a reference to your own canvas object, at the correct size
Webcam.snap( function() {
// the webcam image is now in your own canvas
}, myCanvas );
自定义图片尺寸
WebcamJS会自动的设置相机尺寸为相机所依附的DOM元素大小,然而,我们也可以通过设置width
和/或height
重写配置:
Webcam.set({
width: 320,
height: 240
});
// Attach camera here
默认照片大小等同于相机视图的,不过我们可以通过 dest_width
和/或 dest_height
设置。
例如:
Webcam.set({
width: 320,
height: 240,
dest_width: 640,
dest_height: 480,
});
// Attach camera here
裁剪图片
WebcamJS还可以为你裁剪最终的图片为任何尺寸,比如我们需要一个正方形图片时(用来设置用户头像的时候),有些摄像头会固定拍摄4:3的图片无法拍摄正方形图片,为了实现这个功能,需要添加 crop_width
和 crop_height
参数,指定裁剪的区域:
Webcam.set({
width: 320,
height: 240,
crop_width: 240,
crop_height: 240
});
// Attach camera here
这会从一个320x240图片的中心裁剪一个240x240的正方形图片,效果会显示在预览区,在这个例子中我们的相机视图同时也会被裁减为240x240,所以用户可以看到最终被拍摄的照片。
冻结/预览图像
想要在拍照前冻结你的相机? 调用 Webcam.freeze()
就可以冻结当前相机中的图片,调用 Webcam.snap()
可以保存冻结的照片,调用Webcam.unfreeze()
可以取消冻结。
设置SWF文件的位置
WebcamJS默认在JS所在目录寻找SWF文件,如果你的SWF没有放到这个目录,需要通过调用Webcam.setSWFLocation()
方法来指定你的SWF文件,它必须和你的JS文件在相同域名下:
Webcam.set("swfURL", "/path/to/the/webcam.swf");
注意:SWF(Flash)仅用在浏览器不支持 HTML5 getUserMedia时。
重置 (关闭相机)
调用 Webcam.reset()
方法可以关闭相机,同时移除添加相机时自动在DOM中添加的元素:
Webcam.reset();
想要再次使用相机,必须调用 Webcam.attach()
将相机绑定到DOM元素中 。
API Reference
方法名 | 描述 |
---|---|
Webcam.set() |
配置相机,使用健值对的方式。 |
Webcam.on() |
注册一个事件监听,设置第一个参数为事件名称,第二个参数为回调函数。 |
Webcam.off() |
移除事件监听,设置第一个参数为事件名称,第二个参数为回调函数,省去回调函数移除所有的监听。 |
Webcam.attach() |
初始化并将相机绑定在DOM元素。 |
Webcam.reset() |
关闭相机并重置所有的配置,但不移除事件监听 |
Webcam.freeze() |
冻结当前的相机 |
Webcam.unfreeze() |
取消冻结相机 |
Webcam.snap() |
拍照 (或保存冻结的照片), 通过回调方法获得照片 |
Webcam.upload() |
通过AJAX上传保存的图片 |
事件
WebcamJS支持使用简单的JavaScript来拦截一系列的事件,事件会在: 库文件加载完成,相机已打开,出错,上传成功时触发。通过调用Webcam.on()
方法可以添加事件监听。第一个参数为事件类型,第二个参数为回调方法,下面是一个事件类型的表格:
Event Name | Notes |
---|---|
load |
库文件加载完成时触发. |
live |
相机打开时触发,仅在用户同意使用相机后。 |
error |
运行出错时触发 (回调方法将会接受到一个错误字符串). |
uploadProgress |
会在上传进度变化时调用 |
uploadComplete |
上传完成时调用 |
例子:
Webcam.on( 'load', function() {
// library is loaded
} );
Webcam.on( 'live', function() {
// camera is live, showing preview image
// (and user has allowed access)
} );
Webcam.on( 'error', function(err) {
// an error occurred (see 'err')
} );
默认error
事件会展示一个提示框,不过当你设置了error
事件监听后将不会再弹出提示框。
需要注意,WebcamJS允许统一事件设置多个监听者,所以你多次调用Webcam.on()
,你的回调方法皆会添加到一个事件列表,当事件被触发时,所有的回调都会被调用。所以一个事件只调用一次 Webcam.on()
时,调用Webcam.off()
才能移除这个事件的监听者。
提交图片到服务器
Webcam.snap()
方法的回调中可以得到拍摄数据的URI,数据是使用Base64编码的二进制,你可以显示在你的页面中,同时,Webcam还提供了解码和提交数据到服务器的方法:
Webcam.snap( function(data_uri) {
// snap complete, image data is in 'data_uri'
Webcam.upload( data_uri, 'myscript.php', function(code, text) {
// Upload complete!
// 'code' will be the HTTP response code from the server, e.g. 200
// 'text' will be the raw response content
} );
} );
Webcam.upload()
方法接受3个参数: snap()
方法返回的数据URI, 服务端上传接口, 和一个上传完成的回调。同样可以指定上传完成的回调通过Webcam.on('uploadComplete', YOUR_FUNC)
。
图片的数据使用标准的multipart form post方式上传,包含在一个命名为 webcam
的form中。获取图片数据需要在服务端有类似于如下代码(PHP)
// be aware of file / directory permissions on your server
move_uploaded_file($_FILES['webcam']['tmp_name'], 'webcam.jpg');
跟踪上传进度
如果想要跟踪上传进度,可以注册uploadProgress
事件监听,他会在上传过程中多次调用,并通过一个回调方法传回一个从0.0 到 1.0的进度。下面是一个使用的展示:
Webcam.snap( function(data_uri) {
Webcam.on( 'uploadProgress', function(progress) {
// Upload in progress
// 'progress' will be between 0.0 and 1.0
} );
Webcam.on( 'uploadComplete', function(code, text) {
// Upload complete!
// 'code' will be the HTTP response code from the server, e.g. 200
// 'text' will be the raw response content
} );
Webcam.upload( data_uri, 'myscript.php' );
} );