【问题标题】:FabricJS SVG to canvas (using FileReader)FabricJS SVG 到画布(使用 FileReader)
【发布时间】:2017-11-10 14:31:45
【问题描述】:

在我的页面上,我有一个按钮和一个具有以下属性的画布 -

<button onclick="openSVG()">Open</button>
<canvas></canvas>

点击按钮时,openSVG() 函数应该是

  • 让用户从本地硬盘驱动器中选择并打开一个 SVG 文件(之前使用 FabricJS 创建)
  • 使用 FileReader 读取 SVG 文件的内容并将其存储在变量中
  • 使用该变量使用fabric.loadSVGFromString() 方法填充画布

现在单击“打开”按钮会打开一个文件选择窗口,但不会将对象绘制到画布中。这是我的 openSVG() 函数 -

function openSVG() {

// importing file
var input = $(document.createElement('input'));
input.attr("id", "mySVGFile")
input.attr("type", "file");
input.trigger('click');

//storing file contents in var using FileReader
var myInputFile = document.getElementById('mySVGFile');
var myFile = myInputFile.files[0];

var fr = new FileReader();
fr.onload = function(){

    var canvasD = this.result;

    //loading data from var to canvas
    fabric.loadSVGFromString(canvasD, function(objects, options) {
        var obj = fabric.util.groupSVGElements(objects, options);
        canvas.add(obj).renderAll();
    });
};

fr.readAsText(myFile); }

我是 FileReader 的新手。控制台中没有错误,所以我什至不知道哪里出错了。 我的方法不起作用吗?有没有更好的方法来实现我想要的。

【问题讨论】:

    标签: javascript html canvas svg fabricjs


    【解决方案1】:

    这是使用 URL.createObjectURL() 方法的更简单和更好的方法...

    var canvas = new fabric.Canvas('c');
    
    function openSVG(e) {
       var url = URL.createObjectURL(e.target.files[0]);
       fabric.loadSVGFromURL(url, function(objects, options) {
          objects.forEach(function(svg) {
             svg.set({
                top: 90,
                left: 90,
                originX: 'center',
                originY: 'center'
             });
             svg.scaleToWidth(50);
             svg.scaleToHeight(50);
             canvas.add(svg).renderAll();
          });
       });
    }
    canvas{margin-top:5px;border:1px solid #ccc}
    <script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.7.11/fabric.min.js"></script>
    <input type="file" onchange="openSVG(event)">
    <canvas id="c" width="180" height="180"></canvas>

    【讨论】:

    • 谢谢。但它解决了一半的问题。有没有办法在画布上绘制可以单独操作的对象?例如,假设 svg 包含有关圆形和矩形的数据,我想分别调整大小和拖动这些形状。
    • 是的,可能。您必须单独添加它们,而不是将它们分组。检查更新的答案。
    • 当我将 SVG 添加到 Canvas 时,我将类型作为路径和路径数组。是否可以根据路径而不是路径将类型(对象)设为“圆”、“矩形”、“线”等?或者是否可以转换为 Canvas 标准对象(如圆形、矩形等)的路径?
    猜你喜欢
    • 2019-01-20
    • 2017-08-03
    • 2017-06-16
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    • 2016-07-08
    • 1970-01-01
    相关资源
    最近更新 更多