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.
以下代码读取图像,并将该图像居中(剪切和复制)到带有黑框的结果图像中,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++ 中进行,这会解决问题吗?
还有
您可以像使用常规 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.