C# 使用C将SVG元素转换为PNG文件#

C# 使用C将SVG元素转换为PNG文件#,c#,svg,bounding-box,inkscape,C#,Svg,Bounding Box,Inkscape,我正在尝试将SVG转换为PNG文件。我的主要问题不是转换本身(我可以用几行代码来实现),而是要发送到渲染的“窗口”中的SVG元素的中心 我使用SVG引擎(),我的想法是获取要渲染的元素,然后将其重新定位在原点,然后将SVG文档的宽度和高度设置为元素的宽度/高度。 代码如下: var svgDocument = SvgDocument.Open(filename); var el =(SvgVisualElement) svgDocument.GetElementById("MyId"); //

我正在尝试将SVG转换为PNG文件。我的主要问题不是转换本身(我可以用几行代码来实现),而是要发送到渲染的“窗口”中的SVG元素的中心

我使用SVG引擎(),我的想法是获取要渲染的元素,然后将其重新定位在原点,然后将SVG文档的宽度和高度设置为元素的宽度/高度。 代码如下:

var svgDocument = SvgDocument.Open(filename);
var el =(SvgVisualElement) svgDocument.GetElementById("MyId");

// set in the origin
el.Transforms.Add(new SvgTranslate(-el.Bounds.X, -el.Bounds.Y));

// set doc dimensions
svgDocument.Width = el.Bounds.Width;
svgDocument.Height = el.Bounds.Height;

bitmap.Save("PNGFile", ImageFormat.Png);
不幸的是,它不是那样工作的。 下面是一个svg不起作用的示例(它是lenthy,所以我删掉了相关部分):


我没有找到该库的文档。我已经查看了源代码,但我能解释的主要是SVG部分。也许有更简单的方式引擎提供自己

transform
根svg元素上的属性是合法的,但是在您想要完成的内容的上下文中,它们比helpfull更容易混淆,因为还有其他属性会导致转换,但是是以不同的形式编写的

元素提供的属性与您想要更直接地完成的任务相匹配:

  • 忽略最外层svg元素上的
    x
    y
    属性

  • 宽度
    高度
    描述图像渲染到的输出维度。因此,它们应该反映最终的“窗口”维度。如果SVG最初的尺寸不适合您的“窗口”,请更改它们

  • 描述应渲染内部SVG视口(根元素的坐标系)的哪一部分。此不是所选元素的
    svgvisualement.Bounds
    结构返回的值。(相对于元素本身坐标系的值,但不包括所有父元素转换)我在库中找不到任何函数可以获得所需的值

  • 描述渲染零件如何适合输出窗口。例如,
    XMidYMid-meet
    (默认设置)意味着:使用最大大小调整viewBox区域的大小,使其正好适合宽度/高度,而不会在任何方向溢出,并将其放置在中心

虽然我不知道如何从库中获取所需的边界框值,但其他程序可以毫无问题地提供它们:

  • 命令行中的inkscape-I MyID
  • 通过Javascript
    document.getElementById(“MyId”).getBBox()在浏览器中

在ccprog的评论推动下,我发现inkscape打开了UI,因为我在运行同一命令时也在做其他事情

实际运行inkscape为:

MyFile.svg--export id=ElementIdToRender--export id only--export dpi=200--export png=“TargetFile”

他做这项工作

仍然要理解为什么SVG库给g元素提供奇怪的数字作为边界,这些元素包含一个或多个具有transform属性集的子元素,但现在我可以继续了。
Tnx

---------------------------------------------------------------UPDATE---------------------------------------------我认为它与我要渲染的元素中的g元素的transfrom属性有关。如果我去掉所有的变换属性,它就可以很好地工作,不仅仅是对于这个例子,甚至对于更复杂的几何图形。如何将这些转换考虑在内?您能否进一步解释一下您遇到的inkscape CLI问题?我正成功地将其用于您描述的大致相同的任务。Tnx提供帮助。我已经更改了svg文档的宽度和高度,但是使用了我想要渲染的元素的Bounds属性,这似乎是错误的,因为它给出了太高的值。。。摆脱所有的变换一切都很好,边界给出了正确的值。SVG库中应该有一个bug…您可以通过使用不同的软件测试边界的值来验证它们。在现代浏览器中直接打开.svg,按打开开发人员工具,在集成控制台中,键入
document.getElementById(“MyId”).getBBox()
。结果应该是一个与该元素的边界属性相匹配的对象。再次阅读库源代码后,我现在确定边界没有提供所需的值-这不是一个bug,但缺少该属性的文档。嗯,有一个bug:,但即使解决了它也不能满足您的需要。我想这是我的问题。。。孩子身上的变换。感谢Tnx指出这一点。