【问题标题】:Fabricjs - How to detect total width/height of canvas where objects existFabricjs - 如何检测存在对象的画布的总宽度/高度
【发布时间】:2017-05-31 15:25:57
【问题描述】:

所以我想保存基于比例 1 的画布,并且我想包含所有现有/可见的对象。

所以现在,我的画布是 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 的内容仍会被保存。

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


小提琴: 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);
}

【问题讨论】:

    标签: javascript html canvas fabricjs


    【解决方案1】:

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

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

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

    代码:

    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'
        );  
    }
    

    【讨论】:

    • 我的对象已经存在。之后我尝试将它们添加到 gr 中,然后添加 gr,但它给我的宽度/高度为零。有任何想法吗?将发布我所做的。但是组中有对象
    • @A.Lau 老实说,我不太了解fabricjs。也许“addWithUpdate”是您要找的?看这里:stackoverflow.com/questions/33751273/…
    • @A.Lau 刚刚检查过,试试 AddWithUpdate :)
    • 根据您的“组”答案构建我发现:jsfiddle.net/softvar/mRA8Z 效果更好。
    猜你喜欢
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    • 2018-10-17
    • 2011-05-01
    • 2012-12-06
    • 2020-03-02
    • 2023-02-03
    相关资源
    最近更新 更多