【问题标题】:Unable to retain the position of circle after zooming over a image in fabricjs在fabricjs中放大图像后无法保留圆圈的位置
【发布时间】:2015-11-19 22:48:45
【问题描述】:

我正在尝试使用 Fabricjs 库在图像上绘制图像和圆圈。 我正在按照以下步骤操作: 1) 在画布上绘制图像。 2) 在画布上画圆。 3) 使用鼠标滚动放大/缩小图像。

问题: 我可以缩放并且非常适合图像,但圆圈的位置会发生变化,例如,如果我通过将圆圈拖动到图像上(例如熊猫的眼睛)来保持圆圈并放大/缩小,圆圈的位置会得到从眼睛转移到其他地方。

代码如下:

HTML:

<h1>After Zooming the shapes positions are changing<h1>
<canvas id="canvas" height=700 width=700></canvas>

JavaScript:

var canvas = new fabric.Canvas("canvas");
    fabric.Image.fromURL('http://www.nairaland.com/attachments/1539614_pow_jpegfbbdd74848f20f626bb76cedb0cdded3', function(oImg) {
        oImg.scale(1.0).set({
        left: 1,
        top: 1,
        selectable : false
    });

    canvas.add(oImg).setActiveObject(oImg);
    var circle = new fabric.Circle({
        left: 100,
        top: 80,
        originX: 'left',
        originY: 'top',
        radius: 45,
        angle: 0,
        fill: '',
        stroke:'red',
        strokeWidth:3
    });

    canvas.add(circle);
    canvas.renderAll();

    _applyZoom();

});

var _applyZoom = function () {
    canvas.on("mouse:move", function(event) {
    currentMouseY = Math.round(event.e.clientY );
});

canvas.getObjects()[0].on("mousemove", function(event) {
    currentMouseX = Math.round(event.e.clientX );
});

var mousewheelevt=(/Firefox/i.test(navigator.userAgent))? "DOMMouseScroll" : "mousewheel"
if (document.attachEvent) 
  document.attachEvent("on"+mousewheelevt, _zoom) 
else if (document.addEventListener) 
  document.addEventListener(mousewheelevt, _zoom, false)
return this;

}

function _zoom(e, dragDelta) {  
    var evt=window.event || e;
    var delta = (dragDelta == undefined) ? evt.detail? evt.detail*(-120) : evt.wheelDelta : dragDelta;
    var factor = 0.9;
    if (delta > 0) {
        factor = 1/factor;
    }
    var objects = canvas.getObjects();
    var image = objects[0];
    var imageX = (currentMouseX - image.getLeft()),
        imageY = (currentMouseY - image.getTop());
    var dx = imageX * (factor - 1),
        dy = imageY * (factor - 1);

    //applying zoom values.
    for (var i in objects) {
        objects[i].left = objects[i].left - dx;
        objects[i].top = objects[i].top - dy;
        objects[i].scaleX = objects[i].scaleX * factor;
        objects[i].scaleY = objects[i].scaleY * factor;
        objects[i].setCoords();
    }

    canvas.renderAll();
    e.preventDefault();
    return false;

} 

Fiddle for the work!

【问题讨论】:

  • 我已经从 Fiddler 添加了代码。
  • 非常感谢@KarlGjertsen

标签: javascript jquery html canvas fabricjs


【解决方案1】:

主要问题在于 for 循环,当您尝试为对象赋予新维度时。

我改了for循环,没问题

 for (var i in objects) {
       var scaleX = objects[i].scaleX;
            var scaleY = objects[i].scaleY;
            var left = objects[i].left;
            var top = objects[i].top;

            var tempScaleX = scaleX * factor;
            var tempScaleY = scaleY * factor;
            var tempLeft = left * factor;
            var tempTop = top * factor;

            objects[i].scaleX = tempScaleX;
            objects[i].scaleY = tempScaleY;
            objects[i].left = tempLeft;
            objects[i].top = tempTop;

            objects[i].setCoords();
    }

fiddle live

希望有帮助,祝你好运。

【讨论】:

  • 它有效,只能满足开发人员,但从最终用户的角度考虑。缩放是否正确发生?在你的小提琴中,它从左上角缩放,但在我的小提琴中看到缩放功能。无论如何感谢您的回答和时间
猜你喜欢
  • 2015-06-15
  • 1970-01-01
  • 2019-09-07
  • 2017-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多