【问题标题】:Place image on canvas at same x,y position as mouse onclick将图像放在画布上与鼠标 onclick 相同的 x,y 位置
【发布时间】:2012-10-25 18:43:57
【问题描述】:

我正在尝试制作一个网络应用程序,让用户可以在 html 画布上插入小字符图像。计划是让用户单击虚拟键盘上的按钮,然后在画布上单击以使相应的字符出现在用户单击的任何位置。现在我只是想让一个图像在点击时出现在画布上,但到目前为止它没有做任何事情。这是我现在拥有的代码,它嵌入在 html 文件中。

<script type="text/javascript">
            var mathCanvas = document.getElementById("matharea");
            var ctx = mathCanvas.getContext("2d");
            var el = mathCanvas;
            var xPos = 0;
            var yPos = 0;
            while(el && !isNaN(el.offsetLeft) && !isNaN(el.offsetTop)){
                xPos += el.offsetLeft - el.scrollLeft;
                yPos += el.offsetTop - el.scrollTop;
                el = el.parentNode;
            }
            var img = new Image();
            img.src = "five.png";
            mathCanvas.onclick = function(event){
                var x = event.clientX - xPos;
                var y = event.clientY - yPos;
                ctx.drawImage(img,x,y);
            };
</script>

我已经测试了 onclick 事件,它返回坐标,但图像不会出现。这里出了什么问题?

【问题讨论】:

  • img.src = "/absolute/path/to/image.png";
  • 在您的onclick 处理程序中,执行console.log(x,y); 并在此处发布结果。
  • 也就是说,由于您在画布本身上注册点击事件,您应该能够简单地使用event.offsetXevent.offsetY,而忽略其余的偏移处理代码。

标签: javascript image canvas onclick coordinates


【解决方案1】:

这应该可以工作,因为点击事件将在画布本身上触发:

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

        var img = new Image();
        img.src = "five.png";
        mathCanvas.onclick = function(event){
            var x = event.offsetX;
            var y = event.offsetY;
            ctx.drawImage(img,x,y);
        };

将图像居中于该点:

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

        var img = new Image();
        img.src = "five.png";
        mathCanvas.onclick = function(event){
            var x = Math.round(event.offsetX - img.width/2);
            var y = Math.round(event.offsetY - img.height/2);
            ctx.drawImage(img,x,y);
        };

【讨论】:

  • 谢谢,这是可行的,但它会将图像文件放在点击右侧的下方,并且还会放大图像。
  • 您希望图像以点击点为中心吗? drawImage 从左上角绘制。此外,从发布的代码来看,没有理由它不应该与实际图像具有相同的比例。您是否正在使用 CSS 调整画布的大小?你在缩放画布吗? (ctx.transform(...);)
  • 我希望点击从左上角绘制,而我使用的 .png 只有 8x14 像素,但它距离点击点很远。我已经在 CSS 中指定了画布的宽度和高度,我应该在 html 画布标签中这样做吗?
  • 是的。宽度和高度应在画布本身上定义。如果您在 CSS 中指定不同的宽度,它将拉伸画布。
  • 这是一个演示,说明 CSS 中定义的不匹配宽度/高度如何影响所有内容:jsfiddle.net/mRZn8
猜你喜欢
  • 2014-08-18
  • 2018-02-01
  • 2014-04-16
  • 1970-01-01
  • 2014-12-10
  • 2014-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多