如何通过SVG c#库缩放SVG节点

本文关键字:SVG 缩放 节点 何通过 | 更新日期: 2023-09-27 18:17:11

我试图在将SVG保存为PNG之前缩放SVG,以便当应用程序以不同的"缩放"等级,图像不像素化。我正在尝试使用这个库https://github.com/vvvv/SVG,但是由于没有文档,我尝试用html lagilitypack来补充它,它使用正常的xpath选择,然后向节点本身添加转换样式。似乎SVG c#库在处理读取、绘制和保存文件时没有考虑比例转换,因此画布不能正确缩放。

我不知道如何真正使用SVG c#,除了非常基本的东西,如打开和保存文件。我不知道如何选择节点或应用转换。有人能帮忙吗?

public void svgToPng(string svgFileContents,string fileName)
{
        var svgDocument = SvgDocument.Open(svgFileContents);
        string workingPath = svgFileContents.Replace(".svg", "_working.svg");
        if (System.IO.File.Exists(workingPath))
        {
            System.IO.File.Delete(workingPath);
        }
        var workingSvgDocument = SvgDocument.Open(svgFileContents).GetXML();
        HtmlDocument theDocument = new HtmlDocument();
        theDocument.LoadHtml(workingSvgDocument);
        HtmlNodeCollection theNodes = theDocument.DocumentNode.SelectNodes("//svg");
        foreach (var node in theNodes)
        {
            
            decimal decimalWidth = Convert.ToDecimal(sizeOfSprites - (sizeOfSprites*.1));
            int oldWidth = Int32.Parse(node.GetAttributeValue("width",null).Replace("px",""));
            int oldHeight = Int32.Parse(node.GetAttributeValue("height",null).Replace("px",""));
            decimal percentChange = decimalWidth / oldWidth;
            int newWidth = Convert.ToInt32(decimalWidth);
            int newHeight = Convert.ToInt32(oldHeight * percentChange);
            node.SetAttributeValue("width", newWidth.ToString() + "px");
            node.SetAttributeValue("height", newHeight.ToString() + "px");
            node.SetAttributeValue("viewbox", "0 0 " + newWidth.ToString() + " " + newHeight.ToString());
            node.SetAttributeValue("enable-background", "new 0 0 " + newWidth.ToString() + " " + newHeight.ToString());
            node.SetAttributeValue("preserveAspectRatio", "xMinyMin meet");
            //node.SelectSingleNode("g").SetAttributeValue("style", "fill:purple;transform:scale("+Convert.ToDouble(percentChange)+")");
            HtmlNode svgRoot = node.ParentNode;
            HtmlNode newSvgParent = theDocument.CreateElement("svg");
            newSvgParent.SetAttributeValue("baseprofile", "full");
            newSvgParent.SetAttributeValue("width", "100%");
            newSvgParent.SetAttributeValue("height", "100%");
            newSvgParent.SetAttributeValue("xmlns", "http://www.w3.org/2000/svg");
            newSvgParent.SetAttributeValue("xmlns:xlink", "http://www.w3.org/1999/xlink");
            newSvgParent.SetAttributeValue("xmlns:ev", "http://www.w3.org/2001/xml-events");
            newSvgParent.AppendChild(node);
            svgRoot.ReplaceChild(newSvgParent, node);
            node.Attributes.Remove("xmlns");
            node.Attributes.Remove("xmlns:xlink");
            break;
        }
        theDocument.Save(workingPath);
        var output = SvgDocument.Open(workingPath);
        //output = SvgDocument.Open.Nodes.Select(Func < noclue, nodocumentation > stuck).Transform.Scale.?
        if (System.IO.File.Exists(svgFileContents.Replace(".svg",".png")))
        {
            System.IO.File.Delete(svgFileContents.Replace(".svg",".png"));
        }
        var bitmap = output.Draw();
        bitmap.Save(svgFileContents.Replace(".svg",".png"), System.Drawing.Imaging.ImageFormat.Png);
}

如何通过SVG c#库缩放SVG节点

简单的方法是:

var svgDocument = SvgDocument.Open(f);
using (var bitmap = svgDocument.Draw(500,0))
{                      
   bitmap.Save(output500pixWide);
}

Draw接受宽度和高度。如果宽度或高度之一为0,则输出使用长宽比缩放。