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

瀏覽器相容性