2013-06-05 30 views
8

Tôi đã triển khai ứng dụng C# để truy cập khung RGB ở tốc độ khung hình 30 khung hình/giây.Ngoại lệ trên BitmapFrame.Create (lỗi trong khuôn khổ WPF?)

Sự kiện khung đến nơi được quản lý với mã này:

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

với điều kiện if tôi quản lý chỉ có một trong hai khung.

Khi mã của tôi gọi BitmapImage2Bitmap tôi có được ngoại lệ này:

enter image description here

Trường hợp ngoại lệ bằng tiếng Anh nên là:

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

Điều lạ là ứng dụng của tôi hoạt động "tốt" vì khung được chèn chính xác vào tệp đầu ra.

Tôi đã đọc this, do đó, vấn đề có vẻ như là lỗi trong khuôn khổ WPF.

Trả lời

15

Đây là theo thiết kế. Thông báo ngoại lệ đầu tiên có cơ hội không có nghĩa là có sự cố. Các mã có liên quan bên trong phương pháp Tạo() trông như thế này:

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

Nói cách khác, ngoại trừ được mong đợi và chỉ đơn giản là nuốt. Điều này chắc chắn rất khó chịu vì những ngoại lệ này làm làm cho trình gỡ rối dừng lại khi bạn đã chọn hộp kiểm Đã bỏ qua trong hộp thoại Gỡ lỗi + Ngoại lệ. Nhưng nó chắc chắn không phải là một lỗi, điều này được cố tình viết theo cách này. Đôi khi nó rẻ hơn rất nhiều chỉ để cho một ngoại lệ được ném và nuốt nó thay vì viết mã ngăn chặn ngoại lệ. Đặc biệt là khi nó không thực tế để tránh ngoại lệ, trường hợp với bitmap vì có rất nhiều loại bitmap khác nhau. Một số trong số đó không hỗ trợ siêu dữ liệu. Bất cứ nơi nào điều này được thực hiện bên trong mã khung, hầu như luôn luôn được thực hiện để làm cho mã số nhanh hơn. Tốc độ cũng là một khía cạnh quan trọng của mã.

Tính năng, không phải lỗi. Bỏ chọn hộp kiểm Thrown để tránh nhìn thấy những ngoại lệ này.

+0

Cảm ơn bạn @Hans. Nhưng tôi có một vấn đề: ứng dụng của tôi chỉ chạy nếu biên dịch trong chế độ gỡ lỗi, chế độ phát hành gây ra sự cố, vì vậy ngoại lệ mà tôi nghi ngờ có thể là nguyên nhân của sự cố – GVillani82

+0

Không, bạn đang tìm góc sai cho vấn đề đó. –

+0

Ok, cảm ơn bạn @Hans – GVillani82

7

Tôi hy vọng câu trả lời của tôi giúp đỡ bạn,

tôi đã sử dụng cùng một mã, nhưng BitmapFrame.cs (tại PresetationCore.dll) xảy ra ngoại lệ khi chúng ta đang sử dụng BitmapFrame.Create (nguồn).

Vì vậy, tôi chỉ dùng khác tạo ra chức năng dưới đây một, đó là chức năng bên trong của BitmpaFrame.Create,

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

chúng tôi có thể nhận được kết quả tương tự BitmapFrame.Create(source, null, null, null).

  • trong trường hợp của bạn, enc.Frames.Add(BitmapImage.Create(bitmap, null, null, null));

cảm ơn.

0

Chạy bằng .NET Framework 4.5, tôi đã phải thay đổi dòng tương tự trong mẫu Microsoft SDK WPF Photo Viewer từ

_image = BitmapFrame.Create(_source); 

để

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

để tránh ConfigurationErrorsException. Mọi thứ dường như đang trôi dạt dưới mui xe ...

Các vấn đề liên quan