CanvasRenderingContext2D.createPattern() - 画像の塗りつぶしをするCanvasPatternオブジェクトを作成する

投稿日: / 更新日:

JavaScriptの、CanvasRenderingContext2DオブジェクトのcreatePattern()は、canvasを、画像で塗りつぶすCanvasPatternオブジェクトを作成するためのメソッドです。このメソッドによって作成したオブジェクトを、fillStyleプロパティなどに指定することで、画像での塗りつぶしが実現します。第1引数にはソースとなる要素を、第2引数には繰り返し表示のパターンを指定します。

サンプルコード

<canvas id="target"></canvas>

<img id="image" src="./image.png">
<video id="video" src="./video.mp4"></video>
<canvas id="canvas"></canvas>
// キャンパス要素を取得
var canvas = document.getElementById( "target" ) ;

// 二次元グラフィックスのコンテキスト(CanvasRenderingContext2D)を取得
var context = canvas.getContext( "2d" ) ;

// 対象となるimg、video、またはcanvas要素を取得
var imageElement = document.getElementById( "image" ) ;	// 画像の場合
var videoElement = document.getElementById( "video" ) ;	// ビデオの場合
var canvasElement = document.getElementById( "canvas" ) ;	// canvasの場合

// CanvasPatternオブジェクトを作成
// 第2引数
// repeat … X方向、Y方向に繰り返し
// repeat-x … X方向にだけ繰り返し
// repeat-y … Y方向にだけ繰り返し
// no-repeat … 繰り返さない
var pattern = context.createPattern( imageElement, "repeat" ) ;	// 画像の場合
var pattern = context.createPattern( videoElement, "repeat" ) ;	// 動画の場合
var pattern = context.createPattern( canvasElement, "repeat" ) ;	// canvasの場合

// 塗りつぶしの実行 (応用)
context.rect( 0,0, 200,200 ) ;	// 塗りつぶしの範囲を決定
context.fillStyle = pattern ;	// 塗りつぶしのスタイルにCanvasPatternオブジェクトを指定
context.fill() ;	// 塗りつぶしを実行

デモ

第1引数と第2引数を組み合わせた動作確認ができます。ここで意識しておいてほしいのは、あくまでもcreatePattern()はオブジェクト、言わば材料を作るだけのメソッドだということです。「描画」を押した時に描画する処理は、別のメソッドを使った別の処理です。video要素はサイズが大きすぎるので繰り返し表示の効果が分かりませんが(笑)、ここでは「video要素も画像として繰り返し表示できる」ということだけ確認しておきましょう。

構文

CanvasPattern = CanvasRenderingContext2D.createPattern( element, repeat ) ;

引数

項目説明
element第1引数には、繰り返し表示の対象となるimg、video、canvas要素のいずれかを指定する。なお、画像などの読み込みが完了する前にcreatePattern()を実行すると、読み込まれていない時点の情報を元にオブジェクトが作成されるため真っ黒になってしまうので注意。
repeat繰り返しのパターンを4種類の中から指定する。
repeat
X方向、Y方向に繰り返す。
repeat-x
X方向にだけ繰り返す。
repeat-y
Y方向にだけ繰り返す。
no-repeat
繰り返さない。

戻り値

項目説明
CanvasPattern作成したCanvasPatternオブジェクトを取得する。

ノート

サポート状況
主要な全てのブラウザがサポートしている。Ie8以下はcanvas自体に対応していない。
読み込みタイミングに注意
例えば、createElement()を使って即席でimg要素を作成し、肝心のリソース(画像)の読み込みが完了する前にcreatePattern()を実行すると、画像は真っ黒になってしまう。メソッドを実行した後にリソースが読み込まれても意味がない。あくまでも、メソッドを実行する時点でリソースの読み込みが完了していなければいけない。