任务中WriteableBitmap的WritePixels

本文关键字:WritePixels WriteableBitmap 任务 | 更新日期: 2023-09-27 18:27:00

一个n00b的小问题我仍然不理解阅读,许多StackOverflow的答案。

colorData变量是Kinect每秒更新25次的字节数组。没有UI组件。

我认为WriteableBitmap和WritePixels是在同一个Task的线程中调用的。但我仍然得到System.InvalidOperationException。如果为每个循环创建一个新的WriteableBitmap,就不会出错。

应该如何修复我的代码,以便以有效的方式重用我的WriteableBitmap?

private async Task DoJob(TimeSpan dueTime, TimeSpan interval, CancellationToken token) {
  if (dueTime > TimeSpan.Zero)
    await Task.Delay(dueTime, token);
  WriteableBitmap bitmap = NewColorBitmap(colorW, colorH);
  // Repeat this loop until cancelled.
  while (!token.IsCancellationRequested) {
    try {
      bitmap.WritePixels(
        new Int32Rect(0, 0, bitmap.PixelWidth, bitmap.PixelHeight),
        colorData, bitmap.PixelWidth * Bgra32BytesPerPixel, 0);
    } 
    catch(Exception ex){
      // System.InvalidOperationException: 
      // The calling thread cannot access this object 
      // because a different thread owns it.
    }
    // Wait to repeat again.
    if (interval > TimeSpan.Zero)
      await Task.Delay(interval, token);
    }
}

任务中WriteableBitmap的WritePixels

因为WriteableBitmap绑定到WPF渲染线程,所以我必须为进程间通信编写复杂的代码。

所以我不再使用它,而是使用Emgu CV(Open CV)中的Image,它们也有更好的性能。

调用WriteableBitmap.WritePixels方法

检查高度和宽度的值。也许字节数组根本不够大!步长是从内存中的一行像素到内存中的下一行像素的字节数。