2013-06-05 23 views
8

フレームRGBを30fpsで受信するC#アプリケーションを実装しました。条件は私が唯一の2つのフレームを管理する場合とBitmapFrame.Createの例外(WPFフレームワークのバグ)

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

フレームのイベントは、このコードで管理されて到着します。

私のコードの呼び出し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フレームワークのバグのようです。

答えて

15

これは仕様です。最初の例外通知は、問題があることを意味するものではありません。 create()メソッド内の関連するコードは次のようになります。

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

言い換えれば、例外は期待して簡単に飲み込まれます。 do Debug + ExceptionダイアログでThrownチェックボックスをオンにしたときにデバッガを停止させることができます。しかし、それは確かにバグではなく、これは意図的にこのように書かれています。時には例外を投げ捨て、例外を防ぐコードを書くのではなく、それを飲み込むほうがはるかに安いです。特に例外を避けるためには実用的ではない場合、ビットマップの種類は非常に多くの種類があるので、ビットマップの場合。メタデータをサポートしていないものもあります。これがフレームワークコードの中で行われるところでは、コードをより速くにすることがほとんど常に行われています。速度もコードの重要な側面です。

機能、バグではありません。これらの例外が表示されないようにするには、Thrownチェックボックスをオフにします。

+0

ありがとうございます。しかし、私は問題があります:アプリケーションがデバッグモードでコンパイルされた場合にのみ実行され、リリースモードでクラッシュが発生するため、問題の原因と思われる例外が発生します。 – GVillani82

+0

いいえ、問題のコーナーが間違っています。 –

+0

ありがとう、@Hansありがとう – GVillani82

7

私は、あなたは私が同じコードを使用していたが、我々はBitmapFrame.Create(ソース)を使用しているとき(PresetationCore.dllで)BitmapFrame.csは例外を発生

、私の答えの助けを願っています。だから、

、私はちょうど enc.Frames.Add(BitmapImage.Create(bitmap, null, null, null));、我々は同じ結果にあなたのケースでBitmapFrame.Create(source, null, null, null).

  • を得ることができ、BitmpaFrame.Createの内部関数である1、以下の機能を他の作成

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

    を使用して

ありがとうございます。

0

.NET Framework 4で実行しています。5は、私がConfigurationErrorsExceptionを避けるために

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

_image = BitmapFrame.Create(_source); 

からMicrosoft SDK WPFフォトビューアのサンプルで同様の行を変更しなければなりませんでした。フードの下で物が漂っているようです...

関連する問題