快速扩展SKImage(SkiaSharp)的最佳方法

5

我正在寻找调整SKImage大小的最快方法。不幸的是,我找到了一些例子。

我提出这个问题是因为如果我同时在多个线程(在我的情况下大约60个线程)中执行这些函数,每个单独缩放函数的执行时间会增加到20倍以上。

我已经尝试了以下方法,性能看起来非常相似,有更好的方法吗?

方法1:

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

方法二:
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个回答

4
这是我使用的代码。另一个想法是确保在using中包装您的SKImage对象,以确保它们能够快速释放。我不确定这是否会导致每次迭代的减速。
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
    }
}

2
SKSurface.Create的过载已经过时并会生成警告。现代代码是SKSurface.Create(new SKImageInfo { Width = resizedWidth, Height = resizedHeight, ColorType = SKImageInfo.PlatformColorType, AlphaType = SKAlphaType.Premul }) - MiffTheFox
我已经测试了这个与当前的SKBitMap.Resize,现在它们产生了相同的结果,所以不再需要Canvas或大部分代码。 - runxc1 Bret Ferrier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接