繁体   English   中英

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

[英]Exception on BitmapFrame.Create (bug in WPF framework?)

我实现了一个 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 框架中的一个错误。

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

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

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

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

希望我的回答对你有帮助

我使用了相同的代码,但是当我们使用 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));

谢谢。

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

  _image = BitmapFrame.Create(_source);

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM