将上传的文件添加为 SVG 中的 <image> 元素

Adding an uploaded file as an <image> element in an SVG

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

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

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

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

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

非常感谢任何帮助。

this.files[0]returns一个文件对象。 xlink:href 属性赋值采用字符串。将 File 对象自动转换为字符串会导致为属性分配字符串“[object File]”。

您可以将文件作为数据 URL 读取,然后将数据 URL 分配给 href 属性。正如 Robert Longson 在评论中提到的,将 JQuery 与需要命名空间的 SVG 属性一起使用有时会导致问题。我建议使用纯 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])
});