我创建了一个 HTML5 绘图应用程序,它具有允许用户选择要绘制的颜色、更改绘图工具的大小(半径)、撤消、重做和完全清除画布的基本功能。
我最近使用 globalCompositionProperty (destination-out) 添加了一个橡皮擦工具来擦除画布的选定区域。这部分工作正常,但是当我去撤消擦除时,整个画布都被清除了,重做功能不起作用。当我使用常规绘图工具(使用源代码)恢复绘图时,撤消/重做工作。我已经包含了应用程序中使用的一些功能的代码。每次关闭绘图工具时,我都会存储画布的快照。这被添加到用于撤消和恢复画布的数组中。
有人可以解释我在这里做错了什么吗?我不确定我是否了解 globalCompositeOperation 属性如何影响已保存的画布 DataURI。
function storeSnapshot() {
cStep++;
if (cStep < cPushArray.length) { cPushArray.length = cStep; }
cPushArray.push(canvas.toDataURL());
}
var putPoint = function(e){
if(dragging){
context.lineTo(e.clientX - 174, e.clientY - 50);
context.stroke();
context.beginPath();
if(eraser == true){
context.globalCompositeOperation="destination-out";
}else{
context.globalCompositeOperation="source-over";
}
context.arc(e.clientX - 174, e.clientY - 50 , radius, 0, 2 * Math.PI);
context.fill();
context.beginPath();
context.moveTo(e.clientX - 174, e.clientY - 50);
}
}
更新:玩了一段时间后,我尝试了一些可以解决我的问题的方法。我不确定这是否是正确的做事方式,但我想我会向你展示我所做的一切。
我有一个在鼠标启动时触发的脱离功能。这是之前的功能:
var disengage = function(){
dragging = false;
context.beginPath();
storeSnapshot();
}
我添加了一些代码,这允许用户使用橡皮擦工具并撤消/重做操作。我还不确定为什么会这样,所以如果有人有见识,我将不胜感激。
var disengage = function(){
dragging = false;
context.beginPath();
if(eraser == true)
{
context.globalCompositeOperation="source-over";
}
storeSnapshot();
}