如何在代码中直接传入XML内容而非文件路径调用SkiaSharp的Load方法?
解决方案:直接用内存流传递XML内容,无需模拟文件路径
当然可以!你完全不需要创建物理文件或者模拟文件路径——SkiaSharp的SKSvg其实有一个Load(Stream)重载(从你给出的Load(string)实现里也能看到它内部就是转成流来处理的),所以我们只需要把XmlDocument的内容写入内存流,再把这个流传给Load方法就行。
修改后的代码示例
这里是调整后的完整代码,重点看处理XmlDocument转流的部分:
public IActionResult svgToPng(string itemId, string mode = "") { var svgSrc = new XmlDocument(); svgSrc.LoadXml(/*Some xml code*/); string svgSaveAs = "save file path"; var quality = 100; var svg = new SkiaSharp.Extended.Svg.SKSvg(); SKPicture pict; // 核心修改:把XmlDocument转成内存流 using (var memoryStream = new MemoryStream()) { svgSrc.Save(memoryStream); // 重置流的位置到开头,否则Load会从末尾开始读不到内容 memoryStream.Seek(0, SeekOrigin.Begin); pict = svg.Load(memoryStream); } var dimen = new SkiaSharp.SKSizeI ( (int) Math.Ceiling(pict.CullRect.Width), (int) Math.Ceiling(pict.CullRect.Height) ); var matrix = SKMatrix.MakeScale(1, 1); var img = SKImage.FromPicture(pict, dimen, matrix); // 转换为PNG var skdata = img.Encode(SkiaSharp.SKEncodedImageFormat.Png, quality); using(var stream = System.IO.File.OpenWrite(svgSaveAs)) { skdata.SaveTo(stream); } ViewData["Content"] = "PNG file was created out of SVG."; return View(); }
关键说明
- 我们用
XmlDocument.Save()把XML内容直接写入MemoryStream,这是一个完全在内存中操作的流,不需要磁盘文件。 - 一定要调用
memoryStream.Seek(0, SeekOrigin.Begin):因为写入流之后,流的位置指针会停在最后,直接传给Load的话会读不到任何内容,重置到开头才能让SkiaSharp正确读取SVG数据。 - 这个方法比模拟文件路径更高效,避免了磁盘IO的开销,也不需要处理文件权限、临时文件清理等问题。
内容的提问来源于stack exchange,提问作者narayana raghavendra
相关产品推荐
相关产品推荐

