Как создать System.Drawing.Image из SVG на ядре .net? - PullRequest
0 голосов
/ 19 декабря 2018

Я нашел много библиотек для чтения SVG и преобразования его в System.Drawing.Image или png в C # framework, но я не могу найти способ сделать это в ядре .net.

И если я используюImage.FromFile, я получаю OutOfMemoryException (предположительно, потому что SVG не является растеризованным форматом).

Любые советы о том, как использовать Image для чтения SVG или любой библиотеки с открытым исходным кодом, которая работает в ядре .net?

Ответы [ 2 ]

0 голосов
/ 22 июня 2019

Вы можете использовать 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;
                }
            }
        }            
    }
0 голосов
/ 20 декабря 2018
  1. Skiasharp от команды Xamarin кажется хорошим выбором.Уже есть документ API на docs.microsoft.com .Для получения более подробной информации см. Mono / SkiaSharp и Mono / mono / SkiaSharp.Extended

  2. Вы можете установить официальное расширение svg на nuget от 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);
        }
    

Снимок экрана:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...