-
Notifications
You must be signed in to change notification settings - Fork 59
/
Copy pathindex.html
73 lines (70 loc) · 3.83 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
WebRTC的出现赋予了js操作录音设备和摄像头的能力,假如我们使用网页监控,考虑到实时传递摄像头的数据量比较大的问题,我们可以采用定时抓取摄像头抓拍的照片的方式,那么如何使用js获取摄像头拍摄照片(截取图片)的功能呢?
<!--more-->
<h2>视频流</h2>
主角仍是webRTC中的getUserMedia方法(demo使用的是推荐使用的navigator.mediaDevices.getUserMedia方法,navigator.getUserMedia也差不多)。首先,先获取到摄像头中的视频流。
<div>
<pre><video></video></pre>
</div>
<div>
<pre>var video = document.querySelector('video');
var constraints = {
audio: true,
video: {
width: 1280,
height: 720
}
};
navigator.mediaDevices.getUserMedia(constraints).then(function(mediaStream) {
video.srcObject = mediaStream;
video.onloadedmetadata = function(e) {
video.play(); // 等摄像头数据加载完成后,开始播放
};
});</pre>
</div>
分辨率不设置的话也没事,会使用默认的分辨率,如果设置了超过了硬件的分辨率,则会使用默认的上限值。
<h2>canvas绘制</h2>
为了实现图片的下载,我们需要借助canvas。首先需要将当前的数据绘制到canvas上,再利用canvas的toDataURL方法将图片转换成base64格式的图片。
<h3>分辨率</h3>
我们都知道,视频分辨率的大小,影响着canvas的大小(或canvas的裁剪大小)。我这是让canvas铺满图片,全屏裁剪的。
为了获取对应的分辨率,需要用到<a href="https://developer.mozilla.org/en-US/docs/Web/API/ImageCapture/ImageCapture" target="_blank" rel="noopener">ImageCapture</a>对象,传入的参数是一个MediaStreamTrack,而该类型需要调用MediaStream类型的<a href="https://developer.mozilla.org/en-US/docs/Web/API/MediaStream/getVideoTracks" target="_blank" rel="noopener">getVideoTracks</a>()方法。
<div>
<pre>var track = mediaStream.getVideoTracks()[0],
imageCapture = new ImageCapture(track);
// 从流中获取拍摄到的静止图片的信息
imageCapture.getPhotoSettings();</pre>
</div>
根据分辨率,设置canvas大小:
<div>
<pre>oCanvas.width = photoSettings.imageWidth;
oCanvas.height = photoSettings.imageHeight;</pre>
</div>
<h3>绘制</h3>
绘制的话,直接使用2d上下文对象的<a href="https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/drawImage" target="_blank" rel="noopener">drawImage</a>方法就行了,该方法支持传入的是一个HTMLVideoElement元素的,直接调用就可以绘制成功了。
<div>
<pre>ctx.drawImage(video, 0, 0);</pre>
</div>
<h2>下载</h2>
接下来就是利用a标签下载base64格式的图片了,在我的这篇文章<a href="http://www.zhuyuntao.cn/2017/03/10/canvas%e4%bf%9d%e5%ad%98%e5%9b%be%e7%89%87%e5%88%b0%e6%9c%ac%e5%9c%b0/" target="_blank" rel="noopener">canvas保存图片到本地</a>中有详细的说明。
给下载按钮绑定个事件,
<div>
<pre>document.getElementById('btn').onclick = function() {
ctx.drawImage(video, 0, 0);
var base64Img = canvas.toDataURL();
var oA = document.createElement('a');
oA.href = base64Img;
oA.download = '截图.png'; // 下载的文件名可以此处修改
oA.click();
};</pre>
</div>
因为只有要下载的时候才会去绘制canvas,所以将绘制过程移到了事件之中。
</body>
</html>