javascript - canvas - putImageData并不总是有效

时间:2016-02-23 13:04:14

标签: javascript canvas getimagedata putimagedata

在画布中恢复背景时遇到问题。我有一个画布,根据选项的说法改变大小(它可以变得非常大),我在它上面绘制图像,现在我想要一个指示器来显示鼠标在网格格式中的位置。问题是红色框被绘制,但下次curXcurY更改后背景不会重新绘制。

我注意到的一个奇怪的部分是,当我将鼠标移到黑色区域时,红色框似乎是暗红色,但当我在同一个地方来回移动时,红色似乎变得更强。有时我之前绘制的红色框也变得更强,没有重新审视这些区域,就像一条小道正在形成。

有时只返回背景,但通常是在我离开该区域时。

<canvas id="leveldraw" onmousemove="getMouse(event)" onmouseout="stopMouse()" width="0" height="0"></canvas>

...

var oldBlk = null;
...
function getMouse(e)
{
    var offsetpos = recursive_offset(canvas);
    var oldX = curX;
    var oldY = curY;
    mouseX = e.clientX + offsetpos.x + (canvas.offsetLeft/2);
    mouseY = e.clientY + offsetpos.y + (canvas.offsetTop/2)+24;
    curX = Math.floor(mouseX/24);
    curY = Math.floor(mouseY/24);
    if(oldX!=curX || oldY!=curY)
    {
        if(oldBlk != null)
            ctx.putImageData(oldBlk,(oldX*24)-24,(oldY*24)-24);
        oldBlk = ctx.getImageData((curX*24)-24,(curY*24)-24,72,72);
        ctx.lineWidth="1";
        ctx.strokeStyle="red";
        ctx.rect(curX*24,curY*24,24,24);
        ctx.stroke();
    }
}
function stopMouse()
{
    ctx.putImageData(oldBlk,(curX*24)-24,(curY*24)-24);
    oldBlk = null;
}

recursive_offset()Get mouse position in scrollable div

我甚至在整个画布上尝试了getImageData,但这似乎不起作用。可能它在离开画布时确实恢复了整个背景,但是一旦我回到画布上,红色框就回来了。

1 个答案:

答案 0 :(得分:1)

在下次绘图操作之前,您应该使用ctx.beginPath()。调用stroke()fill()不会清除堆栈,并且下次会再次绘制,这会导致路径形成。