在非ui线程上处理图像

时间:2014-04-10 18:54:27

标签: c# wpf image-processing

我目前要在非UI线程上处理 WriteableBitmap

我基本上想要重用作为我的Image-control源的图像,并在Task.Run中处理它。

WriteableBitmap bitmap;

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

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

  

调用线程无法访问此对象,因为另一个线程拥有它。

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

有人能帮助我吗?

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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