将对象剪切到使用自由绘制笔刷绘制的路​​径

时间:2018-09-13 15:12:44

标签: fabricjs

Fabric.js 2.3.6

我正在尝试将对象剪切到使用自由绘制衬套绘制的路径。代码无法显示路径内的图像,我不确定自己在做什么错。

可能会剪切多个对象,因此我无法将路径应用于画布本身。

let image = new Image();
let object;
let canvas;

// canvas

canvas = new fabric.Canvas("canvas", {
  backgroundColor: "lightgray",
  width: 1280,
  height: 720,
  preserveObjectStacking: true,
  selection: false
});

canvas.isDrawingMode = true;
canvas.freeDrawingBrush.color = "black";
canvas.freeDrawingBrush.width = 2;

canvas.on("path:created", function(options) {
   clip(options.path);
});

// clip

function clip(path) {

  object.set({
    clipTo: function(ctx) {
      path.render(ctx);
    }
  });

  canvas.requestRenderAll();

}

// image

image.onload = function() {

  object = new fabric.Image(image, {
    width: 500,
    height: 500,
    top: 50,
    left: 50
  });

  canvas.add(object);

};

image.src = "http://i.imgur.com/8rmMZI3.jpg";

https://jsfiddle.net/o91rv38q/7/

1 个答案:

答案 0 :(得分:2)

为了在绘制路径时在同一位置上进行剪辑,您需要将{ ... "aggregations" : { "genres" : { "doc_count_error_upper_bound": 0, "sum_other_doc_count": 0, "buckets" : {"color": [ { "key" : "red", "doc_count" : 6 }, { "key" : "blue", "doc_count" : 3 }, ], {"size": [ { "key" : "M", "doc_count" : 6 }, ], {"wifi": [ { "key" : "ac/g/n", "doc_count" : 1 }, ] } } } 重置为SVG路径,并将pathOffset重置为setTransform。剪辑功能如下所示:

ctx

function clip(path) { path.set({pathOffset: {x: 0, y: 0}}); object.set({ clipTo: function(ctx) { ctx.save(); ctx.setTransform(1,0,0,1,0,0); ctx.beginPath(); path._renderPathCommands(ctx); ctx.restore(); } }); canvas.requestRenderAll(); } -呈现路径。

更新了fiddle

要剪辑多个对象,您需要具有某种对象数组,然后将其组合成单个_renderPathCommands

path

这是一个具有多个剪切路径的示例:

function combinePaths (paths) {
  if (!paths.length) {
    return null;
  }
    let singlePath = paths[0].path;
  for (let i = 1; i < paths.length; i++){
        singlePath = [...singlePath, ...paths[i].path];
  } 
  return new fabric.Path(singlePath, {
    top: 0,
    left: 0,
    pathOffset: {
        x: 0,
      y: 0
    }
  });
}
// canvas

let canvas = new fabric.Canvas("canvas", {
    backgroundColor: "lightgray",
    width: 1280,
    height: 720,
    preserveObjectStacking: true,
    selection: false
});

let paths = [];

canvas.isDrawingMode = true;
canvas.freeDrawingBrush.color = "black";
canvas.freeDrawingBrush.width = 2;

canvas.on("path:created", function (options) {
    paths.push(options.path);
    clip(combinePaths(paths));
});

function combinePaths(paths) {
    if (!paths.length) {
        return null;
    }
    let singlePath = paths[0].path;
    for (let i = 1; i < paths.length; i++) {
        singlePath = [...singlePath, ...paths[i].path];
    }
    return new fabric.Path(singlePath, {
        top: 0,
        left: 0,
        pathOffset: {
            x: 0,
            y: 0
        }
    });
}

function clip(path) {
    if (!path) {
        return;
    }
    object.set({
        clipTo: function (ctx) {
            var retina = this.canvas.getRetinaScaling();
            ctx.save();
            ctx.setTransform(retina, 0, 0, retina, 0, 0);
            ctx.beginPath();
            path._renderPathCommands(ctx);
            ctx.restore();
        }
    });

    canvas.requestRenderAll();

}

// image

let image = new Image();
let object;

image.onload = function () {

    object = new fabric.Image(image, {
        width: 500,
        height: 500,
        top: 50,
        left: 50
    });
    object.globalCompositeOperation = 'source-atop';
    canvas.add(object);

};

image.src = "http://i.imgur.com/8rmMZI3.jpg";