缩放结构 js 画布及其所有对象

Sun*_*ena 4 html javascript fabricjs

我正在使用一个函数来缩放整个 fabric.js 画布,这个函数采用像 zoomCanvas(2.2) 这样的百分比值;其中 2.2 表示 220% 但不是百分比,我需要按像素缩放画布以适合容器中的画布,例如当画布从 json 数据加载到页面上时,其初始大小为 1200px x 700px,我的容器大小为 500px。现在我需要找到一种方法可以将这个 500px 转换为百分比值,以便整个画布及其所有对象都适合 500px。

这是比例函数,其中因子是百分比值

   function zoomCanvas(factor) {
canvas.setHeight(canvas.getHeight() * factor);
canvas.setWidth(canvas.getWidth() * factor);
if (canvas.backgroundImage) {
    // Need to scale background images as well
    var bi = canvas.backgroundImage;
    bi.width = bi.width * factor; bi.height = bi.height * factor;
}
var objects = canvas.getObjects();



var tcounter = 0;

for (var i in objects) {

    tcounter++;


    //alert(tcounter);
    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();
}
canvas.renderAll();
canvas.calcOffset();
}
Run Code Online (Sandbox Code Playgroud)

And*_*zzi 10

您需要的比例因子是:

scaleRatio = Math.min(containerWidth/canvasWidth, containerHeight/canvasHeight);
Run Code Online (Sandbox Code Playgroud)

要缩放你的画布,你真的应该使用:

canvas.setDimensions({ width: canvas.getWidth() * scaleRatio, height: canvas.getHeight() * scaleRatio });
Run Code Online (Sandbox Code Playgroud)

然后

canvas.setZoom(scaleRatio)
Run Code Online (Sandbox Code Playgroud)

不需要自定义缩放功能

  • 它应该,缩放是缩放 (2认同)

Obs*_*ver 2

您应该有一个具有某些尺寸的原始画布。从该画布中,您应该找到您的factorX 和factorY 值。例如,您的原始画布为 1280x1020 像素,您需要转换为尺寸 500x500 像素。

var factorX = 500 / 1280;
var factorY = 500 / 1020;
Run Code Online (Sandbox Code Playgroud)

然后,修改你的函数

function zoomCanvas(factor) {...}
Run Code Online (Sandbox Code Playgroud)

function zoomCanvas(factorX, factorY) {...}
Run Code Online (Sandbox Code Playgroud)

使用factorX 作为宽度值,使用factorY 作为高度值。