gpt4 book ai didi

c# - 如何将 SVG 图像渲染为单色位图图像?

转载 作者:行者123 更新时间:2023-12-05 06:30:48 25 4
gpt4 key购买 nike

使用 SVG.NET用于在 .NET 中将 SVG 图像渲染为位图图像的 NuGet 包,我试图在渲染过程中更改图像的颜色。

例如我有这个源 SVG 图片:

enter image description here

并想要渲染它,例如作为绿色位图图像:

enter image description here

(在我的场景中,所有源 SVG 图像都是单色的)。

我当前的不成功代码如下所示:

var svgDoc = SvgDocument.Open<SvgDocument>(svgFilePath, null);

// Tried several things, all without any changes in the resulting bitmap:
svgDoc.Color = new SvgColourServer(Color.DarkGreen);
svgDoc.StopColor = new SvgColourServer(Color.DarkGreen);
svgDoc.Stroke = new SvgColourServer(Color.DarkGreen);
svgDoc.Fill = new SvgColourServer(Color.DarkGreen);

var bitmap = svgDoc.Draw();

源码我也查过了,翻了一遍,还是没找到改颜色的办法。

我的问题:

如何在使用 SVG.NET 将 SVG 图像渲染为位图图像的过程中更改颜色?

(我在这里询问,而不仅仅是在他们的 GitHub 页面上,因为作者似乎根本没有或很少回复 questions)

更新 1:

起作用的是以下片段:

var svgDoc = SvgDocument.Open<SvgDocument>(svgFilePath, null);

// Recursively change all nodes.
processNodes(svgDoc.Descendants(), new SvgColourServer(Color.DarkGreen));

var bitmap = svgDoc.Draw();

连同这个函数:

private void processNodes(
IEnumerable<SvgElement> nodes, SvgPaintServer colorServer)
{
foreach (var node in nodes)
{
if (node.Fill != SvgPaintServer.None) node.Fill = colorServer;
if (node.Color != SvgPaintServer.None) node.Color = colorServer;
if (node.StopColor != SvgPaintServer.None) node.StopColor = colorServer;
if (node.Stroke != SvgPaintServer.None) node.Stroke = colorServer;

processNodes(node.Descendants(), colorServer);
}
}

虽然我不确定这种递归迭代所有节点的成本以及是否有更快的方法。

最佳答案

您的第一次尝试失败听起来很合理,因为您只设置了 fillstroke在 parent 身上<svg>元素,并且 parent 的填充/描边不会覆盖 child 的填充/描边。示例:

<svg fill="green" stroke="green" xmlns="http://www.w3.org/2000/svg" width="200" height="200" >
<g stroke="black" stroke-width="2" fill="none" >
<path d="M90,90 v-80 a80,80 0 0,0 -80,80 z" fill="red" />
<path d="M100,100 h-80 a80,80 0 1,0 80,-80 z" fill="gold" />
</g>
</svg>

更新方法的一个替代方法是通过 CSS 设置填充/描边,因为 CSS 将覆盖任何 fillstroke属性。因此,如果 SVG.NET 允许您插入/编辑 <style>在你的 SVG 元素中,你可以这样做:

<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" >
<style>
* {
fill: green;
stroke: green;
}
</style>
<g stroke="black" stroke-width="2" fill="none" >
<path d="M90,90 v-80 a80,80 0 0,0 -80,80 z" fill="red" />
<path d="M100,100 h-80 a80,80 0 1,0 80,-80 z" fill="gold" />
</g>
</svg>

关于c# - 如何将 SVG 图像渲染为单色位图图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52041566/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com