使用fabric.js在canvas中加载JSON

11

我正在尝试使用fabric.js将数据保存到JSON中,并将其加载回画布,但是在尝试以下简单代码时出现错误:

canvas.add(new fabric.Rect({ width: 50, height: 50, fill: 'red', top: 100, left: 100 }));
var c = canvas.toJSON();
canvas.clear();
canvas.loadFromJSON(c);

我得到:

SyntaxError: JSON.parse: unexpected character
[Break On This Error] var Cufon=(function(){var k=function()....Image.fromElement.async=true})(this);

当我使用自己的JSON时,它可以很好地验证,但当我使用由fabric的方法canvas.toJSON()输出的任何内容时,仍然会出现错误。是否有人有工作示例,可以将先前画布状态保存的数据加载回空画布中的fabric.js?非常感谢!

1个回答

22

fabric.Canvas#toJSON返回的实际上是一个对象,而不是一个JSON字符串。

如果这让您感到困惑,我们表示抱歉。

之所以会这样运作,是因为JSON.stringify支持自定义序列化;您只需要传递一个具有toJSON方法的对象即可。这正是我在fabric中所做的-- fabric.Canvas具有toJSON方法,它本质上是toObject方法的别名。

这使我们可以通过执行以下简单操作来序列化画布:

JSON.stringify(canvas);

..其中canvas是一个指向fabric.Canvas实例的引用。

toObjecttoDatalessObject(以及 toJSONtoDatalessJSON)之间的区别在于,toDatalessObject 返回 "url" 而不是实际的路径数据。这样做是为了节省表示带有大尺寸形状的画布的大小。如果您加载大型 SVG 形状,其路径数据可能会成为数百万字符字符串。如果以后需要序列化此数据(比如说,为保存目的),用 svg 形状的 URL 替换路径数据将更加合理。想象一下必须把这样巨大的字符串来回上传/下载到服务器上。

所以,代替这个:

{ "angle" : 3,
  "fill" : "#00274D",
  "flipX" : false,
  "flipY" : false,
  "height" : 115,
  "left" : 353,
  "opacity" : 1,
  "overlayFill" : null,
  "path" : [ [ "M",
        67.390000000000001,
        22.390000000000001
      ],
      [ "c",
        2.5899999999999999,
        -0.42999999999999999,
        5.1100000000000003,
        1.4399999999999999,
        5.54,
        4.1799999999999997
      ],
      [ "c",
        0.42999999999999999,
        2.6600000000000001,
        -1.3,
        5.2599999999999998,
        -3.8900000000000001,
        5.6900000000000004
      ],
      [ "c",
        -1.8,
        0.28999999999999998,
        -3.6000000000000001,
        -0.57999999999999996,
        -4.6100000000000003,
        -2.02
      ],
      [ "L",
        44.5,
        34.560000000000002
      ],
      [ "l",
        10.869999999999999,
        59.619999999999997
      ],
      [ "c",
        17.420000000000002,
        -4.46,
        26.059999999999999,
        -14.18,
        27.5,
        -29.02
      ],
      [ "l",
        -10.01,
        -0.71999999999999997
      ],
      [ "L",
        88.700000000000003,
        51.909999999999997
      ],
      [ "l",
        9.4299999999999997,
        21.239999999999998
      ],
      [ "c",
        -3.3799999999999999,
        -1.95,
        -5.9000000000000004,
        -5.1100000000000003,
        -9.2899999999999991,
        -7.0599999999999996
      ],
      [ "c",
        -0.28999999999999998,
        25.059999999999999,
        -27.140000000000001,
        32.759999999999998,
        -33.770000000000003,
        47.950000000000003
      ],
      [ "C",
        44.420000000000002,
        100.08,
        26.5,
        114.77,
        6.9100000000000001,
        82.799999999999997
      ],
      [ "L",
        0,
        92.450000000000003
      ],
      [ "l",
        1.51,
        -21.600000000000001
      ],
      [ "l",
        19.66,
        4.6799999999999997
      ],
      [ "l",
        -9.4299999999999997,
        3.6699999999999999
      ],
      [ "c",
        7.4900000000000002,
        11.59,
        17.57,
        19.870000000000001,
        36.43,
        16.420000000000002
      ],
      [ "L",
        36.219999999999999,
        36.57
      ],
      [ "l",
        -18.649999999999999,
        2.3799999999999999
      ],
      [ "c",
        -0.14000000000000001,
        2.1600000000000001,
        -1.73,
        4.0300000000000002,
        -3.8900000000000001,
        4.3899999999999997
      ],
      [ "c",
        -2.5899999999999999,
        0.42999999999999999,
        -5.04,
        -1.4399999999999999,
        -5.54,
        -4.0999999999999996
      ],
      [ "c",
        -0.42999999999999999,
        -2.7400000000000002,
        1.3,
        -5.2599999999999998,
        3.8900000000000001,
        -5.6900000000000004
      ],
      [ "c",
        1.9399999999999999,
        -0.35999999999999999,
        3.8900000000000001,
        0.65000000000000002,
        4.9000000000000004,
        2.2999999999999998
      ],
      [ "l",
        17.93,
        -4.8200000000000003
      ],
      [ "l",
        -1.3700000000000001,
        -6.8399999999999999
      ],
      [ "c",
        -4.8200000000000003,
        -0.79000000000000004,
        -8.9299999999999997,
        -4.75,
        -9.7899999999999991,
        -10.08
      ],
      [ "c",
        -1.1499999999999999,
        -6.6200000000000001,
        3.1000000000000001,
        -12.890000000000001,
        9.4299999999999997,
        -13.970000000000001
      ],
      [ "c",
        6.4100000000000001,
        -1.01,
        12.460000000000001,
        3.46,
        13.539999999999999,
        10.08
      ],
      [ "c",
        0.85999999999999999,
        5.1799999999999997,
        -1.5800000000000001,
        10.15,
        -5.6900000000000004,
        12.6
      ],
      [ "l",
        1.8700000000000001,
        6.1200000000000001
      ],
      [ "l",
        20.739999999999998,
        -2.8799999999999999
      ],
      [ "C",
        64.010000000000005,
        24.260000000000002,
        65.519999999999996,
        22.75,
        67.390000000000001,
        22.390000000000001
      ],
      [ "L",
        67.390000000000001,
        22.390000000000001
      ],
      [ "z" ],
      [ "M",
        33.909999999999997,
        5.1799999999999997
      ],
      [ "c",
        -3.46,
        0.57999999999999996,
        -5.7599999999999998,
        3.96,
        -5.1100000000000003,
        7.5599999999999996
      ],
      [ "c",
        0.57999999999999996,
        3.6000000000000001,
        3.8900000000000001,
        6.0499999999999998,
        7.2699999999999996,
        5.4699999999999998
      ],
      [ "c",
        3.46,
        -0.57999999999999996,
        5.7599999999999998,
        -3.96,
        5.1799999999999997,
        -7.5599999999999996
      ],
      [ "C",
        40.609999999999999,
        7.0499999999999998,
        37.369999999999997,
        4.6100000000000003,
        33.909999999999997,
        5.1799999999999997
      ],
      [ "z" ]
    ],
  "scaleX" : 3.0299999999999998,
  "scaleY" : 3.0299999999999998,
  "selectable" : true,
  "stroke" : null,
  "strokeWidth" : 1,
  "top" : 220,
  "type" : "path",
  "width" : 99
}

你会得到这个:

{ "angle" : 3,
  "fill" : "#00274D",
  "flipX" : false,
  "flipY" : false,
  "height" : 115,
  "left" : 353,
  "opacity" : 1,
  "overlayFill" : null,
  "path" : "http://example.com",
  "scaleX" : 3.0299999999999998,
  "scaleY" : 3.0299999999999998,
  "selectable" : true,
  "stroke" : null,
  "strokeWidth" : 1,
  "top" : 220,
  "type" : "path",
  "width" : 99
}

请注意数据的大小,通过使用URL替换路径块,它变得相对较小。

这仅是一个非常简单的形状表示。

唯一的要求是在调用toDatalessObject/toDatalessJSON之前,使用setSourcePath方法设置对象的“sourcePath”(“sourcePath”内部被复制到“path”)。

希望这能解决一些问题。


谢谢。我现在明白了“dataless”的含义,这很好。但是,我无法将JSON.stringify(canvas)的结果加载回画布中。我已经想出了一个解决方法,但我很想了解正确的做法。以下是我尝试过但失败的基本内容:var js = JSON.stringify(canvas); canvas.clear(); canvas.loadFromJSON(js); 我得到了“引用错误”。对于我的解决方法,我保存JSON,然后遍历它,查看每个对象的类型,创建相应类型的新织物对象,使用json中的参数进行初始化,然后添加它... - Regis Zaleman
嗯,“loadFromJSON”应该可以工作。你有一个测试用例我可以看看吗? - kangax
是的,我在那里放了一个小演示:http://www.regiszaleman.com/testfabric/。非常感谢! - Regis Zaleman
只需将 savedDataDLJSON = c1.toDatalessJSON() 替换为 savedDataDLJSON = JSON.stringify(c1.toDatalessJSON()) - kangax
@kangax 我能够加载保存的JSON对象,但是加载后的对象似乎存在一些问题。我之前创建的对象具有 object.lockUniScaling=true; 和 object.hasRotatingPoint = true; 的属性,但是现在在加载JSON后,这些对象不再具有相应的属性设置,而是回到了它们的默认行为。我想要的只是将对象加载为保存前的状态,没有缩放和旋转点。 - Rohan210
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接