1

これはややばかげた質問かもしれませんが... ユーザーがクリックした場所に応じて、HTML キャンバス要素をピクセル単位で塗りつぶすことは可能ですか?

ユーザーが一度に1つのピクセルをクリックすると、色が塗りつぶされ、そのユーザー/ピクセルがデータベースに入力される空白のキャンバスが必要です。

これはどのように行われますか?どのピクセル、どのユーザーがクリックしたかを知るにはどうすればよいですか?

ありがとう

4

1 に答える 1

2

はい、マウスクリックに基づいて各キャンバス ピクセルを個別に設定できます。

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);
}
于 2013-04-03T17:37:48.780 に答える