2013-06-05 19 views
8

Ho implementato un'applicazione C# che recupera il frame RGB al framerate di 30fps.Eccezione su BitmapFrame.Create (bug nel framework WPF?)

L'evento di telaio arrivano è gestito con questo codice:

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

con la condizione se riesco solo uno dei due telai.

Quando il mio codice di chiamata BitmapImage2Bitmap ottengo questa eccezione:

enter image description here

L'eccezione in inglese dovrebbe essere:

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

La cosa strana è che la mia applicazione funziona "bene", perché il i frame sono correttamente inseriti nel file di output.

Ho letto this, quindi il problema sembra un bug nel framework WPF.

risposta

15

Questo è di progettazione. Una notifica di eccezione di prima possibilità non significa che ci sia un problema. Il relativo codice all'interno del metodo Create() appare così:

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

In altre parole, l'eccezione è previsto e semplicemente ingoiato. Il che è certamente molto fastidioso poiché queste eccezioni do fanno arrestare il debugger quando si seleziona la casella di controllo Gettato nella finestra di dialogo Debug + Exception. Ma certamente non è un bug, questo è stato intenzionalmente scritto in questo modo. A volte è molto più economico lasciare che venga lanciata un'eccezione e inghiottirla invece di scrivere il codice che impedisce l'eccezione. Soprattutto quando non è pratico evitare l'eccezione, il caso con le bitmap poiché ci sono così tanti diversi tipi di tipi di bitmap. Alcuni dei quali non supportano i metadati. Ovunque ciò avvenga all'interno del codice framework, è quasi sempre fatto per rendere il codice più veloce. La velocità è anche un aspetto importante del codice.

Caratteristica, non un bug. Deseleziona la casella di controllo Gettato per evitare di vedere queste eccezioni.

+0

Grazie @Hans. Ma ho un problema: la mia applicazione viene eseguita solo se compilata in modalità di debug, la modalità di rilascio causa l'arresto anomalo, quindi l'eccezione che ho sospettato potrebbe essere la causa del problema – GVillani82

+0

No, stai cercando nell'angolo sbagliato per quel problema. –

+0

Ok, grazie @Hans – GVillani82

7

Spero che la mia risposta è stata,

io avessi utilizzando lo stesso codice, ma BitmapFrame.cs (a PresetationCore.dll) si verificano delle eccezioni quando stiamo usando BitmapFrame.Create (fonte).

Allora, ho appena Utilizzando altra creare funzione qui sotto uno, che è la funzione interna di BitmpaFrame.Create,

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

possiamo ottenere lo stesso risultato BitmapFrame.Create(source, null, null, null).

  • nel tuo caso, enc.Frames.Add(BitmapImage.Create(bitmap, null, null, null));

grazie.

0

In esecuzione con .NET Framework 4.5, ho dovuto cambiare la riga simile nel campione Microsoft SDK WPF Photo Viewer da

_image = BitmapFrame.Create(_source); 

a

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

per evitare il ConfigurationErrorsException. Le cose sembrano andare alla deriva sotto il cofano ...

Problemi correlati