我有一个方法可以更新 WriteableBitmap (FrameDataNew) 的内容,它是我的视图模型 (VM) 中的一个属性:
public WriteableBitmap FrameDataNew
{
get { return frameDataNew; }
set
{
frameDataNew = value;
OnProptertyChanged("FrameDataNew");
}
}
private WriteableBitmap frameDataNew = null;
当我从我编写的 gstreamer 类收到一个新的位图时,我更新 FrameDataNew 以便在屏幕上显示最新的帧。该窗口是一个简单的 Image 控件,其源绑定到 FrameDataNew。
以下代码可以很好地在我的事件处理程序中执行此操作:
/// <summary>
/// BitmapCaptured event handler for when a new video frame is received from the IP source
/// </summary>
/// <param name="sender">The originating source of the event</param>
/// <param name="NewBitmap">The new frame in Bitmap form</param>
private void PipeLine_BitmapCaptured(object sender, Bitmap NewBitmap)
{
// render to the screen
Dispatcher.Invoke(() =>
{
// check the existence of the WriteableBitmap and also the dimensions, create a new one if required
if ((VM.FrameDataNew == null) || (VM.FrameDataNew.Width != NewBitmap.Width) || (VM.FrameDataNew.Height != NewBitmap.Height))
VM.FrameDataNew = new WriteableBitmap(NewBitmap.Width, NewBitmap.Height, NewBitmap.HorizontalResolution, NewBitmap.VerticalResolution, PixelFormats.Bgr24, null);
// lock the bitmap data so we can use it
BitmapData data = NewBitmap.LockBits(new Rectangle(0, 0, NewBitmap.Width, NewBitmap.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
现在我想更新我的程序以处理多个管道和 WriteableBitmaps,以便我可以显示多个视频源。我做的第一件事是创建一个静态实用程序类,以便我可以传入我希望更新的新位图 (NewBitmap) 和 WriteableBitmap (VM.FrameDataNew)。
图像不再出现在屏幕上。单步执行代码,每次调用 InjectBitmap() 时,目标 WriteableBitmap 是否为空?代码在第一个 if 语句中创建了一个新的,但 VM.FrameDataNew 保持为空?
我绝对处于我在这方面经验的边缘,因此非常感谢任何帮助。