11

我实现了一个 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,我得到了这个异常:

在此处输入图像描述

英文的例外应该是:

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

奇怪的是,我的应用程序“运行良好”,因为帧已正确插入到输出文件中。

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

4

4 回答 4

20

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

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

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

功能,而不是错误。取消勾选 Throw 复选框以避免看到这些异常。

于 2013-06-10T15:28:55.500 回答
13

希望我的回答能帮到你

我使用了相同的代码,但是当我们使用 BitmapFrame.Create(source) 时,BitmapFrame.cs(在 PresetationCore.dll 处)发生异常。

所以,我只是使用下面的其他创建函数,即 BitmpaFrame.Create 的内部函数,

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

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

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

谢谢。

于 2014-01-08T08:14:44.380 回答
0

使用 .NET Framework 4.5 运行,我不得不将 Microsoft SDK WPF 照片查看器示例中的类似行从

  _image = BitmapFrame.Create(_source);

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

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

于 2014-11-04T21:23:21.113 回答
0

我最近在处理作为资源的项目中包含的图像时遇到了这个问题(文件属性中的 BuildType=Resource)。这似乎是一些与构建相关的问题,它使资源损坏并在 WPF 加载它们时导致看似随机的问题。简单地执行清理/重建会使错误消失。虽然在添加新图像时它们可能会重新出现,但同样的修复显然适用。

于 2020-08-18T09:52:20.353 回答