1

我的代码是

canvas.clipTo = function (ctx) {

    ctx.beginPath();
    for (var i = 0; i < totalPrintArea; i++) {
        ctx.save();
        ctx.fillStyle = 'rgba(51,51,51,0)';
        ctx.rect(clipLft[i], clipTp[i], clipW[i], clipH[i], 'rgba(51,51,51,1)', clipRtn[i]);
        ctx.stroke();
        ctx.restore();
    }

    ctx.closePath();
    ctx.clip();
    canvas.calcOffset();
};
canvas.renderAll();

我从红色虚线框中获取值并应用于生成多个蒙版的剪辑。

我的问题是它获取所有属性,但不是全部旋转。

我想旋转所有的矩形。

我只是得到一些代码来改变剪辑的旋转,ctx.rotate(50);但不会工作,因为我想让所有旋转都用自己的值

请指导我。

没有说明

4

2 回答 2

0

在最初的fabricJS github项目上,我看到了评论:https ://github.com/kangax/fabric.js/issues/932#issuecomment-27223912

并决定我需要一直防止制作 ctx.beginPath :

canvas.clipTo = function(ctx) { 
var skip = false;
// Workaround to make possible 
// making clipTo with 
// fabric.Group 
var oldBeginPath = ctx.beginPath;
ctx.beginPath = function() {
if (!skip) {
  oldBeginPath.apply(this, arguments);
  skip = true;
  setTimeout(function() {
    skip = false;
  }, 0);
}
}
group.render(ctx)
};

你可以看到我描述的问题的解决方法: https ://jsfiddle.net/freelast/6o0o07p7/

解决方法并不完美,但希望它对某人有所帮助。

于 2016-07-04T15:18:58.380 回答
0

我曾尝试使用安德烈的答案,但尽管有一些有趣的观点,但它没有奏效。

如果您尝试将画布剪辑到单个对象(例如圆形或矩形),您可以简单地执行以下操作:

canvas.clipTo = function(ctx) {
    shape.render(ctx); //shape is a circle, for instance
}

但是,正如 Kienz 和 butch2k 在上述 GitHub 上的评论中所解释的那样,问题是您不能将此解决方案与组一起使用。特别是,如果您使用以下代码段:

canvas.clipTo = function(ctx) {
    group.render(ctx);
}

您只会看到该组中的一个对象用于剪辑。

问题出在render方法上,该方法为组中的每个对象调用ctx.beginPath()and ctx.closePath()。而且因为只有最后几个 beginPath-closePath 调用会影响剪辑,所以您需要一些解决方法。

因此,在我的解决方案中,我暂时重新定义了ctx.closePathandctx.beginPath方法(在将它们存储在其他两个名为oldBeginPathand的临时变量中oldClosePath),以便它们什么都不做。然后我oldBeginPath在开始时调用,在渲染组中的所有对象后,我调用oldClosePath.

现在,这是(工作)片段:

canvas.clipTo = function(ctx) {
    var oldBeginPath = ctx.beginPath;
    var oldClosePath = ctx.closePath;

    ctx.beginPath = function() {}
    ctx.closePath = function() {}

    oldBeginPath.apply(ctx);
    group.forEachObject(function(shape){
        shape.render(ctx);
    });
    oldClosePath.apply(ctx);

    ctx.beginPath = oldBeginPath;
    ctx.closePath = oldClosePath;
};

希望这将节省某人将来的业余时间。

于 2016-08-28T18:20:47.960 回答