canvasに描画する方法について解説 ~Javascript超初心者入門
canvasのサイズについて
canvasが保持する幅と高さのピクセル数は属性「width」と属性「height」で指定します。
canvasのcss(style属性)の幅「canvas.style.width」と高さ「canvas.style.height」は拡大または縮小して画面に表示するサイズを意味します。
以下のHTMLとCSSの場合、canvasが保持しているピクセル数は「50×50」ピクセルで、画面に表示するサイズは「200×100」ピクセルなので、「幅4倍、高さ2倍」に拡大して表示しています。
<canvas id="test1canvas" style="width:200px;height:100px;border:1px solid #666;" width="50" height="50"></canvas>
canvasへの描画
canvasは自身に描画する機能を持ち合わせていません。
描画するには「getContext("2d")」メソッドで返ってくる「描画コンテキスト」を用いて描画します。
//変数ctxに描画コンテキストを取得 let ctx=canvas.getContext("2d");
「描画コンテキスト」を用いて
座標(0,0)-(50,50)-(50,0)
への線を描画します。
<canvas id="test2canvas" style="width:200px;height:100px;border:1px solid #666;" width="50" height="50"></canvas> <script> window.addEventListener("load",function(){ //キャンバスの取得 let can=document.getElementById("test2canvas"); //描画コンテキストの取得 let ctx=can.getContext("2d"); //線の幅を指定 ctx.lineWidth=2; //線の色を設定(半透明の青) ctx.strokeStyle="rgba(0,0,255, 0.5)"; //線の描画の開始 ctx.beginPath(); ctx.moveTo(0,0); ctx.lineTo(50,50); ctx.lineTo(50,0); //線の実際の描画 ctx.stroke(); }); </script>
描画コンテキストに設定できるプロパティ値
主な線のスタイル
lineWidth | 線の幅(規定値:1.0) |
lineCap |
線の末端のスタイル 設定可能な値:"butt"(既定値), "round", "square" |
lineJoin |
2つの線が出会う頂点のスタイル 設定可能な値:"round", "bevel", "mitter"(既定値) |
strokeStyle |
線(輪郭)の色やスタイルを定義 設定可能な値の例:"rgb(255,0,0)", "rgba(255,255,255,0.5)", "#000"(既定値) |
主な塗りつぶしのスタイル
fillStyle |
図形の内側の塗りつぶし色をスタイルで定義 設定可能な値の例:"rgb(255,0,0)", "rgba(255,255,255,0.5)", "#000"(既定値) |
主な影のスタイル
shadowBlur |
影のぼかしの設定 設定可能な値の例:0(既定値) |
shadowColor |
影の色 設定可能な値の例:"rgb(255,0,0)", "rgba(0,0,0,0)"(既定値), "#000" |
shadowOffsetX |
影を横方向にずらす距離 設定可能な値の例:0(既定値) |
shadowOffsetY |
影を縦方向にずらす距離 設定可能な値の例:0(既定値) |
主な文字のスタイル
font |
文字のサイズとフォント 設定可能な値の例:"10px sans-sefif"(既定値) "bold 12px Meiryo" |
||||||||||||
textAlign |
文字の揃え方で "left":左揃え, "center":中央揃え 等を指定する 設定可能な値:"start"(既定値), "end", "left", "right", "center" |
||||||||||||
textBaseline |
ベースラインの揃え方 設定可能な値:"top", "hanging", "middle", "alphabetic"(既定値), "ideographic", "bottom"
|
||||||||||||
direction |
テキストの方向 設定可能な値:"ltr", "rtl", "inherit"(既定値) |
描画コンテキストのメソッド
主なパス(複数座標を指定して線を描画したり、線を閉じたり、内部の塗りつぶし)や描画のメソッド
beginPath() | 新しいパスの起点を作成します |
moveTo(x,y) |
(x, y) 座標へ作成済みのサブパスの始点を移動 |
lineTo(x,y) |
現在のサブパスの終点を指定した (x, y) 座標へ直線で接続let can = document.querySelector("canvas"); let ctx = can.getContext("2d"); ctx.beginPath(); ctx.moveTo(0,0); ctx.lineTo(50,50); ctx.lineTo(50,0); ctx.fill(); ctx.stroke(); |
arc(x,y,r, sAngle,eAngle [,counterclockwise=false]); |
円弧を作成 (x,y)を中心、rを半径、sAngleからeAngleまでの角度でcounterclockwiseで指定された向き(既定:時計回り)の円弧 let can = document.querySelector("canvas"); let ctx = can.getContext("2d"); ctx.beginPath(); ctx.arc(25,20,15, 0*Math.PI,2*Math.PI, false); ctx.fill(); ctx.stroke(); |
arcTo(x1,y1, x2,y2, r) |
moveTo(x,y)等で指定された始点と点(x1,y1))の直線と、直線(x1,y1)-(x2,y2)に接する角度rの円弧を作成 |
ellipse(x,y, radiusX,radiusY, rotation, sAngle,eAngle [,counterclockwise=false]) |
(x,y)が中心のradiusX,radiusYを半径とするrotation傾いた楕円のsAngleからeAngleまでの角度でcounterclockwiseで指定された向き(既定:時計回り)の楕円弧let can = document.querySelector("canvas"); let ctx = can.getContext("2d"); ctx.beginPath(); ctx.ellipse(25,20, 10,8 ,0.25*Math.PI ,1*Math.PI,2*Math.PI); ctx.fill(); ctx.stroke(); |
closePath() |
パスを閉じます 既にパスが閉じられていたり、1点だけの場合は何もしません |
rect(x,y,width,height) |
座標 (x, y) から width と height のサイズで長方形のパスを作成let can = document.querySelector("canvas"); let ctx = can.getContext("2d"); ctx.rect(25,20, 15,20); ctx.fill(); ctx.stroke(); |
fill() |
パスを塗りつぶします |
stroke() |
パスを描画(線を描画)します |
fillText(text, x,y [,maxWidth]) |
現在の塗りつぶしスタイル(fillStyle)を用いて文字の内部を塗るlet can = document.querySelector("canvas"); let ctx = can.getContext("2d"); ctx.fillText("Hello", 15,20); |
strokeText(text, x,y [,maxWidth]) |
現在の線のスタイルを用いて文字の輪郭を描画let can = document.querySelector("canvas"); let ctx = can.getContext("2d"); ctx.strokeText("Hello", 15,20); |
measureText(text) |
textを実際に描画した場合の情報(例えば幅など)を持つ TextMetrics オブジェクトを返すlet can = document.querySelector("canvas"); let ctx = can.getContext("2d"); let m=ctx.measureText("Hello"); console.log(m.width); |
主な座標変換
getTransform() | 現在の変換行列を取得 |
rotate(angle) | 変換行列に回転を追加 |
scale(x,y) | xで水平向、yで垂直方向に拡大縮小変換を追加 |
translate(x,y) | 座標(x,y)に平行移動の変換を追加 |
resetTransform() | 変換行列を単位行列にリセット |
パスの塗りつぶしと描画
パス(10,10)-(50,60)-(150,80)-(100,20)を半透明赤で塗りつぶし、線を半透明青色で描画します。 closePath()を使っていないので、パスは閉じていません。
<canvas id="test3canvas" style="width:200px;height:100px;border:1px solid #666;" width="200" height="100"> </canvas> <script> window.addEventListener("load",function(){ //キャンバスの取得 let can=document.getElementById("test3canvas"); //描画コンテキストの取得 let ctx=can.getContext("2d"); //塗りつぶしの色を設定(半透明の青) ctx.fillStyle="rgba(255,0,0, 0.5)"; //線の幅を指定 ctx.lineWidth=16; //線の色を設定(半透明の青) ctx.strokeStyle="rgba(0,0,255, 0.5)"; //パスの開始 ctx.beginPath(); ctx.moveTo(10,10); ctx.lineTo(50,60); ctx.lineTo(150,80); ctx.lineTo(100,20); //パスの塗りつぶし ctx.fill(); //パスの描画 ctx.stroke(); }); </script>
円弧の塗りつぶしと描画
中心(100,50)、半径30、90度~360度を時計回りの円弧を半透明赤で塗りつぶし、線を青色で影付きで描画します。
<canvas id="test4canvas" style="width:200px;height:100px;border:1px solid #666;" width="200" height="100"> </canvas> <script> window.addEventListener("load",function(){ //キャンバスの取得 let can=document.getElementById("test4canvas"); //描画コンテキストの取得 let ctx=can.getContext("2d"); //塗りつぶしの色を設定(半透明の青) ctx.fillStyle="rgba(255,0,0, 0.5)"; //線の幅を指定 ctx.lineWidth=16; //線の色を設定(青) ctx.strokeStyle="rgba(0,0,255, 1.0)"; //影のぼかし設定 ctx.shadowBlur=4; //影の色設定 ctx.shadowColor="rgb(0,0,0)"; //影のずらし設定 ctx.shadowOffsetX=8; ctx.shadowOffsetY=4; //パスの開始 ctx.beginPath(); ctx.arc(100,50, 30, 0.5*Math.PI, 2*Math.PI); //パスの塗りつぶし ctx.fill(); //パスの描画 ctx.stroke(); }); </script>
文字の塗りつぶしとパスの描画
文字"こんにちは"を線を青色で塗りつぶしを半透明赤色(袋文字)、影付きで描画します。
<canvas id="test5canvas" style="width:240px;height:100px;border:1px solid #666;" width="240" height="100"> </canvas> <script> window.addEventListener("load",function(){ //キャンバスの取得 let can=document.getElementById("test5canvas"); //描画コンテキストの取得 let ctx=can.getContext("2d"); //塗りつぶしの色を設定(半透明の赤) ctx.fillStyle="rgba(255,0,0, 0.5)"; //線の幅を指定 ctx.lineWidth=1; //線の色を設定(青) ctx.strokeStyle="rgba(0,0,255, 1.0)"; //影のぼかし設定 ctx.shadowBlur=4; //影の色設定 ctx.shadowColor="rgb(0,0,0)"; //影のずらし設定 ctx.shadowOffsetX=4; ctx.shadowOffsetY=2; //文字のフォント設定 ctx.font='bold 40px Verdana,Roboto,"Droid Sans","游ゴシック",YuGothic,"メイリオ",Meiryo,'+ '"ヒラギノ角ゴ ProN W3","Hiragino Kaku Gothic ProN","MS Pゴシック",sans-serif'; ctx.textBaseline="middle"; //文字のパスの塗りつぶし ctx.fillText("こんにちは", 10,50); //パスの描画 ctx.strokeText("こんにちは", 10,50); }); </script>
回転文字の描画
文字"こん"を座標(120,50)に上下左右中央で90度(時計回り)回転して赤色で描画します。
<canvas id="test6canvas" style="width:240px;height:100px;border:1px solid #666;" width="240" height="100"> </canvas> <script> window.addEventListener("load",function(){ //キャンバスの取得 let can=document.getElementById("test6canvas"); //描画コンテキストの取得 let ctx=can.getContext("2d"); //塗りつぶしの色を設定(赤) ctx.fillStyle="rgb(255,0,0)"; //文字フォントを設定 ctx.font='bold 24px Verdana,Roboto,"Droid Sans","游ゴシック",YuGothic,"メイリオ",Meiryo,'+ '"ヒラギノ角ゴ ProN W3","Hiragino Kaku Gothic ProN","MS Pゴシック",sans-serif'; ctx.textBaseline="middle"; ctx.textAlign="center"; //座標変換 ctx.resetTransform(); ctx.translate(120,50); ctx.rotate(0.5*Math.PI); //文字のパスの塗りつぶし ctx.fillText("こん", 0,0); //ctx.fillStroke("こん", 0,0); //座標変換をリセット ctx.resetTransform(); }); </script>