2016-11-11 45 views
0

我正在使用Direct2D呈現目標,我有一個ID2D1Bitmap類型的對象。我需要在WPF窗口中顯示此位圖,並且我正在考慮將此位圖存放到Image控件中。爲了做到這一點,一個解決方案可能是將ID2D1Bitmap對象轉換爲System::Windows::Media::ImageSource對象,或者將位圖保存到可以隨後加載的文件中。如何將ID2D1Bitmap轉換爲ImageSource

我試圖尋找不同的方法,但沒有任何結果,因爲Direct2D API不提供任何解決方案AFAIK。

有沒有辦法做到這一點?

+0

也許這可以幫助你。 [轉換位圖爲ImageSource](http://stackoverflow.com/questions/26260654/wpf-converting-bitmap-to-imagesource) – MSL

+0

你見過這個:https://github.com/Microsoft/WPFDXInterop,你呢有我們可以玩的示例代碼? –

+0

你爲什麼不回答試圖幫助的人? –

回答

0

我發現WPF和UWP應用程序的最佳解決方案是SharpDX。請參閱SharpDX website

我曾嘗試過使用D2DWrappers(see the Microsoft site),但在我的UWP開發中,我發現SharpDX代碼更易於使用。我認爲WPF也是一樣,因爲它也是C#代碼。

0

Direct2D位圖是硬件設備相關資源,通常不易從系統的CPU端訪問。因此,到達ID2D1Bitmap的像素是困難的,但它的設計既非旨在以這種方式使用。從Direct2D位圖獲取原始字節的任何機制通常都是通過創建一個WIC位圖來訪問字節流來實現的。這樣你就可以把它寫入一個文件甚至一個字節數組中,並使用一些互操作來在C#中訪問它。如果你想把它寫入一個文件並在WPF中讀取,這個機制就可以工作。如果您在處理過程中的某個時間在IWICBitmapSource對象中擁有位圖數據,並且您可以緩存該對象,則該作業將更容易。 將System.Drawing.Bitmap轉換爲System.Windows.Media.ImageSource的答案在這裏:Converting Bitmap to ImageSource(感謝@MSL誰在評論中指出了上述答案)。

在這一點上,你使用它的方式有點不清楚,關於預期用途或短樣本的更多信息會對此有所幫助。

編輯1: 看看這個SO QN:Save ID2D1Bitmap to file和版本的代碼,節省了ID2D1Bitmap到一個文件中的註釋。它基本上轉換爲IWICBitmap並將其寫入文件。在這一步,由於IWICBitmap繼承自IWICBitmapSource,如果您願意,您甚至可以使用CopyPixels()方法將位圖數據轉儲到字節數組中。

現在,如果你用它保存到文件,得到一個System.Drawing.Bitmap的做法會是這麼簡單:

bitmap = new Bitmap("<YOUR_BITMAP_FILENAME>") 

而且你可以將其轉換爲BitmapImage的用在WPF爲:

using(MemoryStream memstream = new MemoryStream()) 
{ 
    bitmap.Save(memstream, ImageFormat.Bmp); 
    memstream.Position = 0; 
    BitmapImage bitmapImage = new BitmapImage(); 
    bitmapImage.BeginInit(); 
    bitmapImage.StreamSource = memstream; 
    bitmapImage.CacheOption = BitmapCacheOption.OnLoad; 
    bitmapImage.EndInit(); 
} 
+0

如何從ID2D1Bitmap源創建WIC位圖以訪問其字節流?此外,解釋如何從WIC位圖源獲取Drawing.Bitmap將會很有用。 – Nick

+0

我看到了你的編輯,但是當我執行代碼時,我得到一個D2DERR_WRONG_RESOURCE_DOMAIN錯誤(當我繪製位圖時)到wic渲染目標中。 – Nick

+0

嘗試使用rtProps.type = D2D1_RENDER_TARGET_TYPE_SOFTWARE; rtProps.usage = D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE; – jester

相關問題