Используя пакет NuGet SVG.NET для рендеринга изображений SVG в растровые изображения в .NET, я пытаюсь изменить цвет изображения во время рендеринга.
например. У меня есть этот источник изображения SVG:
и хотите сделать это, например. как зеленое растровое изображение:
(В моем сценарии все исходные изображения 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 в растровое изображение с помощью SVG.NET?
(я спрашиваю здесь на SO, а не только на их странице GitHub, так как кажется, что авторы не отвечают на вопросы вообще или очень редко только)
Обновление 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);
}
}
Хотя я не уверен в стоимости этой рекурсивной итерации всех узлов и в том, есть ли более быстрый путь.