2012-09-11 55 views
3

我正在與Winforms中的Emgu Cv一起使用Kinect進行人臉識別。現在,我想轉移到WPF。但是,EmguCv庫僅支持位圖類。WPF中的位圖類

我可以在WPF中使用Bitmap類(用於Winforms)嗎?如果沒有,是否有其他方法在WPF中使用Emgu cv和kinect?

謝謝。

回答

9

System.Drawing.Bitmap不能直接用作WPF的圖像源,因此您必須將其轉換爲System.Windows.Media.Imaging.BitmapSource

最好的辦法是使用Imaging.CreateBitmapSourceFromHBitmap

您可以使用擴展方法:

[DllImport("gdi32")] 
private static extern int DeleteObject(IntPtr o); 

public static BitmapSource ToBitmapSource(this System.Drawing.Bitmap source) 
{ 
    if (source == null) 
    { 
     throw new ArgumentNullException("source"); 
    } 

    IntPtr ip = source.GetHbitmap(); 
    try 
    { 
     return System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(ip, 
      IntPtr.Zero, Int32Rect.Empty, 
      System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions()); 
    } 
    finally 
    { 
     DeleteObject(ip); 
    } 
} 

請注意,您必須調用DeleteObject,因爲Bitmap.GetHbitmap()泄漏一個GDI句柄(見this答案)。

一旦您有BitmapSource,您可以使用Image控件和設置Source屬性來顯示它。

您可以在這篇文章中瞭解更多關於WPF成像:Imaging Overview

+0

你好,我應該添加到System.Drawing中的參考? –

+0

@RafikHaceb是的,確保你的項目有一個對'System.Drawing.dll'和'PresentationCore.dll'的引用。順便說一下,如果您發現有幫助的答案,您可以將其標記爲「已接受」。請參閱[如何接受答案?](http://meta.stackexchange.com/a/5235/164263)。 –