HTML+JavaScriptだけでブラウザに図形描画(2) - Canvas API -

TIPS 025:画像を繰り返し表示する
fillStyle/strokeStyleプロパティには、パターンを指定することもできます。パターンとは、図形(または枠線)を塗りつぶす際に利用する画像の繰り返しのことを言います。
[リスト8]指定された画像を上下左右に繰り返し貼り付けるコード(pattern.html)
window.addEventListener('DOMContentLoaded',
function() {
if (HTMLCanvasElement) {
var cv = document.querySelector('#cv');
var c = cv.getContext('2d');
// 画像を準備
var img = new Image();
img.src = 'wings.jpg';
// 画像が準備できたら、以降の処理を実行
img.addEventListener('load', function(e) {
// パターンを作成(1)
var p = c.createPattern(img, 'repeat');
// 塗りつぶし色としてパターンをセット(2)
c.fillStyle = p;
c.fillRect(0, 0, 400, 300);
});
}
}
);
パターンは、CanvasPatternオブジェクトで表します。CanvasPatternオブジェクトは、createPatternメソッドで作成できます(1)。
[構文]createPatternメソッド
- createPattern(画像, パターンの種類)
サンプルでは、画像としてImageオブジェクトを指定していますが、その他、Video/HTMLCanvasElementなどのオブジェクトも指定できます。
パターンの種類は、画像をどのように敷き詰めるかを表すものです。指定できるパターンには、以下のようなものがあります。
| 設定値 | 概要 |
|---|---|
| repeat | 上下左右双方に繰り返し |
| repeat-x | 水平方向にのみ繰り返し |
| repeat-y | 垂直方向にのみ繰り返し |
| no-repeat | 繰り返さない |
パターンを作成できたら、後はこれをfillStyleプロパティにセットすることで、塗りつぶし色としてパターンが適用されます(2)。ここではキャンバス全体をパターンで塗りつぶしたいので、fillRectメソッドでキャンバスと同じ大きさの四角形を描画しています。
TIPS 026:画像の特定領域を切り抜く
clipメソッドを利用することで、キャンバスの特定の領域だけを切り抜きます(これをクリッピング領域と言います)。clipメソッドが呼び出された場合、以降は、クリッピング領域に対してのみ図形が描画できるようになります。
[リスト9]指定された円の領域内のみ画像を描画するコード(clip.html)
window.addEventListener('DOMContentLoaded',
function() {
if (HTMLCanvasElement) {
var cv = document.querySelector('#cv');
var c = cv.getContext('2d');
// 円を描画
c.beginPath();
c.arc(250, 180, 100, 0, 2 * Math.PI, false);
c.stroke();
// 現在のパスに基づいて、クリッピング領域を定義
c.clip();
// 画像を準備&貼り付け(2)
var img = new Image();
img.src = 'rin.jpg';
img.addEventListener('load', function(e) {
c.drawImage(img, 0, 0, 400, 300);
});
}
}
);
この例では、arcメソッドで円のパスを定義した後で、clipメソッドを呼び出していますので(1)、以降の画像貼り付け(2)は円で囲まれた領域内に対してのみ反映されることになります。
サンプルでは、strokeメソッドで枠囲みしていますが、単にクリッピング領域を定義したいだけであれば、strokeメソッドは省略しても構いません。
クリッピング領域とパスを組み合わせることで、より複雑な画像の貼り付けが可能になります。
TIPS 027:特定の座標がパス領域に含まれるかを判定する
isPointInPathメソッドを利用することで、指定された座標が現在のパス領域に含まれるかを判定できます。
[リスト10]座標がパスに含まれるかを確認するコード(inpath.html)
window.addEventListener('DOMContentLoaded',
function() {
if (HTMLCanvasElement) {
var cv = document.querySelector('#cv');
var c = cv.getContext('2d');
// 多角形を描画
c.beginPath();
c.moveTo(15, 15);
c.lineTo(30, 250);
c.lineTo(250, 200);
c.lineTo(280, 130);
c.lineTo(250, 80);
c.closePath();
c.stroke();
//c.beginPath();
// 座標(100, 100)がパスの領域内に含まれるかをチェック
if (c.isPointInPath(100, 100)) {
window.alert('座標はパスに含まれます。');
} else {
window.alert('座標はパスの領域外です。');
}
}
}
);
isPointInPathメソッドの構文は、以下のとおりです。
[構文]isPointInPathメソッド
- isPointInPath(X座標, Y座標)
isPointInPathメソッドは結果をtrue(含まれる)、false(含まれない)で返します。
なお、isPointInPathメソッドが判定するのは、現在のパスに対してです。よって、16行目をコメントインし、新たなパスを開始すると、いわゆるパスで表される領域がない状態になりますので、結果は「座標はパスの領域外です。」となります。
Canvas APIを使ってブラウザに図形を描画するサンプル
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- 動画・音声のブラウザ対応状況、canvasによる描画
- HTML+JavaScriptだけでブラウザに図形描画- Canvas API-
- HTML+JavaScriptだけでブラウザに図形描画(3)- Canvas API-
- 着色とアルファとグラデーション
- デスクトップアプリライクな操作性を実現するドラッグ&ドロップAPI
- 「TAURI」で「丸アートお絵描き」アプリを作ろう
- HTML 5+JavaScriptでCanvasアプリを作る
- JavaScriptでローカルファイルを自在に操る- File API
- SVGのグラデーションとJavaScriptとの連携
- クッキーより便利になったブラウザ標準ストレージ- Web Storage




