ImageCapture - 提供了从相机捕获图像的方法
ImageCapture
是 MediaStream Image Capture API 的接口,提供了从相机或其他摄影设备捕获图像或照片的方法,提供了用于从通过有效 MediaStreamTrack
引用的摄影设备捕获图像的接口。
构造函数
ImageCapture()
创建一个新的 ImageCapture
对象,可用于捕获代表视频流的给定 MediaStreamTrack
的静止帧(照片)。
属性
ImageCapture.track
只读
返回对传递给构造函数的 MediaStreamTrack
的引用。
方法
ImageCapture
接口基于 EventTarget
,因此它包含该接口定义的方法以及下面列出的方法。
ImageCapture.takePhoto()
使用视频捕获设备进行单次曝光,获取 MediaStreamTrack
并返回 Promise
,其中包含了 Blob
数据。
ImageCapture.getPhotoCapabilities()
返回 Promise
,它解析为包含可用配置选项范围的 PhotoCapabilities
对象。
ImageCapture.getPhotoSettings()
返回 Promise
,它解析为包含当前照片配置设置的 PhotoSettings
对象。
ImageCapture.grabFrame()
在 MediaStreamTrack
中拍摄实时视频的快照,如果成功则返回 ImageBitmap
。
实例
以下代码取自 Chrome 的 Grab Frame - 拍照片样本。由于 ImageCapture
需要一些地方来捕获图像,下面的实例从设备的媒体设备(换句话说是相机)开始。
此实例大致显示从设备 MediaStream
中提取的 MediaStreamTrack
。然后使用该轨道创建一个 ImageCapture
对象,以便可以调用 takePhoto()
和 grabFrame()
。最后,它展示了如何将这些调用的结果应用于 canvas
对象。
var imageCapture;
function onGetUserMediaButtonClick() {
navigator.mediaDevices.getUserMedia({video: true})
.then(mediaStream => {
document.querySelector('video').srcObject = mediaStream;
const track = mediaStream.getVideoTracks()[0];
imageCapture = new ImageCapture(track);
})
.catch(error => console.log(error));
}
function onGrabFrameButtonClick() {
imageCapture.grabFrame()
.then(imageBitmap => {
const canvas = document.querySelector('#grabFrameCanvas');
drawCanvas(canvas, imageBitmap);
})
.catch(error => console.log(error));
}
function onTakePhotoButtonClick() {
imageCapture.takePhoto()
.then(blob => createImageBitmap(blob))
.then(imageBitmap => {
const canvas = document.querySelector('#takePhotoCanvas');
drawCanvas(canvas, imageBitmap);
})
.catch(error => console.log(error));
}
/* 工具 */
function drawCanvas(canvas, img) {
canvas.width = getComputedStyle(canvas).width.split('px')[0];
canvas.height = getComputedStyle(canvas).height.split('px')[0];
let ratio = Math.min(canvas.width / img.width, canvas.height / img.height);
let x = (canvas.width - img.width * ratio) / 2;
let y = (canvas.height - img.height * ratio) / 2;
canvas.getContext('2d').clearRect(0, 0, canvas.width, canvas.height);
canvas.getContext('2d').drawImage(img, 0, 0, img.width, img.height,
x, y, img.width * ratio, img.height * ratio);
}
document.querySelector('video').addEventListener('play', function() {
document.querySelector('#grabFrameButton').disabled = false;
document.querySelector('#takePhotoButton').disabled = false;
});
规范
规范 | 状态 | 备注 |
---|---|---|
MediaStream Image Capture ImageCapture 的定义 |
工作草案 | 初始定义。 |
桌面浏览器兼容性
特性 | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
基础支持 | 59 | 未知 | 未知 | 未知 | 46 | 未知 |
ImageCapture() constructor | 59 | 未知 | 未知 | 未知 | 46 | 未知 |
getPhotoCapabilities | 59 | 未知 | 未知 | 未知 | 46 | 未知 |
getPhotoSettings | 61 | 未知 | 未知 | 未知 | 46 | 未知 |
grabFrame | 59 | 未知 | 未知 | 未知 | 46 | 未知 |
takePhoto | 60 59 — 601 | 未知 | 未知 | 未知 | 47 46 — 471 | 未知 |
track | 59 | 未知 | 未知 | 未知 | 46 | 未知 |
移动浏览器兼容性
特性 | Android | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS Safari |
---|---|---|---|---|---|---|---|
基础支持 | 59 | 59 | 未知 | 未知 | 未知 | 43 | 未知 |
ImageCapture() constructor | 59 | 59 | 未知 | 未知 | 未知 | 43 | 未知 |
getPhotoCapabilities | 59 | 59 | 未知 | 未知 | 未知 | 43 | 未知 |
getPhotoSettings | 61 | 61 | 未知 | 未知 | 未知 | 43 | 未知 |
grabFrame | 59 | 59 | 未知 | 未知 | 未知 | 43 | 未知 |
takePhoto | 60 59 — 601 | 60 59 — 601 | 未知 | 未知 | 未知 | 44 43 — 441 | 未知 |
track | 59 | 59 | 未知 | 未知 | 未知 | 43 | 未知 |
1. 不支持 photoSettings
参数。