2013-10-15 60 views
0

簡介加載位圖的問題:
我得到了zip壓縮包,其中一組在bmp格式文件放置。
我不想從檔案加載位圖(創建系統對象),並將其HBITMAP傳遞給客戶端方法,它將顯示在屏幕上。不能正確地從內存

我試着2點的方式來解決我的任務:
1)使用臨時文件(此方法能正常工作,但我認爲這是低效 - 如需要在文件創建額外的行動,並要求用戶posses一些特權,讓他創建文件)

hBitmap = (HBITMAP)LoadImage(NULL, fullpath.c_str(), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_DEFAULTCOLOR | LR_CREATEDIBSECTION); 

2)解壓所需的文件到內存和使用的內存緩衝區的位圖創建 (我的解決方案是基於日信息在SO和其他來源Ë類似的問題)

BITMAPFILEHEADER* bmfh = (BITMAPFILEHEADER*)ibuf; 
BITMAPINFOHEADER* bmih = (BITMAPINFOHEADER*)(ibuf + sizeof(BITMAPFILEHEADER)); 
BITMAPINFO* bmi = (BITMAPINFO*)bmih; 
void* pBMPdata = (void*)(ibuf + bmfh->bfOffBits); 
hBitmap = CreateDIBitmap(NULL, bmih, CBM_INIT, pBMPdata, bmi, DIB_RGB_COLORS); 

我需要在2擋的方式幫助。 當圖像被從在第二方法獲得的HBITMAP加載 - 顯示黑色正方形/

UPDATE:
我試圖3-RD方法:

BITMAPFILEHEADER* pBmfh = (BITMAPFILEHEADER*)ibuf; 
BITMAPINFOHEADER* pBmih = (BITMAPINFOHEADER*)(ibuf + sizeof(BITMAPFILEHEADER)); 
BITMAPINFO* pBmi = (BITMAPINFO*)pBmih; 
void* pBMPdata = (void*)(ibuf + pBmfh->bfOffBits); 
void* pToFill = 0; 
hBitmap = CreateDIBSection(NULL, pBmi, DIB_RGB_COLORS, &pToFill, NULL, NULL); 

結果:是黑色正方形,它具有我嘗試加載的圖片的尺寸。

任何想法,可能會有所幫助,表示讚賞!

+0

您是否嘗試過傳遞有效的設備上下文句柄? – dyp

+0

@DyP沒有我沒有。 –

+0

也許你應該,[文檔](http://msdn.microsoft.com/en-us/library/windows/desktop/dd183491%28v=vs.85%29.aspx)不建議你可以通過無效/ NULL。 – dyp

回答

0

這可能對其他人有幫助,可能會遇到此問題(黑色方塊,其中包含您正嘗試加載的圖像的尺寸)。

第三方法有效。

BITMAPFILEHEADER* pBmfh = (BITMAPFILEHEADER*)ibuf; 
BITMAPINFOHEADER* pBmih = (BITMAPINFOHEADER*)(ibuf + sizeof(BITMAPFILEHEADER)); 
BITMAPINFO* pBmi = (BITMAPINFO*)pBmih; 
void* pBMPdata = (void*)(ibuf + pBmfh->bfOffBits); 
void* pToFill = 0; 
hBitmap = CreateDIBSection(NULL, pBmi, DIB_RGB_COLORS, &pToFill, NULL, NULL); 

memcpy(pToFill, pBMPdata, pBmfh->bfSize - pBmfh->bfOffBits); // this line should be added!! 

我的錯誤是,我試圖通過指針指向的數據位,而不是它 我應該invokage拷貝數據位爲無效(這是pToFill)之後。**