【问题标题】:Load from JSON with dynamic patterns, patternSourceCanvas is not defined error return by the serialize JSON data从具有动态模式的 JSON 加载,patternSourceCanvas 未定义序列化 JSON 数据返回的错误
【发布时间】:2018-12-23 23:50:32
【问题描述】:

我正在尝试保存 Fabric.js 画布并使用 loadFromJson 重新加载它。但我收到错误 patternSourceCanvas 未定义。我想我应该让它成为全局的,所以我删除了 var.

如何在 Fabric JS 中设置全局变量并使用 var patternSourceCanvas? 当我使用下面的代码时,一切正常,并且 JSON 很容易加载。

var t = https://image.freepik.com/free-photo/roof-texture_21206171.jpg

fabric.util.loadImage(t, function(t) {
    var svg_width  = i.width;
    console.log('svg widh' + i.width + 'svg height' + i.height);
    console.log('img width t'+  t.width + ' img height' + t.height);
    if(svg_width >= 300){
        if (i.isSameColor && i.isSameColor() || !i.paths) {
            i.setPatternFill({
                source: t, repeat: 'repeat', offsetX:200 , offsetY : -110 // working
            }), e.fabric.renderAll();
            console.log('in if image 300 up  ', t);
        } else if (i.paths){
            for (var r = 0; r < i.paths.length; r++) 
                i.paths[r].setPatternFill({
                    source: t, repeat: 'repeat' , offsetX: -100 , offsetY:-110 
                }), e.fabric.renderAll();
            console.log('in image elseeee 300 up     ', t);
        }
    }
})

但是当我用新的 patternSourceCanvas 变量填充其他一些新形状时,它就不起作用了。请帮助我处理动态模式。

var t = https://image.freepik.com/free-photo/roof-texture_21206171.jpg

fabric.Image.fromURL(t, function (img)  {
    img.scaleToHeight(200);
    var patternSourceCanvas = new fabric.StaticCanvas();

    patternSourceCanvas.add(img);
    patternSourceCanvas.renderAll();

    var pattern = new fabric.Pattern({
    source: function() {
        patternSourceCanvas.setDimensions({
            width: img.getScaledWidth() ,
            height: img.getScaledHeight()
        });
        patternSourceCanvas.renderAll();
            return patternSourceCanvas.getElement();
        },
        repeat: r
    });
    console.log('pattern', pattern);
    //p.set('fill', pattern);
    canvas.renderAll();
    if (i.isSameColor && i.isSameColor() || !i.paths) {

        i.setPatternFill(pattern);
    } else if(i.paths) {
        for (var r = 0; r < i.paths.length; r++) {
            i.paths[r].setPatternFill(pattern);
        }
    }
    e.fabric.renderAll();
});

【问题讨论】:

    标签: angularjs fabricjs


    【解决方案1】:

    您需要将patternSourceCanvas 放入全局范围/ loadFromJSON 可以访问 patternSourceCanvas 的范围。否则,您可以直接使用启用 cors 的图像。

    演示

    var imageUrl = 'https://upload.wikimedia.org/wikipedia/commons/2/22/Wikimapia_logotype.svg';
    var canvas = new fabric.Canvas('canvas');
    var rect = new fabric.Rect({
      width: 200,
      height: 200,
      strokeWidth: 2,
      stroke: '#000'
    })
    canvas.add(rect);
    
    fabric.Image.fromURL(imageUrl, function(img) {
      img.scaleToHeight(200);
      var patternSourceCanvas = new fabric.StaticCanvas();
      patternSourceCanvas.add(img);
      patternSourceCanvas.setDimensions({
        width: img.getScaledWidth(),
        height: img.getScaledHeight()
      });
      patternSourceCanvas.renderAll();
      var pattern = new fabric.Pattern({
          source: patternSourceCanvas.getElement()
        },
        function(patternObj) {
          rect.fill = patternObj;
          rect.dirty = true;
          canvas.renderAll();
        });
    }, {
      crossOrigin: 'annonymous'
    });
    
    function loadfromjson() {
      var json = canvas.toJSON();
      canvas.clear();
      setTimeout(function() {
        canvas.loadFromJSON(json, canvas.renderAll.bind(canvas));
      }, 1000)
    }
    canvas{
      border:2px solid #000;
    }
    <canvas id="canvas" width="300" height="300"></canvas><br>
    <button onclick="loadfromjson()">loadfromjson </button>
    <script src='https://rawgit.com/kangax/fabric.js/master/dist/fabric.js'></script>

    【讨论】:

    • 你使用了另一个与我的fabric JS不匹配的fabric js
    • 我在 jsfiddle 中做了一个演示,并且可以使用上面的 Fabric JS 脚本正常工作。演示链接:jsfiddle.net/mgtrb7av/24
    • @YpNarola 你有什么问题吗?
    • 是的,我正面临这个问题。您能否检查一下我在项目中使用的织物 js。如需更多了解,请查看演示链接jsfiddle.net/mgtrb7av/31
    • @YpNarola,你的面料版本太旧了,它是 1.5.0,不再维护。这是您更新的fiddle,在您的版本中工作。如果可能,请尝试更新到较新版本的 fabricjs。
    猜你喜欢
    • 2018-09-14
    • 1970-01-01
    • 2016-11-23
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 2016-03-08
    • 1970-01-01
    • 2015-07-03
    相关资源
    最近更新 更多