HTML+JavaScriptだけでブラウザに図形描画(3) - Canvas API -
TIPS 030:画像を拡大/回転/変形して表示する
Canvas APIでは、scale(拡大縮小)、rotate(回転)、translate(移動)、transform(変形)など、図形を変形/加工するためのさまざまなメソッドが用意されています。以下では、これらのメソッドを利用した例を見てみましょう。
[リスト03]画像を拡大/回転/変形するコード(transform.html)
window.addEventListener('DOMContentLoaded', function() { if (HTMLCanvasElement) { var cv = document.querySelector('#cv'); var c = cv.getContext('2d'); // 初期状態のコンテキストをあらかじめ保存 for (var i = 0; i < 3; i++) { c.save(); } // 画像を準備 var img = new Image(); img.src = 'wings.jpg'; img.addEventListener('load', function(e) { // 半分に縮小して描画 c.scale(0.5, 0.5); c.drawImage(img, 0, 0); // 30°回転したものを描画 c.restore(); c.rotate(30 * Math.PI / 180); c.drawImage(img, 50, 50); // (180, 200)ずらした上で描画 c.restore(); c.translate(180, 200); c.drawImage(img, 0, 0); // 変形マトリクスで変換した上で描画 c.restore(); c.transform(1, 1, 1, -1, 0, 0); c.drawImage(img, 70, 100); }); } } );
それぞれの構文を見てみましょう。
[構文]scale/rotate/translate/transformメソッド
- scale(横倍率, 縦倍率) … 拡大/縮小
- rotate(角度) … 回転
- translate(水平方向, 垂直方向) … 移動
- transform(m11, m12, m21, m22, dx, dy) … 変形
transformメソッドは、scale/rotate/translateメソッドをひとつにまとめたメソッドと言っても良いでしょう。以下のような変換マトリクスを使って、図形を変形させます。
単純な拡大/縮小、回転、移動には専用のメソッドの方が簡単ですが、より複雑な座標変換には、transformメソッドを利用します。以下に簡単な利用パターンをまとめます。
表2:transformメソッドの利用例
例 | 概要 |
---|---|
transform(x, 0, 0, y, 0, 0) | 横x倍、縦y倍に拡大 |
transform(Math.cos(r), Math.sin(r), -Math.sin(r), Math.cos(r), 0, 0) | r(ラジアン)だけ回転 |
transform(1, 0, 0, 1, x, y) | 水平方向にx、垂直方向にyだけ移動 |
なお、transformメソッドは、実行都度に変換マトリクスを累積していきます。
もしも新たに変換マトリクスを適用したい(または、状態を初期化したい)という場合には、setTransformメソッドを利用してください。setTransformメソッドは、変換マトリクスを累積するのではなく、新たに設定し直します。
サンプルでは、キャンバス状態の初期化にrestoreメソッドを利用していますが、代わりにsetTransformメソッドを使って、以下のように書いても良いでしょう。
c.setTransform(1, 0, 0, 1, 0, 0);
TIPS 031:キャンバス上の図形の一部を切り出す/貼り付ける
getImageDataメソッドを利用すると、キャンバス上の特定の領域を切り出すことができます。また、切り出した画像はputImageDataメソッドを利用することで、同じキャンバス(または異なるキャンバス)に貼り付けることができます。
以下は、上のキャンバスに描画した画像の一部を切り出し、下のキャンバスに貼り付ける例です。
[リスト04]キャンバスに描画された図形の一部をコピーするコード(imageData.html)
window.addEventListener('DOMContentLoaded', function() { if (HTMLCanvasElement) { // 上下キャンバスのコンテキストを準備 var cv = document.querySelector('#cv'); var c = cv.getContext('2d'); var cv2 = document.querySelector('#cv2'); var c2 = cv2.getContext('2d'); // 上のキャンバスに画像を貼り付け var img = new Image(); img.src = 'rin.jpg'; img.addEventListener('load', function(e) { c.drawImage(img, 0, 0, 400, 300); // 座標(180, 150)から150×150の大きさで画像を切り出し var d = c.getImageData(180, 150, 150, 150); // 下のキャンバス(50, 50)の位置に切り出した画像を貼り付け c2.putImageData(d, 50, 50); }); } } ); ...中略... <canvas id="cv" width="400" height="300"> Canvas機能に対応したブラウザでアクセスしてください。 </canvas><br /> <canvas id="cv2" width="400" height="300"> Canvas機能に対応したブラウザでアクセスしてください。 </canvas>
getImageDataメソッドの構文は、以下のとおりです。
[構文]getImageDataメソッド
- getImageData(x, y, width, height)
これで座標(x, y)を基点としてwidth×heightのサイズで画像データを取得しなさいという意味になります。getImageDataメソッドの戻り値は、ImageDataオブジェクトです。
ImageDataオブジェクトは、そのままputImageDataメソッドに渡せます。
[構文]putImageDataメソッド
- putImageData(ImageDataオブジェクト, x, y)
指定されたImageDataオブジェクトを、座標(x, y)に貼り付けます。
サンプルでは、ImageDataオブジェクトをそのまま貼り付けているだけですが、ImageDataオブジェクトはピクセルデータを配列として保持しています。
ひとつのピクセルを赤、緑、青、不透明度という4つの要素で表現しているわけです。これらの値を操作することで、色味や透明度を変化させた上で、画像を貼り付けるということもできるでしょう。
Canvas APIを使ってブラウザに図形を描画するサンプル(3)
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- HTML+JavaScriptだけでブラウザに図形描画- Canvas API-
- 「TAURI」で「丸アートお絵描き」アプリを作ろう
- HTML+JavaScriptだけでブラウザに図形描画(2)- Canvas API-
- 動画・音声のブラウザ対応状況、canvasによる描画
- 「TAURI」で「画像ビューア」のサンプルアプリを作ろう
- デスクトップアプリライクな操作性を実現するドラッグ&ドロップAPI
- クッキーより便利になったブラウザ標準ストレージ- Web Storage
- JavaScriptでローカルファイルを自在に操る- File API
- HTML 5+JavaScriptでCanvasアプリを作る
- スマホアプリ開発にも便利な位置情報API- Geolocation API-