当前位置: 首页 > 面试题库 >

从带有元素的另一个svg图像创建带有嵌入的base64字符串的SVG图像

黎浩然
2023-03-14
问题内容

我有一个SVG文件,其中包含几个元素(例如路径,圆形,矩形等)。

我想将该SVG文件转换为具有嵌入式base64数据而不是多个元素的SVG。蜡染有可能做到这一点吗?

我正在从事的项目仅需要使用Java库。


问题答案:

我曾经使用一种技术将SVG图像嵌入Blogger帖子中,这可能对此有用。基本上,这是一个两步过程

  1. 您可以序列化要嵌入的SVG,并对其进行URL编码。
  2. 然后,您可以在SVG use元素的xlink:href属性中将URL编码的字符串用作数据URI。

这是我与蜡染纸一起测试过的有效示例。假设您要嵌入以下SVG文档circle.svg:

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="4in" height="4in" id="the_svg"
     viewBox="0 0 4 4" version="1.1"
     xmlns="http://www.w3.org/2000/svg">
    <circle cx="1" cy="1" r="1" fill="blue" stroke="none" id="the_circle"/>
</svg>

您可以通过将其路径传递到以下小型Rhino脚本进行URL编码:

#!/usr/bin/env rhino
print(escape(readFile(arguments[0])))

当然,如果要使用Java以编程方式执行此操作,则需要Java特定的方法来序列化SVG文档并对该字符串进行URL编码。

这使您可以将文档作为URL编码的字符串:

%3C%3Fxml%20version%3D%221.0%22%20standalone%3D%22no%22%3F%3E%0A%3C%21DOCTYPE%20svg%20PUBLIC%20%22-//W3C//DTD%20SVG%201.1//EN%22%20%0A%20%20%22http%3A//www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd%22%3E%0A%3Csvg%20width%3D%224in%22%20height%3D%224in%22%20id%3D%22the_svg%22%0A%20%20%20%20%20viewBox%3D%220%200%204%204%22%20version%3D%221.1%22%0A%20%20%20%20%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%3E%0A%09%3Ccircle%20cx%3D%221%22%20cy%3D%221%22%20r%3D%221%22%20fill%3D%22blue%22%20stroke%3D%22none%22%20id%3D%22the_circle%22/%3E%0A%3C/svg%3E%0A%0A

然后,您可以通过在数据URI中使用它来嵌入此文档,如下所示:

data:image/svg+xml,%3C%3Fxml%20version%3D%221.0%22%20standalone%3D%22no%22%3F%3E%0A%3C%21DOCTYPE%20svg%20PUBLIC%20%22-//W3C//DTD%20SVG%201.1//EN%22%20%0A%20%20%22http%3A//www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd%22%3E%0A%3Csvg%20width%3D%224in%22%20height%3D%224in%22%20id%3D%22the_svg%22%0A%20%20%20%20%20viewBox%3D%220%200%204%204%22%20version%3D%221.1%22%0A%20%20%20%20%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%3E%0A%09%3Ccircle%20cx%3D%221%22%20cy%3D%221%22%20r%3D%221%22%20fill%3D%22blue%22%20stroke%3D%22none%22%20id%3D%22the_circle%22/%3E%0A%3C/svg%3E%0A%0A

例如,以下HTML文档使用对象标记和数据URI嵌入SVG文档:

<html>
    <head>
    </head>
    <body>
        <object data="data:image/svg+xml,%3C%3Fxml%20version%3D%221.0%22%20standalone%3D%22no%22%3F%3E%0A%3C%21DOCTYPE%20svg%20PUBLIC%20%22-//W3C//DTD%20SVG%201.1//EN%22%20%0A%20%20%22http%3A//www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd%22%3E%0A%3Csvg%20width%3D%224in%22%20height%3D%224in%22%20id%3D%22the_svg%22%0A%20%20%20%20%20viewBox%3D%220%200%204%204%22%20version%3D%221.1%22%0A%20%20%20%20%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%3E%0A%09%3Ccircle%20cx%3D%221%22%20cy%3D%221%22%20r%3D%221%22%20fill%3D%22blue%22%20stroke%3D%22none%22%20id%3D%22the_circle%22/%3E%0A%3C/svg%3E%0A%0A" width="400" height="400"></object>
    </body>
</html>

您可以使用SVG’use’元素的xlink:href属性执行相同的操作,但需注意:引用完整文档是非法的。相反,您需要按其ID引用文档中的元素,该元素将被深层克隆到SVG宿主文档中。在此示例中,SVG文档根元素的ID为“
the_svg”(请注意URI末尾的hash标签)。

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="4in" height="4in" id="the_svg"
     viewBox="0 0 4 4" version="1.1"
     xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <use x="0" y="0" width="4" height="4" xlink:href="data:image/svg+xml,%3C%3Fxml%20version%3D%221.0%22%20standalone%3D%22no%22%3F%3E%0A%3C%21DOCTYPE%20svg%20PUBLIC%20%22-//W3C//DTD%20SVG%201.1//EN%22%20%0A%20%20%22http%3A//www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd%22%3E%0A%3Csvg%20width%3D%224in%22%20height%3D%224in%22%20id%3D%22the_svg%22%0A%20%20%20%20%20viewBox%3D%220%200%204%204%22%20version%3D%221.1%22%0A%20%20%20%20%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%3E%0A%09%3Ccircle%20cx%3D%221%22%20cy%3D%221%22%20r%3D%221%22%20fill%3D%22blue%22%20stroke%3D%22none%22%20id%3D%22the_circle%22/%3E%0A%3C/svg%3E%0A%0A#the_svg"/>
</svg>

仅供参考,这在Batik 1.7(在Squiggle浏览器中测试)中效果很好,但不适用于Chromium或Firefox。



 类似资料:
  • 我试图生成一个. docx从超文本标记语言字符串与docx4j在Java,其中包含Base64图像里面。目前,我能够生成Word并下载它(在一个Vaadin项目内),但图像没有正确插入。但是,如果我把超文本标记语言代码放入index.html页面,它们确实显示正确! 我使用的代码是这样的: 有没有什么特别的工作应该做,而我没有做? 编辑: 我现在可以插入图片了!用以下代码替换行下方和行上方的代码:

  • 我有一个画布,我想作为图像文件上传到服务器。 我可以将画布转换为Base64字符串,但不知道如何从那里创建图像文件(因此,一旦上传到服务器,它就可以通过img src中的url直接访问)。 注意:服务器所做的只是将上传的数据保存到一个文件中,所以转换必须在客户端javascript中完成 有什么想法吗?

  • 问题内容: 两者之间到底有什么区别 和 第一个只是加快字段初始化速度的捷径吗?有性能方面的考虑吗? 问题答案: 第二种形式总是创建一个空的地图。 第一种形式是地图文字的特殊情况。地图文字允许创建 非空 地图: 现在,您的(通用)示例: 是没有初始值(键/值对)的地图文字。它完全等同于: 此外,这是为地图指定初始容量(大于初始分配的元素数量)的唯一方法。例: 将创建一个地图,该地图具有足够的空间来容

  • 问题内容: 我想在Python / Django中编写包含以下部分的HTML邮件: HTML链接到logo.png logo.png应该在邮件用户代理中内联显示(不作为附件显示) info.pdf,应显示为附件 如果邮件用户代理无法显示HTML,则应显示的文本。 我关注了这篇博客文章。 结果: HTML和内嵌图片有效 但info.pdf文件的处理方式类似于内联logo.png,并且某些邮件用户代理

  • 问题内容: 我已经通过AJAX向PHP发送了base64编码的字符串,并创建了一个图像资源-一切都很好。 现在,我想在调整图像大小后获得base64编码的字符串,但是我无法找到一个函数来获取base64encoded字符串。 问题答案: 取自http://www.php.net/manual/zh/book.image.php#93393

  • 概述 SVG 是一种基于 XML 语法的图像格式,全称是可缩放矢量图(Scalable Vector Graphics)。其他图像格式都是基于像素处理的,SVG 则是属于对图像的形状描述,所以它本质上是文本文件,体积较小,且不管放大多少倍都不会失真。 SVG 文件可以直接插入网页,成为 DOM 的一部分,然后用 JavaScript 和 CSS 进行操作。 <!DOCTYPE html> <htm