我找到了很多用于在C#框架中读取SVG并将其转换为System.Drawing.Image或png的库,但是我无法找到任何在.net core中执行此操作的方法。
如果我使用Image.FromFile,我会得到一个OutOfMemoryException(可能是因为SVG不是栅格化格式)。
有没有关于如何使用Image读取SVG或任何在.net core中工作的开源库的建议?
我找到了很多用于在C#框架中读取SVG并将其转换为System.Drawing.Image或png的库,但是我无法找到任何在.net core中执行此操作的方法。
如果我使用Image.FromFile,我会得到一个OutOfMemoryException(可能是因为SVG不是栅格化格式)。
有没有关于如何使用Image读取SVG或任何在.net core中工作的开源库的建议?
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
You can install the offical svg extension on nuget by dotnet add package SkiaSharp.Svg
:
<PackageReference Include="SkiaSharp.Svg" Version="1.60.0" />
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);
}
截图:
您可以使用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;
}
}
}
}