Abstract

This document specifies the takePhoto() and grabFrame() methods, and corresponding camera settings for use with MediaStreamTracks as defined in Media Capture and Streams [GETUSERMEDIA].

Status of This Document

This section describes the status of this document at the time of its publication. Other documents may supersede this document. A list of current W3C publications and the latest revision of this technical report can be found in the W3C technical reports index at http://www.w3.org/TR/.

Comments on this document are welcomed.

This document was published by the Device and Sensors Working Group and the Web Real-Time Communications Working Group as a Working Draft. This document is intended to become a W3C Recommendation. If you wish to make comments regarding this document, please send them to public-media-capture@w3.org (subscribe, archives). All comments are welcome.

Publication as a Working Draft does not imply endorsement by the W3C Membership. This is a draft document and may be updated, replaced or obsoleted by other documents at any time. It is inappropriate to cite this document as other than work in progress.

This document was produced by groups operating under the 5 February 2004 W3C Patent Policy. W3C maintains a public list of any patent disclosures (Device and Sensors Working Group) and a public list of any patent disclosures (Web Real-Time Communications Working Group) made in connection with the deliverables of each group; these pages also include instructions for disclosing a patent. An individual who has actual knowledge of a patent which the individual believes contains Essential Claim(s) must disclose the information in accordance with section 6 of the W3C Patent Policy.

This document is governed by the 1 September 2015 W3C Process Document.

1. Introduction

The API defined in this document captures images from a valid MediaStreamTrack. The produced image can be in the form of a Blob (as defined in [FILE-API]) or as an ImageBitmap (as defined in [HTML51])). The source image is provided by the capture device that provides the MediaStreamTrack. Moreover, picture-specific settings can be optionally provided as arguments that can be applied to the device for the capture.

2. Image Capture API

The User Agent must support Promises in order to implement the Image Capture API. Any Promise object is assumed to have resolver object, with resolve() and reject() methods associated with it. The MediaStreamTrack passed to the constructor must have its kind attribute set to "video" otherwise a DOMException of type NotSupportedError will be thrown.

[Constructor(MediaStreamTrack track)]
interface ImageCapture {
    readonly        attribute MediaStreamTrack videoStreamTrack;
    readonly        attribute MediaStream      previewStream;
    [Throws]
    Promise<PhotoCapabilities> getPhotoCapabilities ();
    [Throws]
    Promise<void>              setOptions (PhotoSettings? photoSettings);
    [Throws]
    Promise<Blob>              takePhoto ();
    [Throws]
    Promise<ImageBitmap>       grabFrame ();
};

2.1 Attributes

previewStream of type MediaStream, readonly
videoStreamTrack of type MediaStreamTrack, readonly

2.2 Methods

getPhotoCapabilities
getPhotoCapabilities()ImageCapturePromisegetPhotoCapabilities()MediaStreamTrackmustImageCaptureErrorerrorDescriptionmust
  1. Gather data from the MediaStreamTrack into a PhotoCapabilities object containing the available capabilities of the device, including ranges where appropriate. The resolved PhotoCapabilities will also include the current conditions in which the capabilities of the device are found. The method of doing this will depend on the underlying device.
  2. Return a resolved promise with the PhotoCapabilities object.
No parameters.
Return type: Promise<PhotoCapabilities>
grabFrame
grabFrame()ImageCapturePromisereadyStateMediaStreamTrackmustImageCaptureErrorerrorDescriptiongrabFrame()mustImageCaptureErrorerrorDescriptionmust
  1. Gathers data from the MediaStreamTrack into an ImageBitmap object (as defined in [HTML51]). The width and height of the ImageBitmap object are derived from the constraints of the MediaStreamTrack.
  2. Returns a resolved promise with a newly created ImageBitmap object. (Note: grabFrame() returns data only once upon being invoked).
No parameters.
Return type: Promise<ImageBitmap>
setOptions
setOptions()ImageCapturePhotoSettingsmustImageCapturePromisemustmustImageCaptureErrorerrorDescription
Parameter Type Nullable Optional Description
photoSettings PhotoSettings
Return type: Promise<void>
takePhoto
takePhoto()ImageCapturePromisereadyStateVideoStreamTrackmustImageCaptureErrorerrorDescriptiontakePhoto()mustImageCaptureErrorerrorDescriptionmust
  1. Gather data from the MediaStreamTrack into a Blob containing a single still image. The method of doing this will depend on the underlying device. Devices may temporarily stop streaming data, reconfigure themselves with the appropriate photo settings, take the photo, and then resume streaming. In this case, the stopping and restarting of streaming should cause mute and unmute events to fire on the Track in question.
  2. Return a resolved promise with the Blob object.
No parameters.
Return type: Promise<Blob>

3. ImageCaptureError

[NoInterfaceObject]
interface ImageCaptureError {
    readonly        attribute DOMString? errorDescription;
};

3.1 Attributes

errorDescription of type DOMString, readonly , nullable
errorDescription

4. PhotoCapabilities

The PhotoCapabilities interface provides the photo-specific settings options and current settings values. The following definitions are assumed for individual settings and are provided for information purposes:

  1. White balance mode is a setting that cameras use to adjust for different color temperatures. Color temperature is the temperature of background light (measured in Kelvin normally). This setting can also be automatically determined by the implementation. If 'automatic' mode is selected, then the Kelvin setting for White Balance Mode may be overridden. Typical temprature ranges for different modes are provided below:
    Mode Kelvin range
    incandescent 2500-3500
    fluorescent 4000-5000
    warm-fluorescent 5000-5500
    daylight 5500-6500
    cloudy-daylight 6500-8000
    twilight 8000-9000
    shade 9000-10000
  2. Exposure is the amount of light allowed to fall on the photographic medium. Auto-exposure mode is a camera setting where the exposure levels are automatically adjusted by the implementation based on the subject of the photo.
  3. Exposure Compensation is a numeric camera setting that adjusts the exposure level from the current value used by the implementation. This value can be used to bias the exposure level enabled by auto-exposure.
  4. The ISO setting of a camera describes the sensistivity of the camera to light. It is a numeric value, where the lower the value the greater the sensitivity. This setting in most implementations relates to shutter speed, and is sometimes known as the ASA setting.
  5. Red Eye Reduction is a feature in cameras that is designed to limit or prevent the appearance of red pupils ("Red Eye") in photography subjects due prolonged exposure to a camera's flash.
  6. Brightness refers to the numeric camera setting that adjusts the perceived amount of light emitting from the photo object. A higher brightness setting increases the intensity of darker areas in a scene while compressing the intensity of brighter parts of the scene.
  7. Contrast is the numeric camera setting that controls the difference in brightness between light and dark areas in a scene. A higher contrast setting reflects an expansion in the difference in brightness.
  8. Saturation is a numeric camera setting that controls the intensity of color in a scene (i.e. the amount of gray in the scene). Very low saturation levels will result in photo's closer to black-and-white.
  9. Sharpness is a numeric camera setting that controls the intensity of edges in a scene. Higher sharpness settings result in higher edge intensity, while lower settings result in less contrast and blurrier edges (i.e. soft focus).
  10. Zoom is a numeric camera setting that controls the focal length of the lens. The setting usually represents a ratio, e.g. 4 is a zoom ratio of 4:1. The minimum value is usually 1, to represent a 1:1 ratio (i.e. no zoom).
  11. Fill light mode describes the flash setting of the capture device.
  12. Focus mode describes the focus setting of the capture device.
interface PhotoCapabilities {
                    attribute Boolean            autoWhiteBalanceMode;
                    attribute MediaSettingsRange whiteBalanceMode;
                    attribute ExposureMode       autoExposureMode;
                    attribute MediaSettingsRange exposureCompensation;
                    attribute MediaSettingsRange iso;
                    attribute Boolean            redEyeReduction;
                    attribute MediaSettingsRange brightness;
                    attribute MediaSettingsRange contrast;
                    attribute MediaSettingsRange saturation;
                    attribute MediaSettingsRange sharpness;
                    attribute MediaSettingsRange imageHeight;
                    attribute MediaSettingsRange imageWidth;
                    attribute MediaSettingsRange zoom;
                    attribute FillLightMode      fillLightMode;
                    attribute FocusMode          focusMode;
};

4.1 Attributes

autoExposureMode of type ExposureMode
ExposureMode
autoWhiteBalanceMode of type Boolean
brightness of type MediaSettingsRange
contrast of type MediaSettingsRange
exposureCompensation of type MediaSettingsRange
fillLightMode of type FillLightMode
FillLightMode
focusMode of type FocusMode
FocusMode
imageHeight of type MediaSettingsRange
imageWidth of type MediaSettingsRange
iso of type MediaSettingsRange
redEyeReduction of type Boolean
saturation of type MediaSettingsRange
sharpness of type MediaSettingsRange
whiteBalanceMode of type MediaSettingsRange
WhiteBalanceModeEnum
zoom of type MediaSettingsRange

5. PhotoSettings

The PhotoSettings object is optionally passed into the ImageCapture.setOptions() method in order to modify capture device settings specific to still imagery. Each of the attributes in this object are optional.

dictionary PhotoSettings {
             boolean       autoWhiteBalanceMode;
             unsigned long whiteBalanceMode;
             ExposureMode  autoExposureMode;
             unsigned long exposureCompensation;
             unsigned long iso;
             boolean       redEyeReduction;
             unsigned long brightness;
             unsigned long contrast;
             unsigned long saturation;
             unsigned long sharpness;
             unsigned long zoom;
             unsigned long imageHeight;
             unsigned long imageWidth;
             FillLightMode fillLightMode;
             FocusMode     focusMode;
};

5.1 Dictionary PhotoSettings Members

autoExposureMode of type ExposureMode
This reflects the desired auto exposure mode setting. Acceptable values are of type ExposureMode.
autoWhiteBalanceMode of type boolean
This reflects whether automatic White Balance Mode selection is desired.
brightness of type unsigned long
This reflects the desired brightness setting of the camera.
contrast of type unsigned long
This reflects the desired contrast setting of the camera.
exposureCompensation of type unsigned long
This reflects the desired exposure compensation setting.
fillLightMode of type FillLightMode
This reflects the desired fill light (flash) mode setting. Acceptable values are of type FillLightMode.
focusMode of type FocusMode
This reflects the desired focus mode setting. Acceptable values are of type FocusMode.
imageHeight of type unsigned long
This reflects the desired image height. The UA must select the closest height value this setting if it supports a discrete set of height options.
imageWidth of type unsigned long
This reflects the desired image width. The UA must select the closest width value this setting if it supports a discrete set of width options.
iso of type unsigned long
This reflects the desired camera ISO setting.
redEyeReduction of type boolean
This reflects whether camera red eye reduction is desired
saturation of type unsigned long
This reflects the desired saturation setting of the camera.
sharpness of type unsigned long
This reflects the desired sharpness setting of the camera.
whiteBalanceMode of type unsigned long
This reflects the desired white balance mode setting.
zoom of type unsigned long
This reflects the desired zoom setting of the camera.

6. MediaSettingsRange

interface MediaSettingsRange {
    readonly        attribute unsigned long max;
    readonly        attribute unsigned long min;
    readonly        attribute unsigned long current;
};

6.1 Attributes

current of type unsigned long, readonly
max of type unsigned long, readonly
min of type unsigned long, readonly

7. MediaSettingsItem

The MediaSettingsItem interface is now defined, which allows for a single setting to be managed.

interface MediaSettingsItem {
    readonly        attribute any value;
};

7.1 Attributes

value of type any, readonly

8. ExposureMode

enum ExposureMode {
    "frame-average",
    "center-weighted",
    "spot-metering"
};
Enumeration description
frame-average Average of light information from entire scene
center-weighted Sensitivity concentrated towards center of viewfinder
spot-metering Spot-centered weighting

9. FillLightMode

enum FillLightMode {
    "unavailable",
    "auto",
    "off",
    "flash",
    "on"
};
Enumeration description
unavailable This source does not have an option to change fill light modes (e.g., the camera does not have a flash)
auto The video device's fill light will be enabled when required (typically low light conditions). Otherwise it will be off. Note that auto does not guarantee that a flash will fire when takePhoto is called. Use flash to guarantee firing of the flash for the takePhoto() or getFrame() methods.
off The source's fill light and/or flash will not be used.
flash This value will always cause the flash to fire for the takePhoto() or getFrame() methods.
on The source's fill light will be turned on (and remain on) while the source MediaStreamTrack is active

10. FocusMode

enum FocusMode {
    "unavailable",
    "auto",
    "manual"
};
Enumeration description
unavailable This source does not have an option to change focus modes.
auto Auto-focus mode is enabled.
manual Manual focus mode is enabled.

11. Examples

11.1 Grabbing a Frame for Post-Processing

Example 1
navigator.mediaDevices.getUserMedia({video: true}).then(gotMedia, failedToGetMedia);

function gotMedia(mediastream) {
      //Extract video track.
      var videoDevice = mediastream.getVideoTracks()[0];
      // Check if this device supports a picture mode...
      var captureDevice = new ImageCapture(videoDevice);
      if (captureDevice) {
            captureDevice.grabFrame().then(processFrame(imgData));
      }
}

function processFrame(e) {
       imgData = e.imageData;
       width = imgData.width;
       height = imgData.height;
       for (j=3; j < imgData.width; j+=4)
            {
            // Set all alpha values to medium opacity
            imgData.data[j] = 128;
            }
       // Create new ImageObject with the modified pixel values
       var canvas = document.createElement('canvas');
       ctx = canvas.getContext("2d");
       newImg = ctx.createImageData(width,height);
       for (j=0; j < imgData.width; j++)
            {
            newImg.data[j] = imgData.data[j];
            }
       // ... and do something with the modified image ...
       }
}

function failedToGetMedia{
       console.log('Stream failure');
}

11.2 Taking a picture if Red Eye Reduction is activated

Example 2
navigator.getUserMedia({video: true}, gotMedia, failedToGetMedia);

   function gotMedia(mediastream) {
      //Extract video track.
      var videoDevice = mediastream.getVideoTracks()[0];
      // Check if this device supports a picture mode...
      var captureDevice = new ImageCapture(videoDevice);
      if (captureDevice) {
            if (captureDevice.photoCapabilities.redEyeReduction) {
               captureDevice.setOptions({redEyeReductionSetting:true})
                   .then(captureDevice.takePhoto()
                   .then(showPicture(blob),function(error){alert("Failed to take photo");}));
               }
            else
               console.log('No red eye reduction');
            }
        }

function showPicture(e) {
       var img = document.querySelector("img");
       img.src = URL.createObjectURL(e.data);
       }

function failedToGetMedia{
       console.log('Stream failure');
       }

11.3 Repeated grabbing of a frame

Example 3
<html>
   <body>
   <p><canvas id="frame"></canvas></p>
   <button onclick="stopFunction()">Stop frame grab</button>
   <script>
   var canvas = document.getElementById('frame');
   navigator.getUserMedia({video: true}, gotMedia, failedToGetMedia);

   function gotMedia(mediastream) {
      //Extract video track.
      var videoDevice = mediastream.getVideoTracks()[0];
      // Check if this device supports a picture mode...
      var captureDevice = new ImageCapture(videoDevice);
      var frameVar;
      if (captureDevice) {
            frameVar = setInterval(captureDevice.grabFrame().then(processFrame()), 1000);
            }
        }

function processFrame(e) {
        imgData = e.imageData;
        canvas.width = imgData.width;
        canvas.height = imgData.height;
        canvas.getContext('2d').drawImage(imgData, 0, 0,imgData.width,imgData.height);
        }

function stopFunction(e) {
        clearInterval(myVar);
        }
   </script>
   </body>
   </html>

A. References

A.1 Normative references

[FILE-API]
Arun Ranganathan; Jonas Sicking. W3C. File API. 21 April 2015. W3C Working Draft. URL: https://www.w3.org/TR/FileAPI/
[GETUSERMEDIA]
Daniel Burnett; Adam Bergkvist; Cullen Jennings; Anant Narayanan; Bernard Aboba. W3C. Media Capture and Streams. 19 May 2016. W3C Candidate Recommendation. URL: https://www.w3.org/TR/mediacapture-streams/
[HTML51]
Steve Faulkner; Arron Eicholz; Travis Leithead; Alex Danilo. W3C. HTML 5.1. 21 June 2016. W3C Candidate Recommendation. URL: https://www.w3.org/TR/html51/