UWP - 如何在后台任务中使用 WriteableBimap?选择?

UWP - How to use WriteableBimap in a background task? Alternative?

以下代码读取图像,并将该图像居中(剪切和复制)到带有黑框的结果图像中,returns 新图像。

我可以不使用可写位图来实现吗class?

private async Task<WriteableBitmap> FrameToCenter(StorageFile image, Size newSize)
    {
        WriteableBitmap result = new WriteableBitmap((int) newSize.Width,(int) newSize.Height);

        WriteableBitmap bitmapToFrame = await StorageFileToSoftwareBitmap(image);

        Rect sourceRect = new Rect(0, 0, bitmapToFrame.PixelWidth, bitmapToFrame.PixelHeight);
        int a = (int) Math.Min(newSize.Height, newSize.Width);
        Rect destRect = new Rect((int) ((_screenResolution.Width - _screenResolution.Height)/2), 0, a, a);

        result.Blit(destRect, bitmapToFrame, sourceRect);

        return result;
    }

一切正常,但后来我尝试将该代码放入 UWP 中的 BackgroundTask,由于我无法在 UI 线程之外的不同线程上使用 WriteableBitmap 而导致异常.

还有什么我可以做的吗?不过我需要在后台任务中 运行 它。

以及行:

result.Blit(destRect, bitmapToFrame, sourceRect);

实际上正在使用我无法使用的 WriteableBitmapEx 扩展。还有别的办法吗?我真的看不到如何在后台任务线程上操作位图的方法。我在这里安静地迷路了。我什至一直在考虑使用 openCV 库并在 C++ 中进行,这会解决问题吗?

还有, which mentions I should derive my background task from XamlRenderingBackgroundTask class。我该怎么做?

您可以像使用常规 BackgroundTask 一样使用 XamlBackgroundTask

public sealed class MyBackgroundTask : XamlRenderingBackgroundTask
{
    protected override async void OnRun(IBackgroundTaskInstance taskInstance)
    {
        var deferral = taskInstance.GetDeferral();
        //your code here
        deferral.Complete();
    }
 }

不同之处在于它可以访问 UI 线程,因此您可以使用 WriteableBitmap。

我会关注 this 文章中的重要建议。

Important To keep the memory footprint of the background task as low as possible, this task should be implemented in a C++ Windows Runtime Component for Windows Phone. The memory footprint will be higher if written in C# and will cause out of memory exceptions on low-memory devices which will terminate the background task. For more information on memory constraints, see Support your app with background tasks.