一个像素填充,带有画布

时间:2013-04-03 16:54:55

标签: javascript html5 canvas mapping pixel

这可能是一个有点愚蠢的问题,但是......是否可以逐个像素地填充HTML画布元素,具体取决于用户点击的位置?

我希望有一个空白画布,用户将一次单击一个像素,这将填充一种颜色,并将该用户/像素输入数据库。

如何做到这一点? 我怎么知道用户点击了什么像素?

由于

1 个答案:

答案 0 :(得分:1)

是的,您可以根据鼠标点击单独设置每个画布像素。

以下是使用context.getImageData和context.putImageData设置单个像素的方法:

    function setPixel(x, y, red, green, blue) {
        pixPos=( (~~x) + (~~y)) * 4;
        var pxData = ctx.getImageData(x,y,1,1);
            pxData.data[0]=red;
            pxData.data[1]=green;
            pxData.data[2]=blue;
            pxData.data[3]=255;
            ctx.putImageData(pxData,x,y);
    }

通过添加如下事件监听器,您可以获得鼠标单击的X / Y位置:

    // get the position of the canvas relative to the web page
    var canvasOffset=$("#canvas").offset();
    var offsetX=canvasOffset.left;
    var offsetY=canvasOffset.top;

    // tell the browser to send you mouse down events
    // Here I use jquery -- be sure to add jquery or just do addEventListener instead
    $("#canvas").mousedown(function(e){handleMouseDown(e);});

    // handle the mousedown events that the browser sends you
    function handleMouseDown(e){
      mouseX=parseInt(e.clientX-offsetX);
      mouseY=parseInt(e.clientY-offsetY);

      // Put your mousedown stuff here
      setPixel(mouseX,mouseY,red,green,blue);
    }

这是代码和小提琴:http://jsfiddle.net/m1erickson/wtStf/

<!doctype html>
<html>
<head>
<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css -->
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>

<style>
    body{ background-color: ivory; }
    canvas{border:1px solid red;}
</style>

<script>
$(function(){

    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");

    var canvasOffset=$("#canvas").offset();
    var offsetX=canvasOffset.left;
    var offsetY=canvasOffset.top;

    var red=255;
    var green=0;
    var blue=0;

    function setPixel(x, y, red, green, blue) {
        pixPos=( (~~x) + (~~y)) * 4;
        var pxData = ctx.getImageData(x,y,1,1);
            pxData.data[0]=red;
            pxData.data[1]=green;
            pxData.data[2]=blue;
            pxData.data[3]=255;
            ctx.putImageData(pxData,x,y);
    }


    function handleMouseDown(e){
      mouseX=parseInt(e.clientX-offsetX);
      mouseY=parseInt(e.clientY-offsetY);

      // Put your mousedown stuff here
      setPixel(mouseX,mouseY,red,green,blue);
    }

    $("#canvas").mousedown(function(e){handleMouseDown(e);});

}); // end $(function(){});
</script>

</head>

<body>
    <canvas id="canvas" width=300 height=300></canvas>
</body>
</html>

[编辑其他问题]

您可以轻松修改代码以设置像素块,如下所示:

var blockWidth=25;
var blockHeight=25;

function setPixel(x, y, red, green, blue) {
    pixPos=( (~~x) + (~~y)) * 4;
    var pxData = ctx.getImageData(x,y,blockWidth,blockHeight);
    for(var n=0;n<blockWidth*blockHeight;n++){
        pxData.data[n*4+0]=red;
        pxData.data[n*4+1]=green;
        pxData.data[n*4+2]=blue;
        pxData.data[n*4+3]=255;
    }
        ctx.putImageData(pxData,x,y);
}