将SVG路径数据转换为GDI + GraphicsPath数据

|| 有没有一种简单的方法可以将SVG路径标签转换为C#System.Drawing.Drawing2D.GraphicsPath?它们都息息相关,我希望可以轻松地将SVG路径数据转换为GraphicsPath Points。
已邀请:
该SVG项目通过以下方式提供解决方案:
var pathData = ...;

var graphicsPath = new GraphicsPath();

foreach (var segment in SvgPathBuilder.Parse(pathData))
    segment.AddToPath(graphicsPath);

graphics.DrawPath(Pens.Black, graphicsPath);
可通过以下方式以NuGet软件包的形式获得:
PM> Install-Package Svg
没有简单的方法,尽管SVG路径和
GraphicsPath
看起来相似并且具有相同的目的,但是在事物的指定和处理方式上还是存在一些差异。一个示例:SVG弧定义与
GraphicsPath
定义弧的方式不同,因此您需要做一点三角函数以将其转换。 还检查.NET / C#中的Drawing SVG吗?
我希望这不会迟到!从AGG中查看svg查看器程序的源代码:http://www.antigrain.com/svg/index.html 源代码是C ++,并使用AGG图形引擎,但是很容易转换为GDI +。它还处理SVG弧到Bezier弧的转换,然后可以与GDI +一起使用。 祝好运
没那么复杂。 如果svg路径仅包含
M L Q Z ZM
函数,则您的方法如下所示:
private GraphicsPath svgMLQZToGraphicsPath(string svgString)
{
    GraphicsPath graphicsPath = new GraphicsPath();
    float[] x = new float[4];
    float[] y = new float[4];
    string prev = \"\";
    string[] splits = svgString.Split(\' \');
    for (int s = 0; s < splits.Length; s++)
    {
        if (splits[s].Substring(0, 1) == \"M\")
        {
            x[0] = float.Parse(splits[s].Substring(1).Replace(\'.\', \',\'));
            y[0] = float.Parse(splits[s + 1].Replace(\'.\', \',\'));
            s++;
            prev = \"M\";
            graphicsPath.StartFigure();
        }
        else if (splits[s].Substring(0, 1) == \"L\")
        {
            x[1] = float.Parse(splits[s].Substring(1).Replace(\'.\', \',\'));
            y[1] = float.Parse(splits[s + 1].Replace(\'.\', \',\'));
            graphicsPath.AddLine(new PointF(x[0], y[0]), new PointF(x[1], y[1]));
            x[0] = x[1]; // x[1] = new float();
            y[0] = y[1]; //y[1] = new float();
            s++;
            prev = \"L\";
        }
        else if (splits[s].Substring(0, 1) == \"Q\")
        {
            x[1] = x[0] + (2 / 3) * (float.Parse(splits[s].Substring(1).Replace(\'.\', \',\')) - x[0]);
            y[1] = y[0] + (2 / 3) * (float.Parse(splits[s + 1].Replace(\'.\', \',\')) - y[0]);
            x[3] = float.Parse(splits[s + 2].Replace(\'.\', \',\'));
            y[3] = float.Parse(splits[s + 3].Replace(\'.\', \',\'));
            x[2] = x[3] + (2 / 3) * (float.Parse(splits[s].Substring(1).Replace(\'.\', \',\')) - y[3]);
            y[2] = y[3] + (2 / 3) * (float.Parse(splits[s + 1].Replace(\'.\', \',\')) - y[3]);
            graphicsPath.AddBezier(new PointF(x[0], y[0]), new PointF(x[1], y[1]), new PointF(x[2], y[2]), new PointF(x[3], y[3]));
            x[0] = x[3]; 
            y[0] = y[3]; 
            s = s + 3;
            prev = \"Q\";
        }
        else if (splits[s].Substring(0, 1) == \"Z\")
        {
            graphicsPath.CloseFigure();
            if (splits[s].Length >= 2 && splits[s].Substring(0, 2) == \"ZM\")
            {
                x[0] = float.Parse(splits[s].Substring(2).Replace(\'.\', \',\'));
                y[0] = float.Parse(splits[s + 1].Replace(\'.\', \',\'));
                s++;
                graphicsPath.StartFigure();
                prev = \"M\";
            }
        }
        else
        {
            string ok = @\"^[a-zA-Z]*$\";
            if (!Regex.IsMatch(splits[s + 1].Substring(0, 1), ok))
            {
                string replace = prev + splits[s + 1];
                splits[s + 1] = replace;
            }
        }
    }
    return graphicsPath;
}

要回复问题请先登录注册