WritePixels для WriteableBitmap в задаче

Небольшой вопрос n00b Я до сих пор не понимаю, чтение, многие ответы Stackru.

colorData Переменная - это байтовый массив, обновленный 25 раз в секунду Kinect. Там нет компонента пользовательского интерфейса.

Я думал, что WriteableBitmap и WritePixels были вызваны в том же потоке задачи. Но я все еще получаю 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);
    }
}

2 ответа

Решение

Поскольку WriteableBitmap привязан к потоку рендеринга WPF, я должен сделать сложный код для взаимодействия между процессами.

Поэтому я больше не использую его, а вместо этого использую изображение из Emgu CV (Open CV), которое также имеет лучшие показатели.

Вызов метода WriteableBitmap.WritePixels

Проверьте значения высоты и ширины. Возможно, массив байтов просто недостаточно велик! И шаг - это количество байтов от одной строки пикселей в памяти до следующей строки пикселей в памяти.

Другие вопросы по тегам