2017-08-01 30 views
1

根據這些文件,以LoadFromResource它指出:如何從資源PNG加載到的CImage

BITMAP資源

所以加載圖像,我有這個在我代碼:

rImage.LoadFromResource(AfxFindResourceHandle(), IDB_PNG1); 

不起作用。然後我意識到我正在使用PNG文件而不是BMP文件。我認爲這是找不到資源的原因。

我也嘗試過使用AfxGetInstanceHandle()。但是這也行不通。

因此,此刻我正在使用外部PNG文件。它工作正常。但有沒有任何方式來從資源中加載PNG到CImage

更新

提供給我的評論有幫助。

它導致我here。所以,如果我有這樣的方法:

IStream* CreateStreamOnResource(LPCTSTR lpName, LPCTSTR lpType) 
{ 
    IStream * ipStream = NULL; 

    HRSRC hrsrc = FindResource(NULL, lpName, lpType); 
    if (hrsrc == NULL) 
     goto Return; 

    DWORD dwResourceSize = SizeofResource(NULL, hrsrc); 
    HGLOBAL hglbImage = LoadResource(NULL, hrsrc); 
    if (hglbImage == NULL) 
     goto Return; 

    LPVOID pvSourceResourceData = LockResource(hglbImage); 
    if (pvSourceResourceData == NULL) 
     goto Return; 

    HGLOBAL hgblResourceData = GlobalAlloc(GMEM_MOVEABLE, dwResourceSize); 
    if (hgblResourceData == NULL) 
     goto Return; 

    LPVOID pvResourceData = GlobalLock(hgblResourceData); 

    if (pvResourceData == NULL) 
     goto FreeData; 

    CopyMemory(pvResourceData, pvSourceResourceData, dwResourceSize); 

    GlobalUnlock(hgblResourceData); 

    if (SUCCEEDED(CreateStreamOnHGlobal(hgblResourceData, TRUE, &ipStream))) 
     goto Return; 

FreeData: 
    GlobalFree(hgblResourceData); 

Return: 
    return ipStream; 
} 

,並調用它是這樣的:

rImage.Load(CreateStreamOnResource(MAKEINTRESOURCE(IDB_PNG1), _T("PNG"))); 

工作正常...謝謝你們。

更新:

根據提供的評論。現在好多了?我看不出有任何的泄漏:

IStream *pStream = CreateStreamOnResource(MAKEINTRESOURCE(uPNGResourceID), _T("PNG")); 
if (pStream != nullptr) 
{ 
    rImage.Load(pStream); 
    rImage.SetHasAlphaChannel(true); 
    pStream->Release(); 
} 

附註:我真的需要調用SetHasAlphaChannel如果這些都是我自己的嵌入式資源和我知道的是透明的32個資源?

+1

相關:[加載png資源到CBitMap](https://stackoverflow.com/questions/3005685/load-a-png-resource-into-a-cbitmap) – sergiol

+1

不。你有內存泄漏。你必須調用Release到IStream接口。或者您使用CComPtr 作爲返回值。 – xMRi

+0

正如我所說的使用CComPtr 會使它更容易...我假設你只需要將聲明更改爲CComPtr ipStream;當然還有返回值。比rImage。Load(CreateStreamOnResource(MAKEINTRESOURCE(IDB_PNG1),_T(「PNG」)));將是可能的。 – xMRi

回答

1
  1. AfxFindResource
  2. LoadResource
  3. 的GlobalAlloc
  4. CopyMemory的
  5. 了CreateStreamOnHGlobal
  6. 的CImage ::負載(的IStream * ...)

或者你自己寫的IStream implemenmtation從LoadResource獲取指針和大小。另外CSharedFile是一個選項。

+0

我用我的最終結果更新了我的問題。 –