2013-06-05 3 views
8

Ich habe eine C# -Anwendung implementiert, die Frame-RGB mit einer Framerate von 30 Bildern pro Sekunde empfängt.Ausnahme bei BitmapFrame.Create (Fehler im WPF-Framework?)

arrive Die Veranstaltung des Rahmens wird mit diesem Code verwaltet:

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

mit dem if-Bedingung schaffe ich nur eine von zwei Frames.

Wenn mein Coderuf BitmapImage2Bitmap ich diese Ausnahme erhalten:

enter image description here

Die Ausnahme in Englisch sollte sein:

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

Das Merkwürdige ist, dass meine Bewerbung „gut“ funktioniert, weil die Frames werden korrekt in die Ausgabedatei eingefügt.

Ich habe this gelesen, so scheint das Problem ein Bug in WPF-Framework.

Antwort

15

Dies ist von Entwurf. Eine Ausnahmebenachrichtigung der ersten Chance bedeutet nicht, dass ein Problem vorliegt. Der entsprechende Code innerhalb der Methode Create() sieht wie folgt aus:

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

Mit anderen Worten, wird die Ausnahme erwartet und einfach geschluckt. Das ist sicherlich sehr ärgerlich, da diese Ausnahmen tun machen den Debugger zu stoppen, wenn Sie das Kontrollkästchen ausgelöst im Debug + Exception-Dialogfeld aktiviert haben. Aber es ist sicherlich kein Fehler, das wurde absichtlich so geschrieben. Manchmal ist es viel billiger, einfach eine Ausnahme auszulösen und sie zu verschlucken, anstatt den Code zu schreiben, der die Ausnahme verhindert. Besonders wenn es unpraktisch wird, die Ausnahme zu vermeiden, der Fall mit Bitmaps, da es so viele verschiedene Arten von Bitmap-Typen gibt. Einige davon unterstützen keine Metadaten. Wo immer dies innerhalb des Framework-Codes geschieht, wird fast immer der Code schneller gemacht. Geschwindigkeit ist auch ein wichtiger Aspekt des Codes.

Funktion, kein Fehler. Deaktivieren Sie das Kontrollkästchen "Geworfen", damit diese Ausnahmen nicht angezeigt werden.

+0

Danke @Hans. Aber ich habe ein Problem: meine Anwendung läuft nur, wenn im Debug-Modus kompiliert, Release-Modus verursacht Absturz, so dass die Ausnahme, die ich vermutete, die Ursache des Problems sein könnte – GVillani82

+0

Nein, Sie suchen in der falschen Ecke für dieses Problem. –

+0

Ok, danke @Hans – GVillani82

7

Ich hoffe, meine Antwort hilft Ihnen,

ich denselben Code hatte verwenden, aber BitmapFrame.cs (bei PresetationCore.dll) auftreten Ausnahme, wenn wir BitmapFrame.Create verwenden (Quelle).

Also, ich Mit anderen nur unter einer Funktion erstellen, die innere Funktion von BitmpaFrame.Create ist,

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

wir gleiche Ergebnis BitmapFrame.Create(source, null, null, null).

  • in Ihrem Fall bekommen, enc.Frames.Add(BitmapImage.Create(bitmap, null, null, null));

danke.

0

Ausführen mit .NET Framework 4.5 hatte ich von

_image = BitmapFrame.Create(_source); 

zu

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

zu vermeiden, dass die Configuration der ähnliche Zeile in der Microsoft SDK WPF Photo Viewer Probe zu ändern. Dinge scheinen unter der Haube zu treiben ...

Verwandte Themen