BitmapFrame.Create 出现异常(WPF 框架中的错误?)

问题描述 投票:0回答:4

我实现了一个 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
时,我收到此异常:

enter image description here

英语的例外应该是:

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

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

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

c# .net exception try-catch
4个回答
24
投票

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

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

换句话说,异常是预料之中的,并且只是被吞掉了。这当然非常烦人,因为当您在“调试 + 异常”对话框中选中“抛出”复选框时,这些异常 do 会使调试器停止。但这肯定不是一个错误,这是故意这样写的。有时,直接引发异常并吞掉它比编写阻止异常的代码要便宜得多。特别是当避免异常变得不切实际时,例如位图的情况,因为有许多不同类型的位图类型。其中一些不支持元数据。无论在框架代码中的何处完成此操作,几乎总是为了使代码更快。速度也是代码的一个重要方面。

功能,而不是错误。取消选中“抛出”复选框以避免看到这些异常。


15
投票

希望我的回答对你有帮助。

我使用了相同的代码,但是当我们使用

BitmapFrame.Create(source)
时,PresetationCore.dll 抛出异常。

所以,我正在使用 BitmapFrame.Create 函数的另一个重载:

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));


0
投票

使用 .NET Framework 4.5 运行,我必须将 Microsoft SDK WPF 照片查看器示例中的类似行更改为

  _image = BitmapFrame.Create(_source);

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

避免 ConfigurationErrorsException。事情似乎在幕后发生……


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.