シンプルなキャンバス要素があり、それに複雑なリソース集約的な画像を描画するとします。私は絵の上にいくつかの単純な線を描きます。キャンバスの状態を(線が描画される前に)「保存」してから、それ以上の変更を消去するために状態を再描画する方法がありますか?私はsave()
とrestore()
でこれを試してみましたが、私はその状態がキャンバス上の現在の図形を含んでいるとは思いません。私のデモを下に見てください。変更後のキャンバスを元に戻す
var canvas = document.getElementById("canvas");
var context = canvas.getContext('2d');
function init() {
// This is some computationally intensive drawing we don't want to repeat
context.fillStyle = "rgb(150,29,28)";
context.fillRect(40, 40, 255, 200);
context.fillStyle = "rgb(150,83,28)";
context.fillRect(10, 10, 50, 50);
context.fillStyle = "rgb(17,90,90)";
context.fillRect(5, 100, 200, 120);
context.fillStyle = "rgb(22,120,22)";
context.fillRect(200, 200, 90, 90);
// Now we save the state so we can return to it
saveState();
}
function lines() {
// This is some drawing we will do and then want to get rid of
context.beginPath();
context.moveTo(125, 125);
context.lineTo(150, 45);
context.lineTo(200, 200);
context.closePath();
context.stroke();
}
function saveState() {
//copy the data into some variable
}
function loadState() {
//load the data from the variable and apply to canvas
}
init();
#canvas {
border: 1px solid #000;
}
<canvas id="canvas" width="300" height="300"></canvas>
<button onClick="lines()">Draw over image</button>
<button onClick="loadState()">Restore</button>
キャンバス上のピクセルにすべてがマージされている間に、各状態を追跡する必要があります。単純なアンドゥー・アンド・リドゥ・スタックを作成してください(https://github.com/epistemex/undo- redo)。 – K3N