некоторые шумы были добавлены при конвертации из SVG в PNG с SkiaSharp.Svg - PullRequest
0 голосов
/ 09 мая 2018

Я попытался преобразовать следующее изображение SVG в PNG с помощью SkiaSharp.Extended.Svg-1.60.0 (netcoreapp2.0). но есть некоторые шумы в созданном файле 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);
                }
            }
        }
    }
}

1 Ответ

0 голосов
/ 10 мая 2018

Это. Это потому, что вы сначала не очищаете холст. Просто добавьте это после создания холста:

canvas.Clear(SKColors.Transparent);

В отличие от некоторых других библиотек, которые автоматически очищают пиксели, Skia и SkiaSharp этого не делают. Это по двум основным причинам:

  • Операция очистки дорогая
    Предположим, большое растровое изображение (10K x 10K), чтобы очистить его до прозрачного, потребуется некоторое время. И тогда вы решаете, что на самом деле хотите красный фон, поэтому вы очищаете красным. Это означает, что первая очистка была полной тратой CPU.
  • Возможно, существуют данные о пикселях
    В вашем случае вы создаете новое, пустое растровое изображение. Но бывают случаи, когда вы создаете новое растровое изображение поверх существующей памяти. Если мы сначала очистим, ваше изображение исчезнет. Теперь мы можем быть умными и определить, что пустые растровые изображения должны очищаться, а существующие пиксели - нет. Но зачем это делать, если это дорого и может не потребоваться? См. Пункт выше по причинам ...
...