是否有人对如何使用 ImageMagick.NET 将 SVG 转换为 PNG(其中 SVG 具有自定义嵌入字体)有经验或见解?
我见过similar posts关于这一点,但我对 ImageMagick.net 特别感兴趣,并且我想避免从命令行调用任何内容。我目前使用 Batik,但我想将其移至 Azure,并且不想启动 JVM 以便执行 JAR 文件。
另外请注意,我的问题是我从另一方获取 SVG,并且大多数字体不是免费提供的,因此我不能只预安装所有潜在的字体。
非常感谢您的见解。
最佳答案
我对azure一无所知平台,但我可以分享一些关于 ImageMagick 中 SVG 流程的见解。 这更像是一个冗长的评论,而不是一个答案
ImageMagick(Magick.net
设置在其之上)在光栅图像上执行任务,因此在完成任何其他工作之前,任何矢量输入都必须“解码”为光栅图像。对于 SVG 图像,我知道 ImageMagick 可以将矢量图形渲染为经过验证的像素的三种方法。
- 使用原始的内部 MSVG 编码器来绘制每个形状。
- 如果使用委托(delegate)库支持进行编译,则将渲染工作传递给
librsvg
。 (通常在 *NIX 系统上) - 调用外部命令行应用程序。与您提供的链接中引用的建议相同。
如果我将其绘制出来,我想它会看起来像这样。
带有 MSVG 的 SVG 字体(选项 #1)
我相信这是您询问的选项,因为它是必须安装 ImageMagick 的默认配置。对于要渲染的字体,必须在系统上找到该字体,并受 freetype(.ttf
或 .otf
文件)支持。嵌入字体通常是在 @font-face
CSS at-rule 下内联附加的 base64 ttf 文件。 。如果这是真的,您应该能够预处理文档,将字体文件提取到本地/临时文件系统,并在读取 SVG 文档之前使用 MagickReadSettings.FontFamily
对其进行分配。虽然我不确定这是否适用于多种字体。
带有 RSVG 的 SVG 字体(选项 #2)
librsvg
为 SVG 规范提供了比内部渲染器更多的支持,但也对外部资源实现了更严格的方法。还有一个open issue添加对 @font-face
的支持,因此您可能被迫执行选项 #1。
外部命令行(选项#3)
这将是您最好的选择。 ImageMagick 的 delegate.xml可以更改文件以调用其他实用程序。 Inkscape例如,可以由 ImageMagick 使用以下规则调用..
<delegate decode="svg" command="inkscape.exe -e %o %i"/>
虽然我不确定 inkscape 是否是一个很好的例子,因为对 CSS 字体的支持仍然列在 wishlist 上。 .
TL;DR
... convert SVG to PNG using ImageMagick.NET where the SVG has custom embedded fonts?
总而言之,归根结底就是为正确的工作选择正确的工具。如果您唯一的用例是将 SVG+CSS 转换为 PNG,并且您没有其他光栅操作任务,那么像 batik
这样的直接实用程序比 ImageMagick 更合适。不管你喜欢与否,安装 JRE 来执行 JAR 文件可能是最好的选择。 Magick.net
本身无法满足您的要求。
关于azure - imagemagick.net 嵌入字体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52634959/