使用SkiaSharp.Svg从svg转换为png时添加了一些噪音

时间:2018-05-09 08:24:16

标签: svg skiasharp

我尝试通过SkiaSharp.Extended.Svg-1.60.0(netcoreapp2.0)将以下svg图像转换为png。 但the created png file中有一些噪音。

请告诉我如何摆脱它们。

<svg height="100" width="100">
    <circle cx="50" cy="50" r="40" stroke="black" stroke-width="3" fill="red" />
</svg>

,代码在这里

// using SkiaSharp;
// using SkiaSharp.Extended;
// using SkiaSharp.Extended.Svg;
string fromfile = "circle.svg";
string tofile = "circle.png";
SKEncodedImageFormat toencoding = SKEncodedImageFormat.Png;
var svg = new SkiaSharp.Extended.Svg.SKSvg();
using (var pic = svg.Load(fromfile))
{
    Console.WriteLine($"{pic.CullRect.Width},{pic.CullRect.Height}");
    using (var bmp = new SKBitmap((int)svg.Picture.CullRect.Width, (int)svg.Picture.CullRect.Height))
    {
        using (var canvas = new SKCanvas(bmp))
        using (var paint = new SKPaint())
        {
            canvas.DrawPicture(svg.Picture);
            canvas.Flush();
            canvas.Save();
            using (var img = SKImage.FromBitmap(bmp))
            using (var data = img.Encode(toencoding, 100))
            {
                using (var stm = data.AsStream())
                using (var ostm = File.Create(tofile))
                {
                    stm.CopyTo(ostm);
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

这。这是因为您没有先清除画布。只需在创建画布后添加:

canvas.Clear(SKColors.Transparent);

与其他一些自动清除像素的库不同,skia和SkiaSharp不会。这有两个主要原因:

  • 清晰的操作很昂贵
    假设一个大位图(10K x 10K),要将其清除为透明将需要一些时间。然后你决定你真的想要一个红色背景,所以你用红色清除。这意味着第一次清除是CPU的全部浪费。
  • 可能存在像素数据
    在您的情况下,您正在创建一个新的空白位图。但是,有些情况下您在现有内存上创建新位图。如果我们先清除,你的图像就会消失。现在,我们可以聪明地确定空位图应该清除,现有像素不应该清除。但是,为什么这样做,如果它是昂贵的,可能不是必需的?请参阅上述原因......