BitmapFrame.Create的例外(WPF框架中的错误?)

我实现了一个C#应用程序,它以30fps的帧速率接收帧RGB。

使用以下代码管理帧到达事件:

void client_ColorFrameReady(object sender, ColorFrameReadyEventArgs e) { mycounter++; Console.WriteLine("new frame received: " + mycounter); if (writer != null) { count++; if (count % 2== 0) { using (var frame = BitmapImage2Bitmap(e.ColorFrame.BitmapImage)) using (var thumb = ResizeBitmap(frame, 320, 240)) { writer.WriteVideoFrame(thumb); } } } else { writer.Close(); } } 

使用if条件我只管理两个帧中的一个。

当我的代码调用BitmapImage2Bitmap我获得了以下exception:

在此处输入图像描述

英语中的例外应该是:

 A first chance exception of type 'System.NotSupportedException' occurred in `PresentationCore.dll` Additional information: BitmapMetadata is not available on BitmapImage. 

奇怪的是我的应用程序工作“很好”,因为帧正确插入输出文件中。

我已经读过这个 ,所以问题似乎是WPF框架中的一个错误。

这是设计的。 第一次机会exception通知并不意味着存在问题。 Create()方法中的相关代码如下所示:

 try { metadata = source.Metadata as BitmapMetadata; } catch (NotSupportedException) { } 

换句话说,exception是预期的,只是被吞噬。 这当然非常烦人,因为当您在Debug + Exception对话框中选中了Thrown复选框时,这些exception会使调试器停止。 但它肯定不是一个错误,这是故意这样编写的。 有时,抛出exception并吞下它而不是编写阻止exception的代码会便宜很多。 特别是当避免exception变得不切实际时,由于存在许多不同类型的位图类型,因此具有位图的情况。 其中一些不支持元数据。 无论在框架代码中何处完成,几乎总是要使代码更快 。 速度也是代码的一个重要方面。

function,而不是错误。 取消选中Thrown复选框以避免看到这些exception。

我希望我的回答可以帮到你,

我使用相同的代码,但是当我们使用BitmapFrame.Create(source)时,BitmapFrame.cs(在PresetationCore.dll上)会出现exception。

所以,我只是在其中使用其他创建函数,这是BitmpaFrame.Create的内部函数,

 BitmapFrame.cs public static BitmapFrame Create( BitmapSource source, BitmapSource thumbnail, BitmapMetadata metadata, ReadOnlyCollection colorContexts ) 

我们可以得到相同的结果BitmapFrame.Create(source, null, null, null).

  • 在你的情况下, enc.Frames.Add(BitmapImage.Create(bitmap, null, null, null));

谢谢。

使用.NET Framework 4.5运行时,我不得不更改Microsoft SDK WPF Photo Viewer示例中的类似行

  _image = BitmapFrame.Create(_source); 

  _image = BitmapFrame.Create(_source, BitmapCreateOptions.None, BitmapCacheOption.None); 

避免ConfigurationErrorsException。 事情似乎在引擎盖下漂流……