- HOME
- JavaScript入門[HTML5編]
- 描画情報の保存・復元
このページではcanvasの描画情報を保存したり復元したりする方法を見ていきます。
canvasの描画情報を保存・復元する
canvasの描画情報を保存・復元するには、save(),restore()を使います。
- context.save()
- canvasの描画情報を保存します。
- context.restore()
- save()で保存した描画情報を復元します。
保存される描画情報の幾つかを以下に挙げておきます。
線と形状
lineWidth, lineCap, miterLimit
色と不透明度
strokeStyle, fillStyle
シャドウ
shadowOffsetX, shadowOffsetY, shadowBlur, shadowColor
文字関係
font, textAlign, textBaseline
変形情報
setTransform, rotate, translate
canvas描画情報を保存し復元させるサンプル
以下のサンプルでは、キャンバスの色(fillStyle)を保存していきます。
- 「色変更」ボタンを押すと、その度に違う色の矩形を描きます。
- 「保存」ボタンを押すと、現在の色を記憶します。
- 「復元」ボタンを押すと、記憶した色で矩形を描きます。
<canvas id="cv1" width="360" height="240"></canvas> <script> var ctx = document.getElementById("cv1").getContext("2d"); //色を変換して矩形を描く関数 function colset() { var r = Math.floor( Math.random() * 256 ); var g = Math.floor( Math.random() * 256 ); var b = Math.floor( Math.random() * 256 ); ctx.fillStyle ="rgb(" + r + "," + g + "," + b +")"; ctx.fillRect(0,0,360,240); } //fillStyleの情報を保存する関数 function cv_save() { ctx.save(); } //fillStyleの情報を復元する関数 function cv_load() { ctx.restore(); ctx.fillRect(0,0,360,240); } </script> <form> <input type="button" value="色変更" onclick="colset()"> <input type="button" value="保存" onclick="cv_save()"> <input type="button" value="復元" onclick="cv_load()"> </form>
<描画結果>canvasタグにはCSSで二重線の枠を付けています
save()は何度でも保存が行えます。例えば、青→黄色→ピンクと3回保存したとします。 これでrestore()を呼び出すと、呼び出す度にピンク→黄色→青と変わっていきます。
キャンバスの変形を保存・復元する
もう一つサンプルを見てみましょう。以下のスクリプトでは、 for文を使ってsetTransform()の第2引数を変えながら、矩形を描いていきます。 変形の度にsave()を使って保存します。
その後、「復元」ボタンを押してみてください。 傾き具合が戻りながら文字が描かれていきます。
<canvas id="cv2" width="360" height="240"></canvas> <script> var ctx2 = document.getElementById("cv2").getContext("2d"); ctx2.fillStyle ="rgba(255,0,255,0.3)"; ctx2.strokeStyle = "green"; ctx2.font = "normal 32px Arial"; ctx2.textBaseline = "top"; for ( var i = 0; i < 5 ; i++ ) { ctx2.setTransform(1,0.2*i,0,1,0,0); ctx2.fillRect(0,0,360,40); ctx2.save(); //右側の傾きを5回に渡り保存 } //傾き具合を1回戻してテキストを描画する関数 function r_text(){ ctx2.restore(); ctx2.strokeText("restore",100,0); } </script> <form> <input type="button" value="復元" onclick="r_text()"> </form>
<描画結果>canvasタグにはCSSで二重線の枠を付けています
この他にrotate()やtransform()でも試してみましたが、 きちんと保存されていました。