【问题标题】:scale canvas image using translate() and scale() but get x and y coordinates same as original canvas image using javascript使用 translate() 和 scale() 缩放画布图像,但使用 javascript 获取与原始画布图像相同的 x 和 y 坐标
【发布时间】:2019-12-17 19:09:07
【问题描述】:

在初始比例为 1.08 的画布图像上双击后,它会给出在我缩放画布图像后不匹配的 x 和 y。我想要相同的 x 和 y 甚至画布被缩放。即使在缩放画布之后我需要相同或拖动画布,我也需要相同的 x 和 y 而无需更改。因为我想计算画布上绘制的 2 个点之间的距离,所以如果我计算没有缩放的两点之间的距离(单击加号按钮后)和缩放后,对于画布图像的同一区域,两者都是不同的。为什么?

html

<input type="button" id="plus" value="+">
<input type="button" id="minus" value="-">    
<canvas id="myCanvas" width="500" height="500"></canvas>

javascript

<script>
function draw(scale, translatePos){
    var canvas = document.getElementById("myCanvas");
    var context = canvas.getContext("2d");

    // clear canvas
    context.clearRect(0, 0, canvas.width, canvas.height);

    context.save();
    context.translate(translatePos.x, translatePos.y);
    context.scale(scale, scale);
    t = scale ;
    context.drawImage(img, 0, 0, img.width,    img.height,     // source rectangle
                   0, 0, canvas.width, canvas.height); // destination rectangle;


    context.restore();
}

var initialize = (function(){
    var canvas = document.getElementById("myCanvas");

    var translatePos = {
        x: canvas.width/10,
        y: canvas.height/10 
    };

    var scale = 1.0;
    var scaleMultiplier = 0.92;
    var startDragOffset = {};
    var mouseDown = false;
    var t = 1.0;


    img = new Image();
    img.src = 'http://irlen.com/wp-content/uploads/2015/09/world-map-large.png';

    // add button event listeners
    document.getElementById("plus").addEventListener("click", function(){
        scale /= scaleMultiplier;
        draw(scale, translatePos);
    }, false);

    document.getElementById("minus").addEventListener("click", function(){
        scale *= scaleMultiplier;
        draw(scale, translatePos);
    }, false);
 canvas.addEventListener("dblclick", function(evt){


        alert(evt.clientX / t +' '+evt.clientY);

    });
    // add event listeners to handle screen drag
    canvas.addEventListener("mousedown", function(evt){
        mouseDown = true;
        startDragOffset.x = evt.clientX - translatePos.x;
        startDragOffset.y = evt.clientY - translatePos.y;
    });

    canvas.addEventListener("mouseup", function(evt){
        mouseDown = false;
    });

    canvas.addEventListener("mouseover", function(evt){
        mouseDown = false;
    });

    canvas.addEventListener("mouseout", function(evt){
        mouseDown = false;
    });

    canvas.addEventListener("mousemove", function(evt){
        if (mouseDown) {
            translatePos.x = evt.clientX - startDragOffset.x;
            translatePos.y = evt.clientY - startDragOffset.y;
            draw(scale, translatePos);
        }
    });

    draw(scale, translatePos);
}());
</script>

【问题讨论】:

  • 你能提供工作链接吗...很容易提供解决方案。
  • 根据图像画布放大缩小,绘制的线也在我放大之前绘制的相同位置重绘。我想要解决方案,但我找不到因为 lineTo(x,y): x and y corredinates每次放大缩小后都会改变。我需要实施哪种方法才能获得完美的解决方案?
  • 我已经更新了你可以在那里查看的链接,如果你有任何问题,请告诉我。

标签: html html5-canvas


【解决方案1】:

根据给定的代码和提供的链接,我可以看到您只需将当前距离除以最新的比例因子。

new_measure = getDistance(x1,x2,y1,y2) / scaleFactor; 

【讨论】:

  • 您可以在数组中维护(存储)所有行(起点和终点)。每次重绘画布时,只需使用该数组重绘画线并相应地使用 scaleFactor。
  • 如果我从 draw(scale, translatePos) 函数中删除 context.translate(translatePos.x, translatePos.y) 那么它会给我准确的信息。但我也想用 context.translate(translatePos.x, translatePos.y) 在画布图像上拖动。所以有了这个我不能得到确切的new_x1。你能推荐我吗?
  • 即使在拖动图像后,我也希望所有行都回到相同位置的图像,但我无法得到它。
  • 使用当前版本的代码创建一个链接。我会修改它。
  • jsfiddle.net/j58bv7tc/6 我添加了函数 drawMeasure() 用于在放大和缩小后将线条重绘回图像。拖动后,我还希望所有行都回来。但我很困惑在哪个事件中我需要添加函数 drawMeasure()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-25
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-12
相关资源
最近更新 更多