The ImageCapture interface of the MediaStream Image Capture API provides methods to enable the capture of images or photos from a camera or other photographic device. It provides an interface for capturing images from a photographic device referenced through a valid MediaStreamTrack.
ImageCapture()Creates a new ImageCapture object which can be used to capture still frames (photos) from a given MediaStreamTrack which represents a video stream.
ImageCapture.track Read only
Returns a reference to the MediaStreamTrack passed to the constructor.
ImageCapture.takePhoto()Takes a single exposure using the video capture device sourcing a MediaStreamTrack and returns a Promise that resolves with a Blob containing the data.
ImageCapture.getPhotoCapabilities()Returns a Promise that resolves with an object containing the ranges of available configuration options.
ImageCapture.getPhotoSettings()Returns a Promise that resolves with an object containing the current photo configuration settings.
ImageCapture.grabFrame()Takes a snapshot of the live video in a MediaStreamTrack, returning an ImageBitmap, if successful.
The following code is taken from Chrome's Grab Frame - Take Photo Sample. Since ImageCapture requires some place to capture an image from, the example below starts with a device's media device (in other words a camera).
This example shows, roughly, a MediaStreamTrack extracted from a device's MediaStream. The track is then used to create an ImageCapture object so that takePhoto() and grabFrame() can be called. Finally, it shows how to apply the results of these calls to a canvas object.
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;
});
| Specification |
|---|
| MediaStream Image Capture> # imagecaptureapi> |
| Desktop | Mobile | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on IOS | Samsung Internet | WebView Android | WebView on iOS | |
ImageCapture |
59 | 79 | 35 | 46 | 18.4 | 59 | No | 43 | 18.4 | 7.0 | 59 | 18.4 |
ImageCapture |
59 | 79 | 35 | 46 | 18.4 | 59 | No | 43 | 18.4 | 7.0 | 59 | 18.4 |
getPhotoCapabilities |
59 | 79 | No | 46 | 18.4 | 59 | No | 43 | 18.4 | 7.0 | 59 | 18.4 |
getPhotoSettings |
61 | 79 | No | 46 | 18.4 | 61 | No | 43 | 18.4 | 8.0 | 61 | 18.4 |
grabFrame |
59 | 79 | No | 46 | 26 | 59 | No | 43 | 26 | 7.0 | 59 | 26 |
takePhoto |
6059–60photoSettings parameter not supported. |
79 | 35 | 4746–47photoSettings parameter not supported. |
18.4 | 6059–60photoSettings parameter not supported. |
No | 4443–44photoSettings parameter not supported. |
18.4 | 8.07.0–8.0photoSettings parameter not supported. |
6059–60photoSettings parameter not supported. |
18.4 |
track |
59 | 79 | 35 | 46 | 18.4 | 59 | No | 43 | 18.4 | 7.0 | 59 | 18.4 |
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/ImageCapture