我的代码是
我从红色虚线框中取值并应用于多个蒙版生成的剪辑
我的问题是它取得所有属性但不是所有
的轮换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);但是不会起作用,因为我想用自己的值进行全部旋转
请指导我同样的
答案 0 :(得分: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/
解决方法并不完美,但希望它会对某人有所帮助。
答案 1 :(得分:0)
我尝试使用Andrey's answer,但是有一些有趣的点,它没有用。
如果您尝试将画布剪辑为单个对象(例如圆形或矩形),则可以执行以下操作:
canvas.clipTo = function(ctx) {
shape.render(ctx); //shape is a circle, for instance
}
但是,正如Kienz和butch2k在aforementioned comment on GitHub中所解释的那样,问题在于您不能将此解决方案用于组。特别是,如果您使用以下代码段:
canvas.clipTo = function(ctx) {
group.render(ctx);
}
您只会看到该组中的一个对象用于裁剪。
问题源于render
方法,该方法为组中的每个对象调用ctx.beginPath()
和ctx.closePath()
。而且因为只有最后几个beginPath-closePath调用会影响剪辑,所以需要一些解决方法。
所以在我的解决方案中,我暂时重新定义了ctx.closePath
和ctx.beginPath
方法(将它们存储在另外两个临时变量中,名为oldBeginPath
和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;
};
希望这将节省某人的业余时间。