如何通过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);
}
简单的方法是:
var svgDocument = SvgDocument.Open(f);
using (var bitmap = svgDocument.Draw(500,0))
{
bitmap.Save(output500pixWide);
}
Draw接受宽度和高度。如果宽度或高度之一为0,则输出使用长宽比缩放。