简体   繁体   English

uwp InkCanvas将笔划另存为svg

[英]uwp InkCanvas save stokes as svg

I am trying to save InkCanvas , InkStorkes as a SVG. 我正在尝试将InkCanvas和InkStorkes保存为SVG。 I found a previous question that works for Wpf,but I have been unable to get it to work with uwp. 我找到了一个适用于Wpf的先前的问题,但是我无法使其与uwp一起使用。 Wpf InkCanvas save stokes as svg . Wpf InkCanvas将笔画保存为svg I made some changes to it, but I am running into issues with GetGrometry and XamlWriter. 我对此进行了一些更改,但是我遇到了GetGrometry和XamlWriter的问题。

 var svg = new SvgDocument();
        var colorServer = new SvgColourServer(System.Drawing.Color.Black);

        var group = new SvgGroup { Fill = colorServer, Stroke = colorServer };
        svg.Children.Add(group);

        foreach (var stroke in inkCanvas.InkPresenter.StrokeContainer.GetStrokes())
        {

            var geometry = stroke.GetGeometry(stroke.DrawingAttributes).GetOutlinedPath‌​Geometry();

            var s = XamlWriter.Save(geometry);

            if (s.IsNotNullOrEmpty())
            {
                var element = XElement.Parse(s);

                var data = element.Attribute("Figures")?.Value;

                if (data.IsNotNullOrEmpty())
                {
                    group.Children.Add(new SvgPath
                    {
                        PathData = SvgPathBuilder.Parse(data),
                        Fill = colorServer,
                        Stroke = colorServer
                    });
                }
            }
        }

I implemented an approach from the comments Xavier Xie - MSFT. 我从Xavier Xie-MSFT的评论中实现了一种方法。

The main idea was to use own implementation of ICanvasPathReceiver interface - here is CanvasGeometryToSvgPathReader class: 主要思想是使用ICanvasPathReceiver接口自己的实现-这是CanvasGeometryToSvgPathReader类:

var svgDocument = new CanvasSvgDocument(canvasDevice);

foreach (var stroke in InkCanvas.InkPresenter.StrokeContainer.GetStrokes())
{
    var canvasGeometry = CanvasGeometry.CreateInk(drawingSession, new[] {stroke});

    var pathReceiver = new CanvasGeometryToSvgPathReader();
    canvasGeometry.SendPathTo(pathReceiver);

    var element = svgDocument.Root.CreateAndAppendNamedChildElement("path");

    element.SetStringAttribute("d", pathReceiver.Path);
    element.SetColorAttribute("fill", stroke.DrawingAttributes.Color);
}

As result ballpoint pen renders fine, highlighter worse and pencil doesn't render. 结果,圆珠笔可以很好地渲染,荧光笔则更糟,而铅笔则不能渲染。

Full source code: https://github.com/ycherkes/InkToSvg 完整的源代码: https : //github.com/ycherkes/InkToSvg

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM