【问题标题】:Fabricjs: fill svg with image patternFabricjs:用图像图案填充svg
【发布时间】:2013-09-06 10:29:51
【问题描述】:

我想加载我的 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?如果是这样,我该如何实现?

【问题讨论】:

    标签: javascript jquery svg coffeescript fabricjs


    【解决方案1】:

    问题可能是您的 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”按钮,您会看到它适用于更复杂的形状(这正是我们在那里使用的代码):

    【讨论】:

    • 您好,感谢您的评论,不幸的是,事实并非如此。这是我当前的代码:pastebin.com/raw.php?i=HUeBkq1t - 仍然无法正常工作。有什么想法可能是错的吗?
    • 看起来您正在将图像而不是图案分配给“填充”属性。
    • @user1105595 有帮助吗?
    • 对不起,我没有早点回复,但是你说得对!我在那个代码上看起来像百万次,检查出了什么问题,但我没有发现那个错误。非常感谢!
    猜你喜欢
    • 2015-06-03
    • 2013-12-19
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    相关资源
    最近更新 更多