我试图通过SkiaSharp.Extended.Svg-1.60.0(netcoreapp2.0(将以下svg图像转换为png。 但是创建的PNG文件中有一些噪音。
请告诉我如何摆脱它们。
<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);
}
}
}
}
}
这是由于您没有首先清除画布造成的。只需在创建画布后添加以下内容:
canvas.Clear(SKColors.Transparent);
与其他一些自动清除像素的库不同,skia 和 SkiaSharp 不会。这主要有两个原因:
- 清除操作成本很高
假设一个大的位图(10K x 10K(,将其清除为透明将需要一些时间。然后你决定你实际上想要一个红色的背景,所以你用红色清除。这意味着第一次清除完全浪费了CPU。 - 可能存在现有的像素数据
在您的情况下,您正在创建一个新的空白位图。但是,在某些情况下,您会在现有内存上创建新的位图。如果我们先清除,您的图像将消失。现在,我们可以聪明地确定空位图应该清除,而现有像素不应该。但是,如果它很昂贵并且可能不需要,为什么要这样做呢?请参阅上述观点以了解原因...