【问题标题】:How to change svg color on Canvas - Fabricjs如何在 Canvas 上更改 svg 颜色 - Fabricjs
【发布时间】:2016-07-22 17:08:39
【问题描述】:

我正在使用Fabricjs 创建一个应用程序。
每次Minicolors 输入更改时,我都必须将 SVG 文件添加到画布并更改颜色。
我首先让浏览器将 SVG 图像显示为 SVG 代码,如下所示:

$('img[src$=".svg"]').each(function(){
var $img = $(this),
    imgURL = $img.attr('src'),
    attributes = $img.prop('attributes');

$.get(imgURL, function(data) {
  // Get the SVG tag, ignore the rest
  var $svg = $(data).find('svg');
  // Remove any invalid XML tags as per http://validator.w3.org
  $svg = $svg.removeAttr('xmlns:a');
  // Make sure that every attribute was copied
  $.each(attributes, function() {
    $svg.attr(this.name, this.value);
  });
  // Replace image with new SVG
  $img.replaceWith($svg);
}, 'xml');
});

然后,当它们被点击时,我将 DOM 中的 SVG 图像加载到画布中,如下所示:

$('#images').on('click', 'svg', function() {
  var serializer = new XMLSerializer(),
  svgStr = serializer.serializeToString(this);

  fabric.loadSVGFromString(svgStr,function(objects, options) {
    options.id = this.id;
    var obj = fabric.util.groupSVGElements(objects, options);

    canvas.add(obj);

    obj.scaleToHeight(127) // Scales it down to some small size
       .scaleToWidth(90)
       .center() // Centers it (no s**t, Sherlock)
       .setCoords();

    canvas.setActiveObject(obj).renderAll();
  });
});

现在我的下一个目标是如何更改所选 svg 文件的路径颜色? 我的主要猜测是遵循以下步骤:

  1. 保存所选 SVG 的左侧和顶部位置
  2. 在 DOM 中更改 SVG 图像的颜色
  3. 移除选定的 SVG 对象
  4. 在保存的左侧和顶部位置使用新颜色将其替换为新 SVG

但我想:“所以每次 Minicolors 输入发生变化时我都必须执行所有这些操作?以后不会是性能问题吗?”

还有比这更好的方法吗?这是一个JSFiddle,可以帮助您入门。谢谢。

【问题讨论】:

    标签: javascript svg fabricjs


    【解决方案1】:

    Nick Rameau 的回答不适用于最新版本的 fabricjs。

    就我而言,我正在使用fabricjs 3.5

    在最新版本的fabricjs 中,paths 属性已被移除。 paths 数据已添加到 _objects 属性中。

    这就是我的工作方式。

    var obj = this.canvas.itemObj;
    var color = '#ff00ff';
    
    if (obj && obj._objects) {
      for (var i = 0; i < obj._objects.length; i++) {
        obj._objects[i].set({
          fill: color
        });
      }
    }
    

    【讨论】:

    • 您的意思是“文件”还是“填充”?不用说,这不是我要找的。我想我使用了错误的对象...
    • 这里的 itemObj 是什么?
    【解决方案2】:

    添加到画布时,SVG 对象包含一个名为“paths”的属性,其中包含构建图像的所有路径。所以我们这样做:

    activeObject.paths.forEach(function(path) {path.fill = color});
    

    但我想知道对于大型 SVG 文件是否不会是性能问题(希望我不会讲到这一点)。这是一个有效的JSFiddle

    【讨论】:

    • 如果您更改代表 svg 的对象中的填充颜色而不是直接更改 dom,性能会更好,而无需计算序列化和重新加载所需的额外工作。
    • 好吧,如果你仔细阅读代码,你会注意到 selectedObject 不是一个 DOM 元素,它是代表画布上 SVG 的对象。 @AndreaBogazzi
    • 我读过它,我说的是,你在答案中提出的建议比你在问题中猜测的要好。您的解决方案在答案中是正确的,这是您应该做的。加载 SVG 后没有更好的方法,再次加载会更慢。我建议添加一个检查以查看填充是否已经存在,否则您也会填充空形状。
    • Downvoted cuz 不再适用于当前版本的 FabricJS。好伤心!
    • 不适用于fabricjs 3.5版。对象中没有paths 属性。
    猜你喜欢
    • 2019-11-02
    • 2013-03-22
    • 2013-12-05
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 2014-03-14
    相关资源
    最近更新 更多