18910140161

JavaScript-HTML画布绘制远离实际绘制点-堆栈溢出

顺晟科技

2022-10-18 12:35:07

261

我在画布里有一个图像。当我画它的时候,画一条远离实际点的线。我不知道为什么会发生这种情况,也不知道如何解决。

这是脚本,它是从这里取的。当我点击一个点时,它会绘制另一个点。使用鼠标

在HTML5画布上绘图

var canvas, ctx, flag = false,
  prevX = 0,
  currX = 0,
  prevY = 0,
  currY = 0,
  dot_flag = false;

var x = "black",
  y = 2;

function init() {
  canvas = document.getElementById('can');
  ctx = canvas.getContext("2d");
  w = canvas.width;
  h = canvas.height;

  canvas.addEventListener("mousemove", function(e) {
    findxy('move', e)
  }, false);
  canvas.addEventListener("mousedown", function(e) {
    findxy('down', e)
  }, false);
  canvas.addEventListener("mouseup", function(e) {
    findxy('up', e)
  }, false);
  canvas.addEventListener("mouseout", function(e) {
    findxy('out', e)
  }, false);

  base_image = new Image();
  base_image.src = document.getElementById("editable_image_path").src
  base_image.onload = function() {
    ctx.drawImage(base_image, 0, 0, 800, 400);
  };

}

function color(obj) {
  switch (obj.id) {
    case "green":
      x = "green";
      break;
    case "blue":
      x = "blue";
      break;
    case "red":
      x = "red";
      break;
    case "yellow":
      x = "yellow";
      break;
    case "orange":
      x = "orange";
      break;
    case "black":
      x = "black";
      break;
    case "white":
      x = "white";
      break;
  }
  if (x == "white") y = 14;
  else y = 2;

}

function draw() {
  ctx.beginPath();
  ctx.moveTo(prevX, prevY);
  ctx.lineTo(currX, currY);
  ctx.strokeStyle = x;
  ctx.lineWidth = y;
  ctx.stroke();
  ctx.closePath();
}

function erase() {
  var m = confirm("Want to clear");
  if (m) {
    ctx.clearRect(0, 0, w, h);
    document.getElementById("canvasimg").style.display = "none";
  }
}

function save() {
  document.getElementById("canvasimg").style.border = "2px solid";
  var dataURL = canvas.toDataURL();
  document.getElementById("canvasimg").src = dataURL;
  document.getElementById("canvasimg").style.display = "inline";
}

function findxy(res, e) {
  if (res == 'down') {
    prevX = currX;
    prevY = currY;
    currX = e.clientX - canvas.offsetLeft;
    currY = e.clientY - canvas.offsetTop;

    flag = true;
    dot_flag = true;
    if (dot_flag) {
      ctx.beginPath();
      ctx.fillStyle = x;
      ctx.fillRect(currX, currY, 2, 2);
      ctx.closePath();
      dot_flag = false;
    }
  }
  if (res == 'up' || res == "out") {
    flag = false;
  }
  if (res == 'move') {
    if (flag) {
      prevX = currX;
      prevY = currY;
      currX = e.clientX - canvas.offsetLeft;
      currY = e.clientY - canvas.offsetTop;
      draw();
    }
  }
}
<代码><;DIV Class=“ snap-field col-sm-12 ” style=“ height:800px;”>;<;主体onload=“ init()”>;<;画布ID=“ can ” width=“ 1000 ” height=“ 500 ”style=“ border:1px solid;position:absolute;”>;<;/画布>;<;/正文>;<;/DIV>;


顺晟科技:

不要在<div class="snap-field col-sm-12" style="height: 800px;"> <body onload="init()"> <canvas id="can" width="1000" height="500" style="border:1px solid;position:absolute;"> </canvas> </body> </div>函数中使用canvas.offsetX和canvas.offsety,而是使用findXYcanvas.getBoundingClientRect().top。它将为您提供更可靠的画布绝对坐标,作为绘图的参考点。

  • TAG:
相关文章
我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航