【问题标题】:Adding an uploaded file as an <image> element in an SVG将上传的文件添加为 SVG 中的 <image> 元素
【发布时间】:2016-04-27 02:17:47
【问题描述】:

如果有人上传带有&lt;input type="file"/&gt; 的图片,则有上百万种不同的方法可以将图片作为&lt;img&gt; 元素或&lt;canvas&gt; 添加到某处。我想将其添加为 SVG 中的 &lt;image&gt; 元素,但我完全受阻。

如果我将上传的文件添加到画布并使用 canvas.getDataURL(),我会得到一个有效的数据 URL,我可以将其用作背景图像或其他任何东西。但是将&lt;image&gt; 元素的xlink:href 设置为该URL 没有任何作用。我也尝试过不使用画布步骤直接添加文件,例如:

$("#file").on("change",function(){
  $("image").attr("xlink:href",this.files[0]);
});

这似乎做了一些事情,但图像仍然不会显示。我在上面设置了宽度和高度。我还尝试了各种 Blob URL 方法,但这些方法都没有做任何事情。

如何从文件输入中获取图像文件并将其显示为 SVG 中的 &lt;image&gt; 元素?

非常感谢任何帮助。

【问题讨论】:

  • 可能最好避免带有 SVG.xlink 的 jquery:href 属性需要在 xlink 命名空间中。

标签: javascript image svg filereader


【解决方案1】:

this.files[0] 返回一个 File 对象。 xlink:href 属性分配采用字符串。 File 对象到字符串的自动转换导致属性被分配字符串“[object File]”。

您可以将文件作为数据 URL 读取,然后将数据 URL 分配给 href 属性。正如 Robert Longson 在评论中提到的,使用带有 SVG 属性的 JQuery 需要命名空间有时会导致问题。我建议使用普通 DOM 设置属性。比如……

var xlinkNS = "http://www.w3.org/1999/xlink";

$("#file").on("change",function(){
    var reader = new FileReader();
    reader.onload = function (e) {
      $("image")[0].setAttributeNS(xlinkNS, "href", e.target.result);
    };
    reader.readAsDataURL(this.files[0])
});

【讨论】:

  • 谢谢!这解决了它。此外,使用 d3 进行相同类型的修改也可以正常工作:d3.select("image").attr("xlink:href",e.target.result);
猜你喜欢
  • 2012-06-07
  • 2011-12-07
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
  • 2020-06-30
  • 2013-04-02
  • 2018-01-18
  • 2014-04-12
相关资源
最近更新 更多