MediaStream画像キャプチャ

W3C作業草案,

この文書の詳細情報
このバージョン:
https://www.w3.org/TR/2025/WD-image-capture-20250423/
最新公開バージョン:
https://www.w3.org/TR/image-capture/
編集者草案:
https://w3c.github.io/mediacapture-image/
以前のバージョン:
履歴:
https://www.w3.org/standards/history/image-capture/
フィードバック:
public-webrtc@w3.org 件名 “[image-capture] … メッセージのトピック …” (アーカイブ)
GitHub
編集者:
(Google LLC)
Rijubrata Bhaumik (Intel Corporation)
前編集者:
Giridhar Mandyam (Qualcomm Innovation Center Inc.)
参加方法:
メーリングリスト
GitHubリポジトリ (新しい課題, オープン課題)
実装状況:
実装状況
Image Captureは利用可能ですか?
ポリフィル:
GoogleChromeLabs/imagecapture-polyfill

概要

本書は写真撮影のための手法とカメラ設定について規定します。画像のソースは、MediaStreamTrackによって参照することができます。

この文書のステータス

このセクションは、公開時点での本書のステータスについて説明します。W3Cの最新の公開文書や技術レポートの最新版は、W3C技術レポートインデックス https://www.w3.org/TR/でご覧いただけます。

本書は、Web Real-Time Communications作業グループによって、勧告トラックを用いてWorking Draftとして公開されました。本書はW3C勧告となる予定です。

本書に関するコメントを送信したい場合は、public-webrtc@w3.org (購読, アーカイブ)までお送りください。 メール送信時には、件名に「image-capture」と記載し、できれば以下のようにしてください: “[image-capture] …コメントの要約…”。 すべてのコメントを歓迎します。

Working Draftとしての公開は、W3Cおよびその会員による承認を意味するものではありません。本書は草案であり、随時更新・差替え・廃止される可能性があります。本書を進行中の作業以外として引用するのは不適切です。

本書はW3C特許ポリシーのもとで運営されるグループによって作成されました。 W3Cは、グループの成果物に関連した公開特許開示リストを管理しています。 このページには特許開示方法の説明も含まれています。 特許の必須クレームを含むと考えられる特許を知っている方は、W3C特許ポリシー第6節に従って情報を開示してください。

本書は、2023年11月3日W3Cプロセス文書に従って管理されています。

1. はじめに

この文書で定義されているAPIは、有効なMediaStreamTrack [GETUSERMEDIA]を介して参照される写真撮影デバイスから画像をキャプチャします。 生成された画像はBlobtakePhoto()メソッド参照)や、ImageBitmapgrabFrame()参照)として取得できます。

機能や設定の取得、制約の適用は、対象が動画MediaStreamTrack かどうかによって2通りの方法があります。写真固有の機能や現在の設定はgetPhotoCapabilities()getPhotoSettings() で取得でき、takePhoto()PhotoSettings 引数で設定できます。動画関連の機能・設定・制約の操作はMediaStreamTrackの拡張メカニズムを通じて行います。

2. セキュリティとプライバシーに関する考慮事項

プライバシーとセキュリティの考慮事項[GETUSERMEDIA]で議論されており、この拡張仕様にも適用されます。

さらに、実装者はキャプチャされた画像からプライバシーに関わるデータの漏洩が追加で発生しないよう注意すべきです。 たとえば、デジタル画像のメタデータ(例:EXIF)にユーザーの位置情報が埋め込まれると、ユーザーが予期しないプライベート情報が送信される可能性があります。

3. 画像キャプチャAPI

ユーザーエージェントはImage Capture APIを実装するためにPromiseをサポートしなければなりません。すべてのPromise オブジェクトには、resolve()およびreject()メソッドを持つリゾルバオブジェクトがあるものとします。

[Exposed=Window, SecureContext]
interface ImageCapture {
   constructor(MediaStreamTrack videoTrack);
   Promise<Blob>              takePhoto(optional PhotoSettings photoSettings = {});
   Promise<PhotoCapabilities> getPhotoCapabilities();
   Promise<PhotoSettings>     getPhotoSettings();

   Promise<ImageBitmap>       grabFrame();

   readonly attribute MediaStreamTrack track;
};
takePhoto() は、Blob形式でエンコードされたキャプチャ画像を返し、 grabFrame()track の動画フィードから非エンコードのImageBitmapスナップショットを返します。

3.1. 属性

track, MediaStreamTrack, 読み取り専用
コンストラクタに渡されたMediaStreamTrackです。

3.2. メソッド

ImageCapture(MediaStreamTrack videoTrack)
パラメータ Nullable Optional 説明
videoTrack MediaStreamTrack データのソースとして使用されるMediaStreamTrackです。これはtrack 属性の値になります。コンストラクタに渡されたMediaStreamTrackkind 属性が"video"でなければ、DOMExceptionNotSupportedError 型がスローされます。
takePhoto(optional PhotoSettings photoSettings)
takePhoto() は、track をソースとするビデオキャプチャデバイスを用いて、設定されたPhotoSettings を含めて、単一の写真露光の結果を生成し、成功した場合はBlob 形式でエンコードされた画像を返します。このメソッドが呼び出された際、ユーザーエージェントは以下の手順を実行しなければなりません:
  1. コンストラクターで提供されたreadyStatetrackに対してliveでない場合、a promise rejected with、名前がInvalidStateErrorの新しいDOMExceptionを返し、これらの手順を中止する。
  2. pを新しいプロミスとする。
  3. 以下の手順を並列で実行する:
    1. trackの基盤となるソースから定義されたphotoSettingsを用いて、Blobに単一の静止画像としてデータを収集する。この方法は基盤となるデバイスによって異なる。
      デバイスは一時的にデータのストリーミングを停止し、適切な写真設定で再構成し、写真を撮影し、その後ストリーミングを再開してもよい(MAY)。この場合、ストリーミングの停止と再開は、該当するtrackでonmuteおよびonunmuteイベントが発火するべきである(SHOULD)。
    2. 何らかの理由で操作が完了できない場合(例えば、takePhoto()メソッド呼び出しが短時間に複数回行われた場合など)、pを名前がUnknownErrorの新しいDOMExceptionで拒否し、これらの手順を中止する。
    3. pをBlobオブジェクトで解決する。
  4. pを返す。
パラメータ Nullable Optional 説明
settings PhotoSettings 適用されるPhotoSettings 辞書。
getPhotoCapabilities()
getPhotoCapabilities() は、利用可能な設定オプションの範囲を取得するために使用されます(存在する場合)。このメソッドが呼び出されたとき、ユーザーエージェントは以下の手順を実行しなければなりません:
  1. コンストラクタで指定された readyStatetrack に対して live でない場合、 新しい DOMException(名前が InvalidStateError)で拒否された promise を返し、これらの手順を中止する。
  2. p を新しい promise とする。
  3. 以下の手順を並列で実行する:
    1. track からデータを収集し、デバイスの利用可能な機能(必要に応じて範囲を含む)を含む PhotoCapabilities 辞書に格納する。この方法は基盤となるデバイスによって異なる。
    2. 何らかの理由でデータが収集できない場合(例: MediaStreamTrack が非同期に終了した場合)、p を新しい DOMException (名前が OperationError)で拒否し、これらの手順を中止する。
    3. pPhotoCapabilities 辞書で解決する。
  4. p を返す。
getPhotoSettings()
getPhotoSettings() は、現在の設定値を取得するために使用されます(存在する場合)。このメソッドが呼び出されたとき、ユーザーエージェントは以下の手順を実行しなければなりません:
  1. コンストラクタで指定された readyStatetrack に対して live でない場合、 新しい DOMException(名前が InvalidStateError)で拒否された promise を返し、これらの手順を中止する。
  2. p を新しい promise とする。
  3. 以下の手順を並列で実行する:
    1. track からデータを収集し、デバイスが現在置かれている条件を含む PhotoSettings 辞書に格納する。この方法は基盤となるデバイスによって異なる。
    2. 何らかの理由でデータが収集できない場合(例: MediaStreamTrack が非同期に終了した場合)、p を新しい DOMException (名前が OperationError)で拒否し、これらの手順を中止する。
    3. pPhotoSettings 辞書で解決する。
  4. p を返す。
grabFrame()
grabFrame() は、track で保持されているライブビデオのスナップショットを撮影し、成功すると ImageBitmap を返します。grabFrame() は、呼び出された時点で一度だけデータを返します。このメソッドが呼び出されたとき、ユーザーエージェントは以下の手順を実行しなければなりません:
  1. コンストラクタで指定された readyStatetrack に対して live でない場合、 新しい DOMException(名前が InvalidStateError)で拒否された promise を返し、これらの手順を中止する。
  2. p を新しい promise とする。
  3. 以下の手順を並列で実行する:
    1. track からデータを収集し、ImageBitmap オブジェクトに格納する。width および height の値は track の制約から導かれる。
    2. 何らかの理由で操作が完了できない場合(例: 複数の grabFrame()/takePhoto() メソッドが短時間で連続して呼び出された場合)、p を新しい DOMException (名前が UnknownError)で拒否し、これらの手順を中止する。
    3. pImageBitmap オブジェクトで解決する。
  4. p を返す。

4. PhotoCapabilities(写真機能)

dictionary PhotoCapabilities {
    RedEyeReduction         redEyeReduction;
    MediaSettingsRange      imageHeight;
    MediaSettingsRange      imageWidth;
    sequence<FillLightMode> fillLightMode;
};

4.1. Members(メンバー)

redEyeReduction, of type RedEyeReduction
ソースの赤目軽減機能。
imageHeight, of type MediaSettingsRange
UAがサポートする画像の高さの範囲を示します。
imageWidth, of type MediaSettingsRange
UAがサポートする画像の幅の範囲を示します。
fillLightMode, of type sequence<FillLightMode>
サポートされているフィルライトモード(フラッシュ)設定を示します(存在する場合)。
サポートされている解像度は、imageWidth および imageHeight の範囲として分離して提示されます。これはフィンガープリンティングのリスクを増加させないためと、UAが実際のハードウェア構成に関して最善の判断を行えるようにするためです。

5. PhotoSettings(写真設定)

dictionary PhotoSettings {
    FillLightMode   fillLightMode;
    double          imageHeight;
    double          imageWidth;
    boolean         redEyeReduction;
};

5.1. Members(メンバー)

redEyeReduction, of type boolean
カメラの赤目軽減を希望するかどうかを示します。
imageHeight, of type double
希望する画像の高さを示します。UAが離散的な高さオプションのみサポートする場合、最も近い値が選択されます。
imageWidth, of type double
希望する画像の幅を示します。UAが離散的な幅オプションのみサポートする場合、最も近い値が選択されます。
fillLightMode, of type FillLightMode
希望するフィルライトモード(フラッシュ)設定を示します。

6. MediaSettingsRange(メディア設定範囲)

dictionary MediaSettingsRange {
    double max;
    double min;
    double step;
};

6.1. Members(メンバー)

max, of type double
この設定の最大値
min, of type double
この設定の最小値
step, of type double
この設定の連続する値の最小差分。

7. RedEyeReduction(赤目軽減)

enum RedEyeReduction {
    "never",
    "always",
    "controllable"
};

7.1. Values(値)

never
デバイスで赤目軽減は利用できません。
always
デバイスで赤目軽減が利用可能で、常に有効化されています。
controllable
デバイスで赤目軽減が利用可能で、redEyeReductionを通じてユーザーが制御できます。

8. FillLightMode(フィルライトモード)

enum FillLightMode {
    "auto",
    "off",
    "flash"
};

8.1. Values(値)

auto
ビデオデバイスのフィルライトは必要な場合(通常は低照度時)に有効化されます。それ以外はオフになります。autoはtakePhoto() 実行時に必ずフラッシュが発光することを保証しません。flash を使用すると、takePhoto() メソッドで必ずフラッシュが発光します。
off
ソースのフィルライトやフラッシュは使用されません。
flash
この値はtakePhoto() メソッドで必ずフラッシュが発光します。

9. Extensions(拡張)

このセクションでは、制約可能なプロパティの新しいセットを定義します。 MediaStreamTrack に適用することで、写真撮影により適した動作にできます。これらの制約はMediaStreamTrackgetCapabilities()getSettings()getConstraints() および applyConstraints() を通じて、ImageCapture オブジェクトの track の動作を変更します。

9.1. MediaTrackSupportedConstraints dictionary(辞書)

MediaTrackSupportedConstraints は、写真機能を制御するためにUAが認識する制約のリストで拡張されます。この辞書はMediaDevicesgetSupportedConstraints() メソッドで取得できます。

partial dictionary MediaTrackSupportedConstraints {
    boolean whiteBalanceMode = true;
    boolean exposureMode = true;
    boolean focusMode = true;
    boolean pointsOfInterest = true;

    boolean exposureCompensation = true;
    boolean exposureTime = true;
    boolean colorTemperature = true;
    boolean iso = true;

    boolean brightness = true;
    boolean contrast = true;
    boolean pan = true;
    boolean saturation = true;
    boolean sharpness = true;
    boolean focusDistance = true;
    boolean tilt = true;
    boolean zoom = true;
    boolean torch = true;
};

9.1.1. Members(メンバー)

whiteBalanceMode, of type boolean, defaulting to true
ホワイトバランスモードの制約が認識されるかどうか。
colorTemperature, of type boolean, defaulting to true
色温度の制約が認識されるかどうか。
exposureMode, of type boolean, defaulting to true
露出の制約が認識されるかどうか。
exposureCompensation, of type boolean, defaulting to true
露出補正の制約が認識されるかどうか。
exposureTime, of type boolean, defaulting to true
露出時間の制約が認識されるかどうか。
iso, of type boolean, defaulting to true
ISOの制約が認識されるかどうか。
focusMode, of type boolean, defaulting to true
フォーカスモードの制約が認識されるかどうか。
pointsOfInterest, of type boolean, defaulting to true
注目点がサポートされるかどうか。
brightness, of type boolean, defaulting to true
明るさの制約が認識されるかどうか。
contrast, of type boolean, defaulting to true
コントラストの制約が認識されるかどうか。
pan, of type boolean, defaulting to true
パンの制約が認識されるかどうか。
saturation, of type boolean, defaulting to true
彩度の制約が認識されるかどうか。
sharpness, of type boolean, defaulting to true
シャープネスの制約が認識されるかどうか。
focusDistance, of type boolean, defaulting to true
フォーカス距離の制約が認識されるかどうか。
tilt, of type boolean, defaulting to true
チルトの制約が認識されるかどうか。
zoom, of type boolean, defaulting to true
ズームレベルの設定が認識されるかどうか。
torch, of type boolean, defaulting to true
トーチの設定が認識されるかどうか。

9.2. MediaTrackCapabilities dictionary(辞書)

MediaTrackCapabilities は、画像キャプチャに特化した機能で拡張されます。この辞書はUAが getCapabilities() を通じて生成し、サポートされる制約の範囲や列挙値を表します。

partial dictionary MediaTrackCapabilities {
    sequence<DOMString>  whiteBalanceMode;
    sequence<DOMString>  exposureMode;
    sequence<DOMString>  focusMode;

    MediaSettingsRange   exposureCompensation;
    MediaSettingsRange   exposureTime;
    MediaSettingsRange   colorTemperature;
    MediaSettingsRange   iso;

    MediaSettingsRange   brightness;
    MediaSettingsRange   contrast;
    MediaSettingsRange   saturation;
    MediaSettingsRange   sharpness;

    MediaSettingsRange   focusDistance;
    MediaSettingsRange   pan;
    MediaSettingsRange   tilt;
    MediaSettingsRange   zoom;

    sequence<boolean> torch;
};

9.2.1. Members(メンバー)

whiteBalanceMode, of type sequence<DOMString>
サポートされているホワイトバランスモードのシーケンス。各文字列はMeteringModeのメンバーのいずれかでなければなりません。
colorTemperature, of type MediaSettingsRange
シーンのホワイトバランス計算に使用される、サポートされている相関色温度の範囲を示します。
exposureMode, of type sequence<DOMString>
サポートされている露出モードのシーケンス。各文字列はMeteringModeのメンバーでなければなりません。
exposureCompensation, of type MediaSettingsRange
サポートされている露出補正の範囲。通常は0EVを中心とした範囲です。
exposureTime, of type MediaSettingsRange
サポートされている露出時間の範囲。値は数値で、増加するほど露出時間が長くなります。
iso, of type MediaSettingsRange
許可されているISO値の範囲。
focusMode, of type sequence<DOMString>
サポートされているフォーカスモードのシーケンス。各文字列はMeteringModeのメンバーでなければなりません。
brightness, of type MediaSettingsRange
カメラの明るさ設定のサポート範囲。値は数値で、増加するほど明るさが増します。
contrast, of type MediaSettingsRange
サポートされているコントラストの範囲。値は数値で、増加するほどコントラストが強くなります。
pan, of type MediaSettingsRange
UAおよびトラックがサポートするパン値の範囲。

トラックが利用許可のリクエストなしで作成された場合、または許可が拒否された場合、トラックはパンをサポートしません。 その場合、UAはパン値の範囲を公開してはならず、基礎となるビデオソースがパンをサポートしていることを示すために空のMediaSettingsRange辞書を提供してもよいです。

UAが空のMediaSettingsRange辞書を提供しても、パンチルトズームのサポートは、新たなgetUserMedia()呼び出しで、対応するビデオトラックが含まれる場合のみ利用可能です。
saturation, of type MediaSettingsRange
許可されている彩度設定の範囲。値は数値で、増加するほど彩度が高くなります。
sharpness, of type MediaSettingsRange
カメラのシャープネスの許可範囲。値は数値で、増加するほどシャープネスが強くなり、最小値はシャープネス強調や処理なしを意味します。
focusDistance, of type MediaSettingsRange
UAがサポートするフォーカス距離値の範囲。
tilt, of type MediaSettingsRange
UAおよびトラックがサポートするチルト値の範囲。

トラックが利用許可のリクエストなしで作成された場合、または許可が拒否された場合、トラックはチルトをサポートしません。 その場合、UAはチルト値の範囲を公開してはならず、基礎となるビデオソースがチルトをサポートしていることを示すために空のMediaSettingsRange辞書を提供してもよいです。

zoom, of type MediaSettingsRange
UAおよびトラックがサポートするズーム値の範囲。

トラックが利用許可のリクエストなしで作成された場合、または許可が拒否された場合、トラックはズームをサポートしません。 その場合、UAはズーム値の範囲を公開してはならず、基礎となるビデオソースがズームをサポートしていることを示すために空のMediaSettingsRange辞書を提供してもよいです。

torch, of type sequence<boolean>
ソースがトーチをオンにできない場合、falseのみが報告されます。 ソースがトーチをオフにできない場合、trueのみが報告されます。 スクリプトが制御可能な場合、truefalseの両方が可能値として報告されます。

9.3. MediaTrackConstraintSet dictionary(辞書)

MediaTrackConstraintSet [GETUSERMEDIA] 辞書は、getConstraints() で現在の状態を取得したり、applyConstraints() で制約セットを適用するために使われます。

MediaTrackSettings は、UAが要求されたMediaTrackConstraintsを適用した効果を検証するために取得できます。 ズームなど一部の制約は即時に適用されない場合があります。
partial dictionary MediaTrackConstraintSet {
    ConstrainDOMString           whiteBalanceMode;
    ConstrainDOMString           exposureMode;
    ConstrainDOMString           focusMode;
    ConstrainPoint2D             pointsOfInterest;

    ConstrainDouble              exposureCompensation;
    ConstrainDouble              exposureTime;
    ConstrainDouble              colorTemperature;
    ConstrainDouble              iso;

    ConstrainDouble              brightness;
    ConstrainDouble              contrast;
    ConstrainDouble              saturation;
    ConstrainDouble              sharpness;

    ConstrainDouble              focusDistance;
    (boolean or ConstrainDouble) pan;
    (boolean or ConstrainDouble) tilt;
    (boolean or ConstrainDouble) zoom;

    ConstrainBoolean             torch;
};

9.3.1. Members(メンバー)

whiteBalanceMode, of type ConstrainDOMString
この文字列はMeteringModeのメンバーのいずれかでなければなりません。 ホワイトバランスモード制約可能プロパティ参照。
exposureMode, of type ConstrainDOMString
この文字列はMeteringModeのメンバーのいずれかでなければなりません。 露出制約可能プロパティ参照。
focusMode, of type ConstrainDOMString
この文字列はMeteringModeのメンバーのいずれかでなければなりません。 フォーカスモード制約可能プロパティ参照。
colorTemperature, of type ConstrainDouble
色温度制約可能プロパティ参照。
exposureCompensation, of type ConstrainDouble
露出補正制約可能プロパティ参照。
exposureTime, of type ConstrainDouble
露出時間制約可能プロパティ参照。
iso, of type ConstrainDouble
iso制約可能プロパティ参照。
pointsOfInterest, of type ConstrainPoint2D
注目点制約可能プロパティ参照。
brightness, of type ConstrainDouble
明るさ制約可能プロパティ参照。
contrast, of type ConstrainDouble
コントラスト制約可能プロパティ参照。
pan, of type (boolean or ConstrainDouble)
パン制約可能プロパティ参照。
saturation, of type ConstrainDouble
彩度制約可能プロパティ参照。
sharpness, of type ConstrainDouble
シャープネス制約可能プロパティ参照。
focusDistance, of type ConstrainDouble
フォーカス距離制約可能プロパティ参照。
tilt, of type (boolean or ConstrainDouble)
チルト制約可能プロパティ参照。
zoom, of type (boolean or ConstrainDouble)
ズーム制約可能プロパティ参照。
torch, of type ConstrainBoolean
トーチ制約可能プロパティ参照。

9.4. MediaTrackSettings dictionary

ビデオストリームのトラック上でgetSettings() メソッドが呼び出された場合、ユーザーエージェントは基盤となるユーザーエージェントの現在の状態を表す拡張されたMediaTrackSettings 辞書を返さなければなりません。

partial dictionary MediaTrackSettings {
  DOMString         whiteBalanceMode;
  DOMString         exposureMode;
  DOMString         focusMode;
  sequence<Point2D> pointsOfInterest;

  double            exposureCompensation;
  double            exposureTime;
  double            colorTemperature;
  double            iso;

  double            brightness;
  double            contrast;
  double            saturation;
  double            sharpness;

  double            focusDistance;
  double            pan;
  double            tilt;
  double            zoom;

  boolean           torch;
};

9.4.1. Members

whiteBalanceMode, of type DOMString
現在の ホワイトバランスモード の設定。文字列は MeteringMode のいずれかのメンバーでなければなりません。
exposureMode, of type DOMString
現在の 露出 モードの設定。文字列は MeteringMode のいずれかのメンバーでなければなりません。
colorTemperature, of type double
ホワイトバランス計算に使用される色温度。このフィールドは whiteBalanceModemanual の場合にのみ意味を持ちます。
exposureCompensation, of type double
現在の 露出補正 の設定。0 EV の値は露出補正なしと解釈されます。このフィールドは exposureModecontinuous または single-shot の場合にのみ意味を持ちます。
exposureTime, of type double
現在の 露光時間 の設定。このフィールドは exposureModemanual の場合にのみ意味を持ちます。
iso, of type double
現在のカメラの ISO 設定。
focusMode, of type DOMString
現在の フォーカスモード の設定。文字列は MeteringMode のいずれかのメンバーでなければなりません。
pointsOfInterest, of type sequence<Point2D>
他の設定(例:フォーカス、露出、自動ホワイトバランス)で使用される 注目点(points of interest) として使用される Point2D のシーケンス。
brightness, of type double
これはカメラの現在の 明るさ(brightness) 設定を反映します。
contrast, of type double
これはカメラの現在の コントラスト(contrast) 設定を反映します。
pan, of type double
これはカメラの現在の パン(pan) 設定を反映します。

もしトラックが 使用の許可を要求する([permissions] に定義された通り)ことなく作成されており、PermissionDescriptor の name メンバーが camera に設定され、かつその panTiltZoom メンバーが true に設定されていない、あるいはその許可要求が拒否された場合、そのトラックは pan をサポートしません。

その場合、UA は pan 設定を公開してはなりません。

saturation, of type double
これはカメラの現在の 彩度(saturation) 設定を反映します。
sharpness, of type double
これはカメラの現在の シャープネス(sharpness) 設定を反映します。
focusDistance, of type double
これはカメラの現在の フォーカス距離(focus distance) 設定を反映します。
tilt, of type double
これはカメラの現在の チルト(tilt) 設定を反映します。

もしトラックが 使用の許可を要求する([permissions] に定義された通り)ことなく作成されており、PermissionDescriptor の name メンバーが camera に設定され、かつその panTiltZoom メンバーが true に設定されていない、あるいはその許可要求が拒否された場合、そのトラックは tilt をサポートしません。 その場合、UA は tilt 設定を公開してはなりません。

zoom, of type double
これはカメラの現在の ズーム(zoom) 設定を反映します。

もしトラックが 使用の許可を要求する([permissions] に定義された通り)ことなく作成されており、PermissionDescriptor の name メンバーが camera に設定され、かつその panTiltZoom メンバーが true に設定されていない、あるいはその許可要求が拒否された場合、そのトラックは zoom をサポートしません。

その場合、UA は zoom 設定を公開してはなりません。

torch, of type boolean
現在のカメラの トーチ(torch) 設定。

9.5. 追加の制約可能なプロパティ

dictionary ConstrainPoint2DParameters {
  sequence<Point2D> exact;
  sequence<Point2D> ideal;
};

typedef (sequence<Point2D> or ConstrainPoint2DParameters) ConstrainPoint2D;

9.5.1. Members

exact, of type sequence<Point2D>
注目点(points of interest) の正確に要求される値。
ideal, of type sequence<Point2D>
注目点(points of interest) の理想的(ターゲット)値。

10. 写真機能と制約可能なプロパティ

前述の多くの写真およびビデオ機能は、複数の方法で実装できるハードウェア機能を反映しており、定義が難しいものが多いです。さらに、メーカーは知的財産を保護するためにあいまいな定義を公開する傾向があります。
これらの写真機能および制約可能なプロパティの名前は、デバイス選択のための許可された必須制約の一覧には含まれていません。 そのため、getUserMedia() では、これらの写真機能および制約可能なプロパティはrequired constraintsではなく、optional basic constraintsおよびadvanced constraintsでのみ制約できます。
  1. White balance mode は、カメラが異なる色温度に合わせて調整するために使用する設定です。Color temperature は背景光の色温度(通常ケルビンで測定)です。この設定は通常実装によって自動かつ連続的に決定されますが、推定されたシーン照明の温度を実装にヒントとして渡すmanualモードを提供することも一般的です。一般的なモードの典型的な温度範囲は以下の通りです:
    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 は、感光素子に入る光量を指します。オート露出モード(single-shot または continuousexposureMode)では、露光時間や絞りが写真の被写体に基づいて実装によって自動的に調整されます。manualexposureMode では、これらのパラメータは固定の絶対値に設定されます。
  3. Focus mode は撮影装置のフォーカス設定(例:auto または manual)を説明します。
  4. Points of interest は、exposurewhite balance modefocus mode 等の他の設定で使用されるメータリング領域の中心点を表します。各点は Point2D です(通常これら3つの制御はいわゆる 3A アルゴリズム(オートフォーカス、オート露出、オートホワイトバランス)によって同時に変更されます)。

    A Point2D Point of Interest は正規化された正方形空間内のピクセル位置を表すものとして解釈されます({x,y} &isin; [0.0, 1.0])。座標の原点 {x,y} = {0.0, 0.0} は左上隅を表し、{x,y} = {1.0, 1.0} は右下隅を表します:x 座標(列)は右方向に増加し、y 座標(行)は下方向に増加します。記載された限界を超える値は許容される最も近い値にクランプされます。

  5. Exposure Compensation は、実装が現在使用している値から露出レベルを調整する数値的なカメラ設定です。この値はオート露出で有効な露出レベルにバイアスをかけるために使用され、通常は 0 EV(補正なし)を中心とする対称的な範囲になります。この値は single-shot および continuousexposureMode でのみ使用されます。
  6. Exposure Time は、感光素子に光が当たる時間の長さを制御する数値的なカメラ設定です。この値は manualexposureMode で露出を制御するために使用されます。値は100マイクロ秒単位です。つまり、値が1.0は1/10000秒の露光時間、10000.0は1秒の露光時間を意味します。
  7. The ISO 設定はカメラの光に対する感度を表します。これは数値で、値が小さいほど感度が大きくなります。この値は [iso12232] 標準に従うべきです。
  8. Red Eye Reduction は、フラッシュの長時間露光によって発生する被写体の赤い瞳(「Red Eye」)の出現を抑制または防止するためのカメラ機能です。
  9. [LIGHTING-VOCABULARY]brightness を「ある領域がより多くまたはより少ない光を放出しているように見える視覚感覚の属性」と定義しており、本APIの文脈では写真対象から放出される光の見かけ上の量を調整する数値的なカメラ設定を指します。明るさを高くするとシーンの暗い領域の強度が増し、明るい部分の強度は圧縮されます。この設定の範囲と効果は実装依存ですが、一般に各ピクセルに飽和処理を伴って加算される数値になります。
  10. Contrast は、シーンの明暗差を制御する数値的なカメラ設定です。コントラストを高くすると明暗差が拡大します。この設定の範囲と効果は実装依存ですが、ヒストグラム上での輝度レンジを大きくするような画素値の変換として理解できます。変換は単純なゲイン係数であることもあります。
  11. [LIGHTING-VOCABULARY]saturation を「明るさに対して評価される領域の色の鮮やかさ」と定義しており、本文脈ではシーン内の色の強度(すなわちグレー成分の量)を制御する数値的なカメラ設定を指します。非常に低い彩度は白黒に近い写真になります。彩度は contrast に似ていますが色に関するものであり、プラットフォーム依存ではありますが与えられた画像の色差成分に対して適用されるゲイン係数として理解できます。
  12. Sharpness はシーンのエッジの強度を制御する数値的なカメラ設定です。シャープネスを高くするとエッジ部分のコントラストが高くなり、低くするとコントラストが減りエッジがぼやけます(ソフトフォーカス)。実装はプラットフォーム依存ですが、元画像にエッジ検出を適用した画像と元画像自体の線形結合として理解でき、その相対的な重みがこの sharpness によって制御されます。
    Brightness, contrast, saturation and sharpness[UVC] で規定されています。
  13. Image widthimage height は、潜在的なセンサー補正およびその他のアルゴリズムが実行された後の生成される写真画像のサポートされる/希望される解像度を表します。
    サポートされる解像度は分離管理されます。例えば imageWidth および imageHeight の値/範囲を分離管理し、フィンガープリント攻撃面の増加を防ぎ、要求された制約に対する実際のハードウェア構成に関してUAがベストエフォートで決定できるようにします。
  14. Focus distance はレンズの焦点距離を制御する数値的なカメラ設定です。設定は通常メートル単位で最適焦点距離までの距離を表します。
  15. Pan はカメラのパンを制御する数値的なカメラ設定です。設定は弧秒(1度の1/3600)で表されます。値の範囲は -180*3600 弧秒から +180*3600 弧秒です。正の値は上から見たときに時計回りにパンし、負の値は上から見たときに反時計回りにパンします。

    pan に関する制約はパン可能なカメラに対する選択において fitness distance を通じて影響します。現在のパン設定を上書きせずにこの影響を与えるために、pan は true に制約することができます。逆に false に制約するとパン機能を持つカメラは不利になります。

    値が false 以外の値を持つ MediaTrackConstraintSet オブジェクトを使用する任意のアルゴリズムは、その pan 辞書メンバーが存在する場合、使用の許可を要求する([permissions] の定義に従う)か、または pan 設定を公開しないことを選択しなければなりません。許可を要求する場合は PermissionDescriptor の name メンバーを camera に設定し、かつその panTiltZoom メンバーを true に設定しなければなりません。

    もしトップレベル閲覧コンテキストの visibilityState の値が "hidden" である場合、applyConstraints() アルゴリズムは pan 辞書メンバーが false 以外の値を持つ場合に SecurityError を投げなければなりません。

  16. Tilt はカメラのチルトを制御する数値的なカメラ設定です。設定は弧秒(1度の1/3600)で表されます。値の範囲は -180*3600 弧秒から +180*3600 弧秒です。正の値は正面から見たときにカメラを上向きにチルトし、負の値は正面から見たときに下向きにチルトします。

    tilt に関する制約はチルト可能なカメラに対する選択において fitness distance を通じて影響します。現在のチルト設定を上書きせずにこの影響を与えるために、tilt は true に制約することができます。逆に false に制約するとチルト機能を持つカメラは不利になります。

    値が false 以外の値を持つ MediaTrackConstraintSet オブジェクトを使用する任意のアルゴリズムは、その tilt 辞書メンバーが存在する場合、使用の許可を要求する([permissions] の定義に従う)か、または tilt 設定を公開しないことを選択しなければなりません。許可を要求する場合は PermissionDescriptor の name メンバーを camera に設定し、かつその panTiltZoom メンバーを true に設定しなければなりません。

    もしトップレベル閲覧コンテキストの visibilityState の値が "hidden" である場合、applyConstraints() アルゴリズムは tilt 辞書メンバーが false 以外の値を持つ場合に SecurityError を投げなければなりません。

    pan および tilt を適用する順序は定義されておらず、UA は任意の順序で適用できます。実際にはこれらの値は絶対値なので順序が最終位置に影響するべきではありません。ただし、pan や tilt の適用が十分に遅い場合は、適用される順序が視覚的に目立つことがあります。
  17. Zoom はレンズの焦点距離を制御する数値的なカメラ設定です。設定は通常比率を表し、例えば 4 は 4:1 のズーム比を意味します。最小値は通常 1(1:1、つまりズームなし)です。

    zoom に関する制約はズーム可能なカメラに対する選択において fitness distance を通じて影響します。現在のズーム設定を上書きせずにこの影響を与えるために、zoom は true に制約することができます。逆に false に制約するとズーム機能を持つカメラは不利になります。

    値が false 以外の値を持つ MediaTrackConstraintSet オブジェクトを使用する任意のアルゴリズムは、その zoom 辞書メンバーが存在する場合、使用の許可を要求する([permissions] の定義に従う)か、または zoom 設定を公開しないことを選択しなければなりません。許可を要求する場合は PermissionDescriptor の name メンバーを camera に設定し、かつその panTiltZoom メンバーを true に設定しなければなりません。

    もしトップレベル閲覧コンテキストの visibilityState の値が "hidden" である場合、applyConstraints() アルゴリズムは zoom 辞書メンバーが false 以外の値を持つ場合に SecurityError を投げなければなりません。

  18. Fill light mode は撮影装置のフラッシュ設定(例:autooffon)を説明します。Torch は、ソースの補助光が継続的に接続されており、track がアクティブである限り点灯し続ける設定を説明します。

11. MeteringMode(測光モード)

enum MeteringMode {
  "none",
  "manual",
  "single-shot",
  "continuous"
};

11.1. Values(値)

none
このソースはフォーカス・露出・ホワイトバランスモードを提供しません。設定時は機能をオフにするコマンドとして解釈されます。
manual
キャプチャデバイスがレンズ位置・露出時間・ホワイトバランスを手動で制御するように設定されるか、そのようなモードが要求されます。
single-shot
キャプチャデバイスがワンショットオートフォーカス・一回限りの露出・ホワイトバランス計算に設定されるか、そのようなモードが要求されます。
continuous
キャプチャデバイスがシャッターラグほぼゼロの連続フォーカス・連続自動露出・ホワイトバランス計算に設定されるか、そのような連続フォーカス・露出・ホワイトバランス計算モードが要求されます。

12. Point2D(2次元座標)

Point2D は2次元空間内の位置を表します。座標の原点は空間の左上隅にあります。

dictionary Point2D {
  double x = 0.0;
  double y = 0.0;
};

12.1. Members(メンバー)

x, of type double, defaulting to 0.0
水平(x座標)の値。
y, of type double, defaulting to 0.0
垂直(y座標)の値。

13. 使用例

これらの例の一部修正版は、例えば このCodePenコレクション でも参照できます。

13.1. カメラのパン・チルト・ズームを更新し takePhoto() を呼び出す

この例は、例えば このCodePen でもほぼ同じ形で参照できます。
<html>
<body>
<video autoplay></video>
<img>
<div>
  <input id="pan" title="Pan" type="range" disabled />
  <label for="pan">パン</label>
</div>
<div>
  <input id="tilt" title="Tilt" type="range" disabled />
  <label for="tilt">チルト</label>
</div>
<div>
  <input id="zoom" title="Zoom" type="range" disabled />
  <label for="zoom">ズーム</label>
</div>
<script>
  let imageCapture;

  async function getMedia() {
    try {
      const stream = await navigator.mediaDevices.getUserMedia({
        video: {pan: true, tilt: true, zoom: true},
      });
      const video = document.querySelector('video');
      video.srcObject = stream;

      const [track] = stream.getVideoTracks();
      imageCapture = new ImageCapture(track);

      const capabilities = track.getCapabilities();
      const settings = track.getSettings();

      for (const ptz of ['pan', 'tilt', 'zoom']) {
        // パン・チルト・ズームが利用可能か確認
        if (!(ptz in settings)) continue;

        // スライダー要素にマッピング
        const input = document.getElementById(ptz);
        input.min = capabilities[ptz].min;
        input.max = capabilities[ptz].max;
        input.step = capabilities[ptz].step;
        input.value = settings[ptz];
        input.disabled = false;
        input.oninput = async event => {
          try {
            // Chromeではadvanced constraintsが必要
            await track.applyConstraints({[ptz]: input.value});
          } catch (err) {
            console.error("applyConstraints() failed: ", err);
          }
        };
      }
    } catch (err) {
      console.error(err);
    }
  }

  async function takePhoto() {
    try {
      const blob = await imageCapture.takePhoto();
      console.log("Photo taken: " + blob.type + ", " + blob.size + "B");

      const image = document.querySelector('img');
      image.src = URL.createObjectURL(blob);
    } catch (err) {
      console.error("takePhoto() failed: ", err);
    }
  }
</script>
</body>
</html>

13.2. grabFrame()でフレームを繰り返し取得

この例は、例えば このCodePen でもほぼ同じ形で参照できます。
<html>
<body>
<canvas></canvas>
<button id="stopButton">フレーム取得停止</button>
<script>
  async function grabFrames() {
    try {
      const canvas = document.querySelector('canvas');
      const video = document.querySelector('video');

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

        stopButton.onclick = () => track.stop();

        while (track.readyState == 'live') {
          const imgData = await imageCapture.grabFrame();
          canvas.width = imgData.width;
          canvas.height = imgData.height;
          canvas.getContext('2d').drawImage(imgData, 0, 0);
          await new Promise(r => setTimeout(r, 1000));
        }
      } finally {
        track.stop();
      }
    } catch (err) {
      console.error(err);
    }
  }
</script>
</body>
</html>

13.3. フレーム取得と後処理

この例は、例えば このCodePen でもほぼ同じ形で参照できます。
<html>
<body>
<canvas></canvas>
<script>
  async function grabFrames() {
    try {
      const canvas = document.querySelector('canvas');
      const video = document.querySelector('video');

      const stream = await navigator.mediaDevices.getUserMedia({video: true});
      video.srcObject = stream;
      const [track] = stream.getVideoTracks();
      try {
        const imageCapture = new ImageCapture(track);
        const imageBitmap = await imageCapture.grabFrame();

        // |imageBitmap| のピクセルは直接アクセスできないため、取得したフレームを <canvas> に描画し getImageData() で取得します。
        const ctx = canvas.getContext('2d');
        canvas.width = imageBitmap.width;
        canvas.height = imageBitmap.height;
        ctx.drawImage(imageBitmap, 0, 0);

        // <canvas> からピクセルを取得し、色を反転
        const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);

        const data = imageData.data;
        for (let i = 0; i < data.length; i += 4) {
          data[i] ^= 255;     // 赤
          data[i + 1] ^= 255; // 緑
          data[i + 2] ^= 255; // 青
        }
        // 最後に反転画像を <canvas> に描画
        ctx.putImageData(imageData, 0, 0);
      } finally {
        track.stop();
      }
    } catch (err) {
      console.error(err);
    }
  }
</script>
</body>
</html>

13.4. カメラのフォーカス距離を更新し takePhoto() を呼び出す

<html>
<body>
<video autoplay></video>
<img>
<input type="range" hidden>
<script>
  let imageCapture;

  async function getMedia() {
    try {
      const stream = await navigator.mediaDevices.getUserMedia({video: true});
      const video = document.querySelector('video');
      video.srcObject = stream;

      const [track] = stream.getVideoTracks();
      imageCapture = new ImageCapture(track);

      const capabilities = track.getCapabilities();
      const settings = track.getSettings();

      // フォーカス距離が利用可能か確認
      if (!capabilities.focusDistance) {
        return;
      }

      // フォーカス距離をスライダー要素にマッピング
      const input = document.querySelector('input[type="range"]');
      input.min = capabilities.focusDistance.min;
      input.max = capabilities.focusDistance.max;
      input.step = capabilities.focusDistance.step;
      input.value = settings.focusDistance;
      input.oninput = async event => {
        try {
          await track.applyConstraints({
            focusMode: "manual",
            focusDistance: input.value
          });
        } catch (err) {
          console.error("applyConstraints() failed: ", err);
        }
      };
      input.parentElement.hidden = false;
    } catch (err) {
      console.error(err);
    }
  }

  async function takePhoto() {
    try {
      const blob = await imageCapture.takePhoto();
      console.log("Photo taken: " + blob.type + ", " + blob.size + "B");

      const image = document.querySelector('img');
      image.src = URL.createObjectURL(blob);
    } catch (err) {
      console.error("takePhoto() failed: ", err);
    }
  }
</script>
</body>
</html>

適合性

文書の規約

適合性要件は、記述的な断定とRFC 2119の用語を組み合わせて表現されます。 規範的な部分で使われる “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, “OPTIONAL” などのキーワードは、RFC 2119の定義に従って解釈されます。 ただし、可読性のため、これらの語は本仕様書ではすべて大文字では記載されていません。

本仕様書のすべてのテキストは規範的です。ただし、明示的に非規範的と記載されたセクション、例、および注記は除きます。[RFC2119]

本仕様書の例は「for example」などの語で導入されるか、class="example"で規範的な本文から区別されます。例えば次のようになります:

これは情報提供的な例です。

情報提供的な注記は「Note」で始まり、class="note"で規範的な本文から区別されます。例えば次のようになります:

注:これは情報提供的な注記です。

適合するアルゴリズム

アルゴリズムの一部として命令形で記述された要件(例:"strip any leading space characters" や "return false and abort these steps" など)は、アルゴリズムの導入で使われているキーワード("must", "should", "may" など)の意味で解釈されます。

アルゴリズムや特定の手順として記述された適合性要件は、最終的な結果が同等である限り、どのような方法でも実装できます。 特に、本仕様書で定義されるアルゴリズムは理解しやすいことを目的としており、性能を意図したものではありません。 実装者は最適化することが推奨されます。

索引

本仕様で定義される用語

参照によって定義された用語

参考文献

規定参考文献

[FileAPI]
Marijn Kruisselbrink. File API. 2024年12月4日. WD. URL: https://www.w3.org/TR/FileAPI/
[GETUSERMEDIA]
Cullen Jennings 他. Media Capture and Streams. 2024年12月19日. CRD. URL: https://www.w3.org/TR/mediacapture-streams/
[HTML]
Anne van Kesteren 他. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[PERMISSIONS]
Marcos Caceres; Mike Taylor. Permissions. 2024年12月20日. WD. URL: https://www.w3.org/TR/permissions/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/

参考情報

[ISO12232]
Photography - Digital still cameras - Determination of exposure index, ISO speed ratings, standard output sensitivity, and recommended exposure index. 2006年4月15日. URL: http://www.iso.org/iso/catalogue_detail.htm?csnumber=37777
[LIGHTING-VOCABULARY]
CIE International Lighting Vocabulary: IEC International Electrotechnical Vocabulary.. 1987年12月15日.
[UVC]
USB Device Class Definition for Video Devices. 2012年8月9日. URL: http://www.usb.org/developers/docs/devclass_docs/

IDL索引

[Exposed=Window, SecureContext]
interface ImageCapture {
   constructor(MediaStreamTrack videoTrack);
   Promise<Blob>              takePhoto(optional PhotoSettings photoSettings = {});
   Promise<PhotoCapabilities> getPhotoCapabilities();
   Promise<PhotoSettings>     getPhotoSettings();

   Promise<ImageBitmap>       grabFrame();

   readonly attribute MediaStreamTrack track;
};

dictionary PhotoCapabilities {
  RedEyeReduction         redEyeReduction;
  MediaSettingsRange      imageHeight;
  MediaSettingsRange      imageWidth;
  sequence<FillLightMode> fillLightMode;
};

dictionary PhotoSettings {
  FillLightMode   fillLightMode;
  double          imageHeight;
  double          imageWidth;
  boolean         redEyeReduction;
};

dictionary MediaSettingsRange {
    double max;
    double min;
    double step;
};

enum RedEyeReduction {
  "never",
  "always",
  "controllable"
};

enum FillLightMode {
  "auto",
  "off",
  "flash"
};

partial dictionary MediaTrackSupportedConstraints {
  boolean whiteBalanceMode = true;
  boolean exposureMode = true;
  boolean focusMode = true;
  boolean pointsOfInterest = true;

  boolean exposureCompensation = true;
  boolean exposureTime = true;
  boolean colorTemperature = true;
  boolean iso = true;

  boolean brightness = true;
  boolean contrast = true;
  boolean pan = true;
  boolean saturation = true;
  boolean sharpness = true;
  boolean focusDistance = true;
  boolean tilt = true;
  boolean zoom = true;
  boolean torch = true;
};

partial dictionary MediaTrackCapabilities {
  sequence<DOMString>  whiteBalanceMode;
  sequence<DOMString>  exposureMode;
  sequence<DOMString>  focusMode;

  MediaSettingsRange   exposureCompensation;
  MediaSettingsRange   exposureTime;
  MediaSettingsRange   colorTemperature;
  MediaSettingsRange   iso;

  MediaSettingsRange   brightness;
  MediaSettingsRange   contrast;
  MediaSettingsRange   saturation;
  MediaSettingsRange   sharpness;

  MediaSettingsRange   focusDistance;
  MediaSettingsRange   pan;
  MediaSettingsRange   tilt;
  MediaSettingsRange   zoom;

  sequence<boolean> torch;
};

partial dictionary MediaTrackConstraintSet {
  ConstrainDOMString           whiteBalanceMode;
  ConstrainDOMString           exposureMode;
  ConstrainDOMString           focusMode;
  ConstrainPoint2D             pointsOfInterest;

  ConstrainDouble              exposureCompensation;
  ConstrainDouble              exposureTime;
  ConstrainDouble              colorTemperature;
  ConstrainDouble              iso;

  ConstrainDouble              brightness;
  ConstrainDouble              contrast;
  ConstrainDouble              saturation;
  ConstrainDouble              sharpness;

  ConstrainDouble              focusDistance;
  (boolean or ConstrainDouble) pan;
  (boolean or ConstrainDouble) tilt;
  (boolean or ConstrainDouble) zoom;

  ConstrainBoolean             torch;
};

partial dictionary MediaTrackSettings {
  DOMString         whiteBalanceMode;
  DOMString         exposureMode;
  DOMString         focusMode;
  sequence<Point2D> pointsOfInterest;

  double            exposureCompensation;
  double            exposureTime;
  double            colorTemperature;
  double            iso;

  double            brightness;
  double            contrast;
  double            saturation;
  double            sharpness;

  double            focusDistance;
  double            pan;
  double            tilt;
  double            zoom;

  boolean           torch;
};

dictionary ConstrainPoint2DParameters {
  sequence<Point2D> exact;
  sequence<Point2D> ideal;
};

typedef (sequence<Point2D> or ConstrainPoint2DParameters) ConstrainPoint2D;

enum MeteringMode {
  "none",
  "manual",
  "single-shot",
  "continuous"
};

dictionary Point2D {
  double x = 0.0;
  double y = 0.0;
};