ImageCapture

ImageCapture 接口是 MediaStream Image Capture API 的一部分,它提供了一种方法,可以从相机或其他摄影设备捕获图像或照片。它为通过有效的 MediaStreamTrack 引用捕获摄影设备图像提供了一个接口。

构造函数

ImageCapture()

创建一个新的 ImageCapture 对象,该对象可用于从代表视频流的给定 MediaStreamTrack 中捕获静态帧(照片)。

实例属性

ImageCapture.track 只读

返回传递给构造函数的 MediaStreamTrack 的引用。

实例方法

ImageCapture.takePhoto()

使用来自 MediaStreamTrack 的视频捕获设备拍摄单次曝光,并返回一个 Promise,该 Promise 会解析为一个包含数据的 Blob

ImageCapture.getPhotoCapabilities()

返回一个 Promise,该 Promise 会解析为一个包含可用配置选项范围的对象。

ImageCapture.getPhotoSettings()

返回一个 Promise,该 Promise 会解析为一个包含当前照片配置设置的对象。

ImageCapture.grabFrame()

MediaStreamTrack 中的实时视频拍摄快照,如果成功,则返回一个 ImageBitmap

示例

以下代码摘自 Chrome 的 Grab Frame - Take Photo 示例。由于 ImageCapture 需要一个地方来捕获图像,因此下面的示例从设备的媒体设备(换句话说,就是相机)开始。

此示例大致展示了一个从设备 MediaStream 中提取的 MediaStreamTrack。然后使用该轨道创建 ImageCapture 对象,以便可以调用 takePhoto()grabFrame()。最后,它展示了如何将这些调用的结果应用于 canvas 对象。

js
let 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.error(error));
}

function onGrabFrameButtonClick() {
  imageCapture
    .grabFrame()
    .then((imageBitmap) => {
      const canvas = document.querySelector("#grabFrameCanvas");
      drawCanvas(canvas, imageBitmap);
    })
    .catch((error) => console.error(error));
}

function onTakePhotoButtonClick() {
  imageCapture
    .takePhoto()
    .then((blob) => createImageBitmap(blob))
    .then((imageBitmap) => {
      const canvas = document.querySelector("#takePhotoCanvas");
      drawCanvas(canvas, imageBitmap);
    })
    .catch((error) => console.error(error));
}

/* Utils */

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", () => {
  document.querySelector("#grabFrameButton").disabled = false;
  document.querySelector("#takePhotoButton").disabled = false;
});

规范

规范
MediaStream 图像捕获
# imagecaptureapi

浏览器兼容性