繁体   English   中英

在非 ui 线程上处理图像

[英]Process image on non-ui thread

我目前有一个WriteableBitmap ,我想在非 UI 线程上处理它

我基本上想重用作为我的图像控件源的图像并在 Task.Run 中处理它。

WriteableBitmap bitmap;

Task.Run(() =>
{
     // Process the bitmap here
});

不幸的是,我收到以下异常,因为它在 UI 线程上被阻止

调用线程无法访问此对象,因为其他线程拥有它。

注意 - 我不想在 UI 线程上处理代码!

有人能帮助我吗?

像WriteableBitmap这样的对象必须在它们创建的线程上使用。 所以你必须在另一个线程上分配它。

如果您希望在处理工作线程后在UI上使用已处理的图像,则应执行以下操作之一:

  • 将结果复制回UI(即通过copyPixels)。
  • 冻结对象(您必须在工作线程上调用Freeze()方法)。 然后你不能再改变对象了,但是你可以在你想要的任何线程上将它用于只读。

WriteableBitmapDispatcherObject ,只有创建Dispatcher的线程才可以直接访问DispatcherObject 要从创建DispatcherObject的线程以外的线程访问DispatcherObject ,我们需要在与DispatcherObject关联的Dispatcher上调用Invoke或BeginInvoke。 委托将在该线程上执行,因此渲染线程将阻塞。

如果您想使用原始像素数据, WriteableBitmap将是一个不错的选择。 我们可以使用WriteableBitmap的CopyPixels方法将像素数据加载到int数组中,在我们修改int array的数据后,我们可以使用WritePixels方法更新WriteableBitmap的像素。 所以,也许你可以尝试在后台线程中操作int数组。

创建要写入Task中WriteableBitmap的像素数据(数组),并在GUI线程上执行Write。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM