Edition for Web Developers — Last Updated 17 December 2024
ImageBitmap
オブジェクトは過度の待ち時間なしのキャンバスに塗装できるビットマップ画像を表す。
この過度の待ち時間は何かの正確な判断は実装者に委ねるが、一般にビットマップを活用することは、ネットワークI/O、あるいはローカルディスクI/Oを必要とする場合、その後待ち時間はおそらく過度である。一方それが唯一のGPUやシステムRAMからのブロッキングの読み出しを必要とする場合、待ち時間はおそらく許容できる。
promise = self.createImageBitmap(image [, options ])
promise = self.createImageBitmap(image, sx, sy, sw, sh [, options ])
img
要素、SVG image
要素、video
要素、canvas
要素、Blob
オブジェクト、ImageData
オブジェクト、または別のImageBitmap
オブジェクトである画像を取得し、新しいImageBitmap
が作成されたときに解決されるpromiseを返す。
ImageBitmap
オブジェクトを構築することが全くできない場合、たとえば、与えられたimage データが実際の画像ではないので、代わりにpromiseが却下される。
sx、sy、sw、およびsh引数が指定される場合、ソース画像は与えられたピクセルに切り取られ、元のピクセルに欠けているピクセルは透明な黒に置き換えられる。これらの座標は、CSSピクセルではなく、ソース画像のピクセル座標空間にある。
optionsが指定される場合、ImageBitmap
オブジェクトのビットマップデータはoptionsに従って変更される。たとえば、premultiplyAlpha
オプションが"premultiply
"に設定される場合、ビットマップデータのカラーチャネルはそのアルファチャネルによって事前に乗算される。
ソース画像が有効な状態にない場合、"InvalidStateError
" DOMException
を拒否する(たとえば、正常に読み込まれなかったimg
要素、[[Detached]]内部スロット値がtrueのImageBitmap
オブジェクト、data
属性値の[[ViewedArrayBuffer]]内部スロットが切り離されているImageData
オブジェクト、データがビットマップイメージとして解釈できないBlob
など)。
スクリプトがソース画像の画像データへのアクセスを許可されていない場合、"SecurityError
" DOMException
でpromiseを拒否する(たとえば、生成元をまたぐCORSであるvideo
、別の生成元からのワーカーのスクリプトで描画されたcanvas
など)。
imageBitmap.close()
imageBitmapの基礎となるビットマップデータを解放する。
imageBitmap.width
imageBitmap.height
このAPIを使用すると、スプライトシートは、プレカットと調製することができる:
var sprites = {};
function loadMySprites() {
var image = new Image();
image. src = 'mysprites.png' ;
var resolver;
var promise = new Promise( function ( arg) { resolver = arg });
image. onload = function () {
resolver( Promise. all([
createImageBitmap( image, 0 , 0 , 40 , 40 ). then( function ( image) { sprites. person = image }),
createImageBitmap( image, 40 , 0 , 40 , 40 ). then( function ( image) { sprites. grass = image }),
createImageBitmap( image, 80 , 0 , 40 , 40 ). then( function ( image) { sprites. tree = image }),
createImageBitmap( image, 0 , 40 , 40 , 40 ). then( function ( image) { sprites. hut = image }),
createImageBitmap( image, 40 , 40 , 40 , 40 ). then( function ( image) { sprites. apple = image }),
createImageBitmap( image, 80 , 40 , 40 , 40 ). then( function ( image) { sprites. snake = image })
]));
};
return promise;
}
function runDemo() {
var canvas = document. querySelector( 'canvas#demo' );
var context = canvas. getContext( '2d' );
context. drawImage( sprites. tree, 30 , 10 );
context. drawImage( sprites. snake, 70 , 10 );
}
loadMySprites(). then( runDemo);
一部のオブジェクトにはAnimationFrameProvider
インターフェイスミックスインが含まれる。
各AnimationFrameProvider
オブジェクトはまた、プロバイダーの内部状態を格納するターゲットオブジェクトを持つ。これは次のように定義される:
AnimationFrameProvider
がWindow
である場合Window
の関連付けられたDocument
AnimationFrameProvider
が DedicatedWorkerGlobalScope
である場合DedicatedWorkerGlobalScope
各ターゲットオブジェクトは、アニメーションフレームコールバックのマップ、これは初期は空でなければならない順序付きマップである、およびアニメーションフレームコールバック識別子、これは初期は0でなければならない数、を持つ。
An AnimationFrameProvider
provider is considered supported if any of the following are true:
providerがWindow
である。
providerの所有者集合がDocument
オブジェクトを含む。
providerの所有者集合におけるすべてのDedicatedWorkerGlobalScope
オブジェクトがサポートされる。
Support in all current engines.
The requestAnimationFrame(callback)
method steps are:
If this is not supported, then throw a "NotSupportedError
" DOMException
.
Let target be this's target object.
Increment target's animation frame callback identifier by one, and let handle be the result.
Let callbacks be target's map of animation frame callbacks.
Set callbacks[handle] to callback.
Return handle.
Support in all current engines.
The cancelAnimationFrame(handle)
method steps are:
If this is not supported, then throw a "NotSupportedError
" DOMException
.
Let callbacks be this's target object's map of animation frame callbacks.
Remove callbacks[handle].
To run the animation frame callbacks for a target object target with a timestamp now:
Let callbacks be target's map of animation frame callbacks.
Let callbackHandles be the result of getting the keys of callbacks.
For each handle in callbackHandles, if handle exists in callbacks:
ワーカー内部では、canvas
要素から転送されたOffscreenCanvas
と一緒にrequestAnimationFrame()
を使用することができる。まず、文書内で、ワーカーに制御を転送する:
const offscreenCanvas = document. getElementById( "c" ). transferControlToOffscreen();
worker. postMessage( offscreenCanvas, [ offscreenCanvas]);
次に、ワーカーにおいて、以下のコードで左から右に移動する矩形を描画する:
let ctx, pos = 0 ;
function draw( dt) {
ctx. clearRect( 0 , 0 , 100 , 100 );
ctx. fillRect( pos, 0 , 10 , 10 );
pos += 10 * dt;
requestAnimationFrame( draw);
}
self. onmessage = function ( ev) {
const transferredCanvas = ev. data;
ctx = transferredCanvas. getContext( "2d" );
draw();
};