组合 (Group)

  1. var canvas = new fabric.Canvas("c");
  2. var circle = new fabric.Circle({
  3. radius: 100,
  4. fill: "#eef",
  5. scaleY: 0.5,
  6. originX: "center",
  7. originY: "center",
  8. });
  9. var text = new fabric.Text("hello world", {
  10. fontSize: 30,
  11. originX: "center",
  12. originY: "center",
  13. });
  14. var rect = new fabric.Rect({
  15. left: 10,
  16. top: 10,
  17. fill: "red",
  18. width: 20,
  19. height: 20,
  20. angle: 0,
  21. });
  22. var group = new fabric.Group([circle, rect, text], {
  23. left: 150,
  24. top: 100,
  25. angle: -10,
  26. });
  27. // group.item(0).setFill('red');
  28. group.item(0).set({
  29. fill: "red",
  30. });
  31. group.item(1).set({
  32. text: "trololo",
  33. fill: "white",
  34. });
  35. // group.item(0).setFill('red');
  36. group.item(2).set({
  37. fill: "#ff0",
  38. });

克隆

  1. // 创建一个包含两个已存在对象的副本的组合
  2. var group = new fabric.Group([canvas.item(0).clone(), canvas.item(1).clone()]);
  3. // 移除所有对象并且重新渲染
  4. canvas.clear().renderAll();
  5. // 将组合添加到canvas画布
  6. canvas.add(group);

序列化

一旦你开始构建一种有状态的应用程序,也许允许用户在服务器上保存画布内容的结果,或者将内容流传输到不同的客户端,你都需要 canvas 序列化。如果仍然要发送画布内容,也是可以的,有一个选项可以将画布导出到图像。但是上传图片到服务器无疑是相当占用带宽的,论大小,没有什么可以比得过文本了,这就是为什么 Fabric 为 canvas 画布序列化/反序列化提供了极好的支持。

Fabric 中的 canvas 序列化方法主要是 toObject()和 toJSON()方法。我们来看一个简单的例子,首先序列化一个空的画布:

  1. var canvas = new fabric.Canvas("c");
  2. canvas.backgroundColor = "red";
  3. JSON.stringify(canvas);
  4. // '{"objects":[],"background":"rgba(0, 0, 0, 0)"}'
  • toJSON: JSON.stringify(canvas) 序列化当前 canvas 信息
  • canvas.toDataURL(’png’)获取当前 canvas 图片的 base64 的图片
  • toObject: canvas.toObject() 导出对象

继承并且扩展属性

  1. var rect = new fabric.Rect();
  2. rect.toObject = function () {
  3. return fabric.util.object.extend(toObject.call(this), { name: "trololo" });
  4. };
  5. canvas.add(rect);
  6. console.log(JSON.stringify(canvas));

SVG、序列化和反序列化

  • canvas.toSVG() 转成 SVG
  • loadSVGFromString 加载 SVG
  • toDatalessJSON 转化成更小的 JSON
  1. canvas.item(0).sourcePath = "/assets/dragon.svg";
  2. console.log(JSON.stringify(canvas.toDatalessJSON()));
  1. fabric.loadSVGFromString("...", function (objects, options) {
  2. var obj = fabric.util.groupSVGElements(objects, options);
  3. canvas.add(obj).renderAll();
  4. });

自由绘画 isDrawingMode

  1. // 自由动画
  2. var canvas = new fabric.Canvas("c", {
  3. isDrawingMode: true,
  4. });
  5. console.log(JSON.stringify(canvas));
  6. canvas.on("mouse:up", function (options) {
  7. console.log(canvas.toDatalessJSON(), "ss");
  8. canvas.set({
  9. isDrawingMode: false,
  10. });
  11. });

锁定对象、改变边框和角

  • lockMovementX
  • lockMovementY
  • lockRotation
  • lockScalingX
  • lockScalingY
  1. var canvas = new fabric.Canvas("c");
  2. let circle = new fabric.Circle({
  3. left: 100,
  4. top: 100,
  5. radius: 50,
  6. fill: "red",
  7. });
  8. canvas.add(circle);
  9. circle.set({
  10. lockMovementX: true,
  11. lockMovementY: true,
  12. lockRotation: true,
  13. lockScalingY: true,
  14. lockScalingX: true,
  15. transparentCorners: false,
  16. cornerColor: "blue",
  17. cornerStrokeColor: "red",
  18. borderColor: "red",
  19. cornerSize: 12,
  20. padding: 10,
  21. cornerStyle: "circle",
  22. borderDashArray: [3, 3],
  23. selection: false, // 禁用选择
  24. // hasControls: false
  25. });
  26. circle.hasBorders = false;
  27. // circle.hasControls = false
  28. canvas.add(
  29. new fabric.Circle({ radius: 30, fill: "#f55", top: 100, left: 100 })
  30. );
  31. // 设置选中态
  32. canvas.selectionColor = "rgba(0,255,0,0.3)";
  33. canvas.selectionBorderColor = "red";
  34. canvas.selectionLineWidth = 5;
  35. canvas.selectionDashArray = [5, 10];

可点击区域操作

  • perPixelTargetFind 是不是点击区域操作

旋转控件

  • hasRotatingPoint 是不是有旋转点
  • rotatePointOffset 设置选中距离图像的 offset 值
  • uniScaleTransform 控制变形比例

Node 中应用

  1. var fabric = require("fabric").fabric,
  2. http = require("http"),
  3. url = require("url"),
  4. PORT = 8124;
  5. var server = http.createServer(function (request, response) {
  6. var params = url.parse(request.url, true);
  7. var canvas = fabric.createCanvasForNode(200, 200);
  8. response.writeHead(200, { "Content-Type": "image/png" });
  9. canvas.loadFromJSON(params.query.data, function () {
  10. canvas.renderAll();
  11. var stream = canvas.createPNGStream();
  12. stream.on("data", function (chunk) {
  13. response.write(chunk);
  14. });
  15. stream.on("end", function () {
  16. response.end();
  17. });
  18. });
  19. });
  20. server.listen(PORT);