首页 > 解决方案 > 如何在 .net 核心上从 SVG 生成 System.Drawing.Image?

问题描述

我找到了许多库来读取 SVG 并将其转换为 C# 框架中的 System.Drawing.Image 或 png,但我在 .net 核心中找不到任何方法。

如果我使用 Image.FromFile,我会得到 OutOfMemoryException(可能是因为 SVG 不是光栅化格式)。

关于如何使用 Image 读取 SVG 或任何在 .net 核心中工作的开源库的任何提示?

标签: c#svgasp.net-core

解决方案


  1. Xamarin 团队的Skiasharp似乎是一个不错的选择。docs.microsoft.com上已有 API 文档。有关更多详细信息,请参阅Mono/SkiaSharpMono/mono/SkiaSharp.Extended

  2. 您可以通过以下方式在nuget上安装官方 svg 扩展dotnet add package SkiaSharp.Svg

    <PackageReference Include="SkiaSharp.Svg" Version="1.60.0" />
    
  3. 演示:

        var svgSrc=Path.Combine(Directory.GetCurrentDirectory(),"img.svg");
        string svgSaveAs = "xyz.png";
        var quality = 100;
    
        var svg = new SkiaSharp.Extended.Svg.SKSvg();
        var pict = svg.Load(svgSrc);
        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);
    
        // convert to PNG
        var skdata = img.Encode(SkiaSharp.SKEncodedImageFormat.Png,quality);
        using(var stream = File.OpenWrite(svgSaveAs)){
            skdata.SaveTo(stream);
        }
    

截屏:

在此处输入图像描述


推荐阅读