Самый быстрый способ масштабирования 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
}
}