Testing

ImageCapture API: Browser Support, Methods, Limitations

ImageCapture API works in Chrome 59+, Edge 79+, Opera 46+, and Samsung Internet 5+. Firefox hides it behind a flag, Safari does not support it. See methods and limits.

Author

Prince Dewani

May 1, 2026

The ImageCapture API is a W3C JavaScript interface from the Web Real-Time Communications Working Group that captures still photos from a MediaStreamTrack. It works in Chrome 59+, Edge 79+, Opera 46+, and Samsung Internet 5+, while Firefox keeps it behind a flag and Safari does not support it on macOS or iOS.

This guide covers what the ImageCapture API is, the browsers that support it, its key methods, how to enable it in Firefox, and the known issues.

What is the ImageCapture API?

The ImageCapture API is a JavaScript interface that takes still photos and grabs live frames from a camera MediaStreamTrack. The W3C Web Real-Time Communications Working Group edits the spec, which exposes the ImageCapture constructor plus takePhoto, grabFrame, getPhotoCapabilities, and getPhotoSettings methods. Pages can also read camera capabilities like zoom, ISO, and white balance.

Which browsers does the ImageCapture API support?

Chromium-based desktop and Android browsers ship the ImageCapture API by default, while Firefox keeps it behind a preference flag and Safari does not support it, so global support sits at about 76% of installed browsers.

Loading browser compatibility data...

ImageCapture API compatibility in Chrome

Chrome supports the ImageCapture API from Chrome 59 on Windows, macOS, Linux, ChromeOS, and Android. Chrome 53 to 58 had the API disabled by default behind the experimental web platform features flag. Chrome 4 to 52 did not support it at all. Chrome for Android tracks the same desktop release line, so Pixel and Android tablet users on Chrome 59+ get takePhoto, grabFrame, and the photo capability methods.

ImageCapture API compatibility in Edge

Microsoft Edge supports the ImageCapture API from Edge 79 on Windows, macOS, and Linux, the first Chromium-based Edge release. Pre-Chromium EdgeHTML versions 12 to 18 never added the API. Edge on Android and Edge on iOS inherit the support story of the underlying engine, so Edge for Android matches Chrome for Android while Edge for iOS uses WebKit and does not support it.

ImageCapture API compatibility in Firefox

Firefox keeps the ImageCapture API disabled by default in every version on Windows, macOS, Linux, and Android. The dom.imagecapture.enabled preference in about:config turns it on, but only takePhoto and grabFrame are implemented. getPhotoCapabilities, getPhotoSettings, and the photo-options object throw NotSupportedError, so feature-detect each method, not just the constructor.

ImageCapture API compatibility in Safari

Safari does not support the ImageCapture API on macOS, iPadOS, or iOS in any stable version, including Safari 26. WebKit has shown partial scaffolding in Safari Technology Preview, but takePhoto and grabFrame remain unshipped on stable. iPhone and iPad pages have to draw a hidden video element to a canvas and call canvas.toBlob as the fallback path.

ImageCapture API compatibility in Opera

Opera supports the ImageCapture API from Opera 46 on Windows, macOS, and Linux. Opera 40 to 45 had it disabled by default behind the experimental web platform features flag. Opera 9 to 39 did not support it. Opera Mobile on Android tracks the Chromium release after Opera Mobile 80, while Opera Mini on any platform never adds the API because the proxy renderer cannot stream a camera.

ImageCapture API compatibility in Samsung Internet

Samsung Internet supports the ImageCapture API from Samsung Internet 5 on Galaxy phones and tablets. Every newer Samsung Internet build inherits the same Chromium plumbing, so takePhoto, grabFrame, and the photo capability methods work without a flag. The Galaxy camera hardware adds extra zoom, ISO, and white-balance ranges that show up in getPhotoCapabilities.

ImageCapture API compatibility in Android Browser

Chrome for Android supports the ImageCapture API from Chrome 59. The legacy stock Android Browser based on the system WebView only exposes the API on Android devices that ship a recent Chromium WebView. Firefox for Android does not support it because the desktop dom.imagecapture.enabled flag does not surface in the Android about:config UI.

ImageCapture API compatibility in Internet Explorer

Internet Explorer does not support the ImageCapture API in any version from IE 5.5 to IE 11. The API depends on getUserMedia, the MediaStream pipeline, and Promises, none of which the Trident engine ever shipped. Microsoft has retired Internet Explorer, so move any IE-bound camera code to Chromium-based Edge.

Note

Note: The ImageCapture API breaks across Safari, Firefox, and iOS. Test it on real browsers and OS with TestMu AI. Try TestMu AI free!

What are the key methods of the ImageCapture API?

The ImageCapture API gives a page two ways to pull pixels from a live camera and three ways to inspect or change the camera settings. The headline methods build on a single MediaStreamTrack passed into the constructor.

  • new ImageCapture(track): Creates an ImageCapture object bound to a MediaStreamTrack of kind video. The track must come from getUserMedia or another live source, not a video element.
  • takePhoto(photoSettings): Returns a Promise that resolves to a full-resolution Blob from a real camera shutter event. The optional photoSettings object accepts fillLightMode, redEyeReduction, imageHeight, imageWidth, and imageOrientation.
  • grabFrame: Returns a Promise that resolves to an ImageBitmap snapshot at the live video resolution. It runs faster than takePhoto because it skips the shutter pipeline, so use it for QR scanning, barcode reading, or any preview-grade use case.
  • getPhotoCapabilities: Returns a Promise with a PhotoCapabilities object that lists the camera's allowed ranges for redEyeReduction, imageHeight, imageWidth, and fillLightMode. Pair the values with applyConstraints on the track to push or pull the camera into a known state.
  • getPhotoSettings: Returns a Promise with the current PhotoSettings object, including the active imageHeight, imageWidth, and fillLightMode. Read it after applyConstraints to confirm the camera honored the request.
  • track.applyConstraints: Lives on the underlying MediaStreamTrack and accepts zoom, focusMode, exposureMode, whiteBalanceMode, iso, brightness, contrast, saturation, sharpness, torch, and pointsOfInterest constraints. Most photo-mode camera controls live here, not on the ImageCapture object.

Paste this snippet into the DevTools console of Chrome, Edge, or Opera. Click anywhere on the page and a still photo from the front camera appears below.

// Paste this into a Chrome, Edge, or Opera DevTools console to confirm ImageCapture support and snap a photo.
async function snapPhoto() {
  if (typeof ImageCapture === "undefined") {
    console.log("ImageCapture is not supported in this browser.");
    return;
  }

  const stream = await navigator.mediaDevices.getUserMedia({ video: true });
  const [track] = stream.getVideoTracks();
  const capture = new ImageCapture(track);

  const blob = await capture.takePhoto();
  console.log("Photo captured:", blob.type, blob.size, "bytes");

  const preview = document.createElement("img");
  preview.src = URL.createObjectURL(blob);
  document.body.appendChild(preview);

  track.stop();
}

document.body.addEventListener("click", snapPhoto, { once: true });
...

How do you enable the ImageCapture API in Firefox?

Firefox ships the ImageCapture API in every desktop and Android build, but the dom.imagecapture.enabled preference is off by default. Flip the preference in about:config to expose the constructor, and only takePhoto and grabFrame will work after that.

  • Open about:config: Type about:config into the Firefox address bar and press Enter. Click Accept the Risk and Continue on the warning page.
  • Search for the preference: In the search box at the top, paste dom.imagecapture.enabled and look for the boolean entry in the results list.
  • Toggle the boolean to true: Click the toggle button on the right of the row. The value flips from false to true and the row turns bold to mark a user-set preference.
  • Reload the tab: Press Ctrl plus R, or Cmd plus R on macOS, to reload any page that needs the API. The ImageCapture constructor becomes visible on window after the reload.
  • Confirm support in DevTools: Open the Firefox DevTools console and run typeof ImageCapture. The console prints function once the flag is on, and undefined while it is off.

If typeof ImageCapture still prints undefined, the page is loaded over plain http or inside a private window with secure-context restrictions. Reload the page from an https origin or from http://localhost and the constructor shows up.

What are the known issues with the ImageCapture API?

The ImageCapture API ships unevenly across browsers and exposes hardware that misbehaves on the same chip across vendors. The painful edge cases tend to land on Safari, Firefox feature gaps, and camera control quirks.

  • Safari and iOS have no ImageCapture: Safari on macOS, iPadOS, and iOS does not support takePhoto or grabFrame. Every iPhone and iPad visitor needs a hidden video plus canvas drawImage fallback.
  • Firefox only ships takePhoto and grabFrame: Even with dom.imagecapture.enabled on, getPhotoCapabilities, getPhotoSettings, and the photoSettings argument throw NotSupportedError. Skip the capability calls entirely on Firefox or wrap them in a try-catch.
  • Track must be live, not muted: The constructor throws DOMException InvalidStateError if the MediaStreamTrack is ended, muted by the user, or kind audio. Always check track.readyState equals live before you new up an ImageCapture.
  • HTTPS or localhost only: ImageCapture depends on getUserMedia, which only resolves on secure contexts. Plain http production pages get a SecurityError on the very first user-media call, before ImageCapture even runs.
  • takePhoto can return a video frame: Some Android camera drivers fall back to a grabFrame-style bitmap instead of a true shutter capture. Inspect blob.type and blob.size to spot the fallback, since a real photo is usually larger than 200 KB while a video frame is closer to 30 KB.
  • Torch and pan-tilt-zoom are device-gated: torch, pan, tilt, and zoom only work on cameras whose driver advertises them in getCapabilities. iPhone and most laptop webcams skip the entries, so guard every applyConstraints call with the capability check.
  • One ImageCapture per track: A single track can back many ImageCapture objects, but only one takePhoto can be in flight at a time. Concurrent calls reject with InvalidStateError, so chain them with await.
  • Chrome deprecation watch: The Chromium team has discussed deprecating the API in favor of the newer Image Capture extension on MediaTrackSettings. The constructor still ships in stable Chrome, but plan a migration path if you build new code.

In my experience, the trickiest failure is the Firefox capability gap paired with optimistic feature detection. Code that checks typeof ImageCapture and assumes the full API throws halfway through the photo flow on Firefox, because getPhotoCapabilities is missing while the constructor is present. Feature-detect each method on the prototype, not just the constructor on window, and the cross-browser path stays clean.

...

Citations

All ImageCapture API version numbers and platform notes in this guide come from these primary sources:

Author

Prince Dewani is a Community Contributor at TestMu AI, where he manages content strategies around software testing, QA, and test automation. He is certified in Selenium, Cypress, Playwright, Appium, Automation Testing, and KaneAI. Prince has also presented academic research at the international conference PBCON-01. He further specializes in on-page SEO, bridging marketing with core testing technologies. On LinkedIn, he is followed by 4,300+ QA engineers, developers, DevOps experts, tech leaders, and AI-focused practitioners in the global testing community.

Open in ChatGPT Icon

Open in ChatGPT

Open in Claude Icon

Open in Claude

Open in Perplexity Icon

Open in Perplexity

Open in Grok Icon

Open in Grok

Open in Gemini AI Icon

Open in Gemini AI

Copied to Clipboard!
...

3000+ Browsers. One Platform.

See exactly how your site performs everywhere.

Try it free
...

Write Tests in Plain English with KaneAI

Create, debug, and evolve tests using natural language.

Try for free

Frequently asked questions

Did you find this page helpful?

More Related Hubs

TestMu AI forEnterprise

Get access to solutions built on Enterprise
grade security, privacy, & compliance

  • Advanced access controls
  • Advanced data retention rules
  • Advanced Local Testing
  • Premium Support options
  • Early access to beta features
  • Private Slack Channel
  • Unlimited Manual Accessibility DevTools Tests