javascript - Fabricjs - 如何检测存在对象的 Canvas 的总宽度/高度

标签 javascript html canvas fabricjs

所以我想根据比例 1 保存 Canvas ,并且我想包括所有现有/可见对象。

所以现在,我的 Canvas 是 600x400,如果我要保存它,它只会保存 600x400 内部的内容,并且它尊重缩放级别(更高的缩放会看到更少的东西,更低的缩放会看到更多的东西但是更小)。

我通过运行这段代码解决了这个问题:

let zoom = this.canvas.getZoom();
this.canvas.setZoom(1);
let url = this.canvas.toDataURL({width: 1000, height: 700, multiplier: 1});
this.canvas.setZoom(zoom);
window.open(
  url,
  '_blank' // <- This is what makes it open in a new window.
);

这样做是将图像保存为 1000x700,因此超过 600 像素但小于 1000 的内容仍会保存。

但是,这是硬编码的。所以我想知道是否存在现有函数或干净/简单的方法来检测所有对象所在的位置并返回完整大小(宽度和高度)。


fiddle : http://jsfiddle.net/1pxceaLj/3/

更新 1:

var gr = new this.fabric.Group([], {
  left: 0,
  top: 0
});
this.canvas.forEachObject( (o) => {
  gr.add(o);
});

this.canvas.add(gr);
this.canvas.renderAll();

console.log(gr.height, gr.width); // 0 0

解决方案

使用组是最好的主意。最好的例子:http://jsfiddle.net/softvar/mRA8Z/

function selectAllCanvasObjects(){
    var objs = canvas.getObjects().map(function(o) {
        return o.set('active', true);
    });

    var group = new fabric.Group(objs, {
        originX: 'center', 
        originY: 'center'
    });

    canvas._activeObject = null;

    canvas.setActiveGroup(group.setCoords()).renderAll();
    console.log(canvas.getActiveGroup().height);
}

最佳答案

一种可能性是使用 fabricjs 创建一种容器 group并将所有创建的对象添加到此容器中。

我在这里更新了你的 fiddle :http://jsfiddle.net/1pxceaLj/4/

因此,您可以只使用 group.widthgroup.height,或许添加一点偏移量或最小值,这样您就可以将动态值传递给toDataUrl 即使 Canvas 较小。

代码:

var canvas  = new fabric.Canvas('c');

var shadow = {
    color: 'rgba(0,0,0,0.6)',
    blur: 20,    
    offsetX: 10,
    offsetY: 10,
    opacity: 0.6,
    fillShadow: true, 
    strokeShadow: true 
}

 var rect = new fabric.Rect({
        left: 100,
        top: 100,
        fill:  "#FF0000",
        stroke: "#000",
        width: 100,
        height: 100,
        strokeWidth: 10, 
        opacity: .8      
    });

 var rect2 = new fabric.Rect({
        left: 800,
        top: 100,
        fill:  "#FF0000",
        stroke: "#000",
        width: 100,
        height: 100,
        strokeWidth: 10, 
        opacity: .8      
    });    
rect.setShadow(shadow);
//canvas.add(rect);
//canvas.add(rect2);

var gr = new fabric.Group([ rect, rect2 ], {
  left: 0,
  top: 0
});

canvas.add(gr);

function save()
{
        alert(gr.width);
    alert(gr.height);
    let zoom = canvas.getZoom();
    var minheight = 700;
    canvas.setZoom(1);
    let url = this.canvas.toDataURL({width: gr.width, height: gr.height > minheight ? gr.height : minheight, multiplier: 1});
    canvas.setZoom(zoom);
    window.open(
      url,
      '_blank'
    );  
}

关于javascript - Fabricjs - 如何检测存在对象的 Canvas 的总宽度/高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44276877/

相关文章:

javascript - 在指令中使用 $uibModalInstance

javascript - Greasemonkey 脚本每分钟重新加载页面

html - Bootstrap 中的事件下拉菜单

javascript - Fabric JS getContext ('2d' ) 与 getImageData 颜色不匹配

javascript - Bootstrap 模式无法与计时器一起使用

javascript - 设置 Google map 以在加载时对邮政编码进行地理编码

javascript - 不与 SVG 交互

php - SQL 数据 : HTML Table display of column data containing multiple rows

javascript - HTML5 中 <canvas> 部分的就地裁剪

android - 获取字符串的 (Android.Graphics) 路径