You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在代码中直接传入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:55:45