我可以使用SkiaSharp将SVG渲染成PNG吗?

5
我将尝试使用SkiaSharp将SVG文件转换为PNG。虽然有许多替代方案,但我想评估其SVG加载支持。这是否可行?我尝试了以下操作:
var svg = new SKSvg(new SKSize(200, 200));
svg.Load("image.svg");

var bitmap = new SKBitmap((int)svg.CanvasSize.Width, (int)svg.CanvasSize.Height);
var canvas = new SKCanvas(bitmap);
canvas.DrawPicture(svg.Picture);
canvas.Flush();
canvas.Save();

using (var image = SKImage.FromBitmap(bitmap))
using (var data = image.Encode(SKImageEncodeFormat.Png, 80))
{
    // save the data to a stream
    using (var stream = File.OpenWrite("image.png"))
    {
        data.SaveTo(stream);
    }
}

但是我只得到了一个空白的图片。

展示一下 image.svg 的样子。 - user585968
此外,在调试时,svg.CanvasSize.Widthsvg.CanvasSize.Height的值是多少? - user585968
1
啊,好问题。我匆忙之中没有想到去测试一个众所周知的文件。我只是测试了 https://github.com/mono/SkiaSharp/blob/8ca298b448810cf65ab13cd7b2de94c627a033c1/tests/Content/images/logos.svg。它渲染得很好。所以代码没问题。也许过滤器不被支持。 - t9mike
2个回答

2
使用这段代码。我使用一个SVG网络服务绘制了一面旗帜。
  var svg = new SkiaSharp.Extended.Svg.SKSvg();
  svg.Load(msSvg);
  using (var bitMap = new SKBitmap((int)svg.CanvasSize.Width, (int)svg.CanvasSize.Height))
  using (SKCanvas canvas = new SKCanvas(bitMap))
  {
    canvas.DrawPicture(svg.Picture);
    canvas.Flush();
    canvas.Save();

    using (SKImage image = SKImage.FromBitmap(bitMap))
    {
      using (SKData data = image.Encode(SKEncodedImageFormat.Png, 80))
      {
        MemoryStream memStream = new MemoryStream(); 
        data.SaveTo(memStream);
        memStream.Seek(0, SeekOrigin.Begin);
        this._flagImage = ImageSource.FromStream(() => memStream);
      }
    }
  }

1

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