2009-04-26 57 views
3

我想從我的應用程序中的資源加載一個非BMP圖像(在我的情況下,PNG)到一個位圖/圖像實例。由於位圖構造函數只對位圖資源負載過重,所以我這樣做了:如何使用GDI +從資源加載圖像?

我在全局堆上分配內存,然後將資源數據複製到其中。然後,我爲該全局內存塊(使用CreateStreamOnHGlobal)創建一個IStream,並使用接受該流的Image/Bitmap構造函數。基本上它的工作原理,雖然我不確定這是最好的方式: 我注意到,如果我創建圖像後釋放內存塊,它不會被繪製(調用DrawImage不會產生任何東西)。這引發了兩個問題:

  1. 如何管理該內存塊的生存期?我懷疑它會在圖像被破壞時被釋放。

  2. Image/Bitmap類是否使用壓縮格式的png數據,並在每次調用DrawImage時將其轉換爲原始數據?看起來非常沒有效率。

任何消耗?

回答

0

將位圖轉換爲CachedBitmap然後擺脫內存。

+0

CachedBitmap的問題在於它不能從Image繼承,所以需要將其與「常規」位圖區別對待。 我已經設法解決內存使用壽命問題,fortunatlly圖像有一個虛擬的解構器,所以它很簡單。但是,我仍然不確定這是否正確。 – Meat 2009-04-27 14:09:11

2

當使用非位圖資源時,我的代碼基於codeproject

IStream* pStream = NULL; 
::CreateStreamOnHGlobal(m_hBuffer, FALSE, &pStream) 
m_pBitmap = Gdiplus::Bitmap::FromStream(pStream); 
pStream->Release(); 

望着那代碼一旦你從流做一個創建位圖,那麼你就流呼籲Release()對流刪除您的引用計數,從而追平了流的位圖的壽命。

然後,您可以使用任何您希望管理該指針的機制。