Самый быстрый способ масштабирования SKImage (SkiaSharp)

Я ищу самый быстрый способ изменить размер SKImage. К сожалению, я нашел несколько примеров.

Я спрашиваю об этом, потому что, если я выполняю эти функции параллельно (в моем случае около 60 потоков), время выполнения каждой отдельной функции масштабирования увеличивается в двадцать раз.

Я попробовал с помощью следующих методов, и производительность выглядит очень похоже, есть ли что-нибудь лучше?

Способ 1:

SKImage src = (...);
SKImageInfo info = new SKImageInfo(width, height, SKColorType.Bgra8888);
SKImage output = SKImage.Create(info);
src.ScalePixels(output.PeekPixels(), SKFilterQuality.None);

Способ 2:

SKImage src = (...);
SKImage output;
float resizeFactorX = (float)width / (float)Src.Width;
float resizeFactorY = (float)height / (float)Src.Height;

using (SKSurface surface = SKSurface.Create((int)(Src.Width * 
       resizeFactorX), (int)(Src.Height * resizeFactorY),
       SKColorType.Bgra8888, SKAlphaType.Opaque))
{
  surface.Canvas.SetMatrix(SKMatrix.MakeScale(resizeFactorX, resizeFactorY));
  surface.Canvas.DrawImage(Src, 0, 0);
  surface.Canvas.Flush();
  output = surface.Snapshot();
}

1 ответ

Это код, который я использую. Еще одна мысль, чтобы убедиться, что ваши объекты SKImage обернуты в using, чтобы они быстро избавились. Я не уверен, может ли это быть причиной замедления с каждой итерацией.

using (var surface = SKSurface.Create(resizedWidth, resizedHeight,
    SKImageInfo.PlatformColorType, SKAlphaType.Premul))
using (var paint = new SKPaint())
{
    // high quality with antialiasing
    paint.IsAntialias = true;
    paint.FilterQuality = SKFilterQuality.High;

    // draw the bitmap to fill the surface
    surface.Canvas.DrawImage(srcImg, new SKRectI(0, 0, resizedWidth, resizedHeight),
        paint);
    surface.Canvas.Flush();

    using (var newImg = surface.Snapshot())
    {
        // do something with newImg
    }
}
Другие вопросы по тегам