【发布时间】:2019-02-14 18:18:35
【问题描述】:
我要完成的总体任务是加载 SVG 图像文件,在某处修改颜色或文本,然后将其绘制到 HTML5 画布上(可能使用 drawImage(),但任何合理的替代方案都可以) .
我在另一个 StackOverflow 问题上遵循了关于如何在 Javascript 中加载和修改 SVG 文件的建议,如下所示:
<object class="svgClass" type="image/svg+xml" data="image.svg"></object>
在 Javascript 中遵循
document.querySelector("object.svgClass").
getSVGDocument().getElementById("svgInternalID").setAttribute("fill", "red")
这行得通。现在我的网页中显示了修改后的 SVG。
但我不想只显示它 - 我想将它作为 HTML5 画布更新的一部分进行绘制,如下所示:
ctx.drawImage(myModifiedSVG, img_x, img_y);
如果我尝试存储 getSVGDocument() 的结果并将其作为 myModifiedSVG 传递,我只会收到一条错误消息。
如何为修改后的 SVG 进行 HTML5 画布绘制调用?
编辑:我可以通过这样做在 HTML5 画布上绘制 SVG 图像:
var theSVGImage = new Image();
theSVGImage.src = "image.svg";
ctx.drawImage(theSVGImage, img_x, img_y);
这很好,但我不知道如何以这种方式修改我加载的 SVG 图像中的文本/颜色!如果有人可以告诉我如何进行修改,那么这也是一个解决方案。我不拘泥于通过对象 HTML 标记。
【问题讨论】:
-
您可以使用 illustrator 制作 svg。保存后,您可以在任何代码编辑器中重新打开您的 svg,就像 html 一样,然后您可以编辑颜色。
-
谢谢,但我需要逐帧将颜色更改为不同的颜色,所以没有一种单一的静态颜色可以做到。
-
This answer 有最短的解决方案。 (很明显,你可以省略最后的
canvas.toDataURL()。 -
如果您希望每帧更改 svg,可能值得使用库。可以使用 ccprog 链接中的方法来完成,但这意味着每帧加载一个全新的 svg 图像。这对于浏览器来说很多,并且考虑到任务的异步性,能够提前生成足够多的这些帧将是一场编码噩梦。一些库能够将 SVG 标记转换为画布命令,其中一些库暴露了 js他们使用的对象并允许您对其进行编辑(例如fabricjs)。总的来说,我想这对你来说会是一个更聪明的举动(天哪,我不喜欢库......)
-
好主意,SVG 到 javascript 转换器可能在这里工作。就像你说的那样,我可以很容易地找到我想要更改的文本/颜色的行,并且它确实节省了每帧重新加载(和重新解析)整个 SVG。
标签: javascript html svg canvas