如何在 .net core 上从 SVG 生成 System.Drawing.Image?

4

我找到了很多用于在C#框架中读取SVG并将其转换为System.Drawing.Image或png的库,但是我无法找到任何在.net core中执行此操作的方法。

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

有没有关于如何使用Image读取SVG或任何在.net core中工作的开源库的建议?


在我这种情况下,我有一个定义良好的SVG,这意味着SVG不多也不少,只是一个没有包含图形的base64字符串的XML文件。 - torendil
不,我的意思是,这里有一个我正在处理的SVG内容示例:https://pastebin.com/82pYGezf 正如您所看到的,其中没有嵌入图像,内容仅为标签。 - torendil
1
大多数SVG都有一些图像层。如果文件中没有图像,则是URL位置。因此,在xml中搜索文件、图片、图像可能会定位到这些项。 - jdweng
2
再次强调,我处理的文件类型中没有这样的东西 :) - torendil
1
似乎ImageMagick可以解决问题。目前正在探索。 - Adam Vincent
显示剩余5条评论
2个回答

7
  1. Skiasharp by Xamarin team seems to be a good choice. There's already a document of API on learn.microsoft.com. For more detailed information, see Mono/SkiaSharp and Mono/mono/SkiaSharp.Extended

  2. You can install the offical svg extension on nuget by dotnet add package SkiaSharp.Svg:

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

        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);
        }
    

截图:

在这里输入图片描述


目前正在审核中,看起来很有前途。 - torendil
1
非常感谢!希望你添加了一个可用的示例,我尝试过不使用pict.cullrect,但结果很糟糕(返回一张白色图片)。 - torendil
1
很不幸,它返回了空白的空间。它如何处理CSV文件中的图像? - Deivydas Voroneckis
1
@DeivydasVoroneckis 我没有使用CSV?你是指SVG吗? - itminus

5

您可以使用ImageMagick将svg转换为任何格式。

<PackageReference Include="Magick.NET-Q16-AnyCPU" Version="7.14.0" />

以下方法将SVG Base64字符串转换为其他格式。

public static string Base64ToImageStream(string base64String)
    {
        byte[] imageBytes = Convert.FromBase64String(base64String);
        using (MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length))
        {
            using (var msOut = new MemoryStream())
            {
                MagickReadSettings readSettings = new MagickReadSettings()
                {
                    Format = MagickFormat.Svg,
                    Width = 60,
                    Height = 40,
                    BackgroundColor = MagickColors.Transparent
                };

                using (MagickImage image = new MagickImage(imageBytes, readSettings))
                {
                    image.Format = MagickFormat.Png; // Specify the format you need
                    image.Write(msOut);
                    byte[] data = image.ToByteArray();
                    return Convert.ToBase64String(data);

                    // In case if you want the output in stream
                    // byte[] imgByte = Convert.FromBase64String(pngBase64);
                    // var pngStream = new MemoryStream(imgByte, 0, imgByte.Length);
                    // return pngStream;
                }
            }
        }            
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接