C# 使用C将SVG元素转换为PNG文件#
我正在尝试将SVG转换为PNG文件。我的主要问题不是转换本身(我可以用几行代码来实现),而是要发送到渲染的“窗口”中的SVG元素的中心 我使用SVG引擎(),我的想法是获取要渲染的元素,然后将其重新定位在原点,然后将SVG文档的宽度和高度设置为元素的宽度/高度。 代码如下: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"); //
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
- 描述渲染零件如何适合输出窗口。例如,
(默认设置)意味着:使用最大大小调整viewBox区域的大小,使其正好适合宽度/高度,而不会在任何方向溢出,并将其放置在中心XMidYMid-meet
- 命令行中的inkscape-I MyID
- 通过Javascript
document.getElementById(“MyId”).getBBox()在浏览器中
Tnx---------------------------------------------------------------UPDATE---------------------------------------------我认为它与我要渲染的元素中的g元素的transfrom属性有关。如果我去掉所有的变换属性,它就可以很好地工作,不仅仅是对于这个例子,甚至对于更复杂的几何图形。如何将这些转换考虑在内?您能否进一步解释一下您遇到的inkscape CLI问题?我正成功地将其用于您描述的大致相同的任务。Tnx提供帮助。我已经更改了svg文档的宽度和高度,但是使用了我想要渲染的元素的Bounds属性,这似乎是错误的,因为它给出了太高的值。。。摆脱所有的变换一切都很好,边界给出了正确的值。SVG库中应该有一个bug…您可以通过使用不同的软件测试边界的值来验证它们。在现代浏览器中直接打开.svg,按打开开发人员工具,在集成控制台中,键入
document.getElementById(“MyId”).getBBox()
。结果应该是一个与该元素的边界属性相匹配的对象。再次阅读库源代码后,我现在确定边界没有提供所需的值-这不是一个bug,但缺少该属性的文档。嗯,有一个bug:,但即使解决了它也不能满足您的需要。我想这是我的问题。。。孩子身上的变换。感谢Tnx指出这一点。