我想加载我的SVG文件,并用我的图像文件创建的模式填充它。
这是我目前的做法:
canvas = new fabric.Canvas('mainCanvas')
# image = new fabric.Image(img[0])
# console.log image
fabric.loadSVGFromURL '/assets/my.svg',
(objects) ->
fabric.util.loadImage "url/to/my/image", (image) ->
console.log image
svg = fabric.util.groupSVGElements(objects)
svg = svg.scale(0.04).set(fill: "black", opacity: 0.5 )
svg.fill = new fabric.Pattern
source: image
repeat: "no-repeat"
canvas.add(svg)
canvas.renderAll()
最初,我尝试使用fabric.Image实例(img是jQuery图像元素,所以我将原始htmlelement传递给构造函数),但只是为了确保&使用更像pattern tutorial的代码我正在使用loadImage方法。
不幸的是,这段代码似乎不起作用(svg已加载,但它上面没有模式)。是否有可能用svg填充模式?如果是这样,我该如何实现呢?
答案 0 :(得分:3)
问题可能是您的SVG形状被解析为fabric.PathGroup
而不是fabric.Path
。由于fabric.PathGroup
由多个fabric.Path
对象组成,因此您需要设置其填充值,而不是填充PathGroup实例本身的值。
if (obj instanceof fabric.PathGroup) {
obj.getObjects().forEach(function(o) { o.fill = pattern; });
}
else {
obj.fill = pattern;
}
如果你转到kitchensink并使用“Patternify”按钮,你可以看到它适用于更复杂的形状(这正是我们在那里使用的代码):