有没有办法用jQuery检测画布线?

时间:2013-03-10 17:33:22

标签: jquery html5 canvas mouseover

我试图弄清楚如何用户的鼠标用jQuery在HTML 5画布上命中一行。

以下是生成画布线的代码:

<canvas id="myCanvas" width="400" height="400" style="border:1px solid #c3c3c3;">
Your browser does not support the canvas element.
</canvas>

<script type="text/javascript" src="js/jquery-1.4.2.min.js"></script>
<script type="text/javascript">
    window.onload = function(){
        var c=document.getElementById("myCanvas");
        var ctx=c.getContext("2d");
        ctx.moveTo(40,0);
        ctx.lineTo(40,360);
        ctx.stroke();
        ctx.moveTo(80,400);
        ctx.lineTo(80,40);
        ctx.stroke();
        ctx.moveTo(120,0);
        ctx.lineTo(120,360);
        ctx.stroke();
        ctx.moveTo(160,400);
        ctx.lineTo(160,40);
        ctx.stroke();
    };
</script>

我正在使用我在其他问题中实际找到的修改过的jQuery脚本,但现在我无法弄清楚如何在画布中检测线条,主要是颜色从白色到黑色的差异。我知道这可以通过图像来完成,但我还没有见过像这样的人。

我想我真正的问题是,有没有办法用jQuery检测canvas元素的颜色变化?

1 个答案:

答案 0 :(得分:6)

它可以用javascript做。实际上你在上面的例子中没有使用任何jQuery。一种简单的方法是从画布中抓取像素数据,并检查指定x和y位置的alpha。如果alpha未设置为0,那么您在画布上绘制了一些内容。下面是我快速拼凑的功能。

<强> Live Demo

var canvas = document.getElementById("canvas"),
    ctx = canvas.getContext("2d"),
    width = 400;
height = 400;

canvas.width = canvas.height = 200;

// draw
ctx.moveTo(40, 0);
ctx.lineTo(40, 360);
ctx.stroke();
ctx.moveTo(80, 400);
ctx.lineTo(80, 40);
ctx.stroke();
ctx.moveTo(120, 0);
ctx.lineTo(120, 360);
ctx.stroke();
ctx.moveTo(160, 400);
ctx.lineTo(160, 40);
ctx.stroke();

function detectLine(x, y) {
    var imageData = ctx.getImageData(0, 0, width, height),
        inputData = imageData.data,
        pData = (~~x + (~~y * width)) * 4;

    if (inputData[pData + 3]) {
        return true;
    }

    return false;
}

canvas.addEventListener("mousemove", function(e){
    var x  = e.pageX,
        y = e.pageY;
    console.log(detectLine(x, y));
});

console.log(detectLine(40, 100));
console.log(detectLine(200, 200));