2010-05-22 74 views
5

我想在Win32應用程序中加載一個圖像(.bmp)文件,但我不想使用Windows API的標準LoadBitmap/LoadImage:我想從它加載一個已經在內存中的緩衝區。我可以直接從文件中直接加載位圖並將其打印在屏幕上,但是這個問題讓我陷入困境。Win32 C/C++從內存緩衝區加載映像

我正在尋找的是,是這樣的一個功能:

HBITMAP LoadBitmapFromBuffer(char* buffer, int width, int height); 

回答

5

沒關係,我找到了我的解決方案!以下是初始化代碼:

std::ifstream is; 
is.open("Image.bmp", std::ios::binary); 
is.seekg (0, std::ios::end); 
length = is.tellg(); 
is.seekg (0, std::ios::beg); 
pBuffer = new char [length]; 
is.read (pBuffer,length); 
is.close(); 

tagBITMAPFILEHEADER bfh = *(tagBITMAPFILEHEADER*)pBuffer; 
tagBITMAPINFOHEADER bih = *(tagBITMAPINFOHEADER*)(pBuffer+sizeof(tagBITMAPFILEHEADER)); 
RGBQUAD    rgb = *(RGBQUAD*)(pBuffer+sizeof(tagBITMAPFILEHEADER)+sizeof(tagBITMAPINFOHEADER)); 

BITMAPINFO bi; 
bi.bmiColors[0] = rgb; 
bi.bmiHeader = bih; 

char* pPixels = (pBuffer+bfh.bfOffBits); 

char* ppvBits; 

hBitmap = CreateDIBSection(NULL, &bi, DIB_RGB_COLORS, (void**) &ppvBits, NULL, 0); 
SetDIBits(NULL, hBitmap, 0, bih.biHeight, pPixels, &bi, DIB_RGB_COLORS); 

GetObject(hBitmap, sizeof(BITMAP), &cBitmap); 
+0

你好我是java開發人員,但在我的應用程序中,我也需要從C++加載圖像,我不知道該怎麼做。 我在互聯網上研究這麼久,但仍然不能得到它。 所以你會提供你的整個代碼,我需要它很糟糕。請 – Jony 2012-05-07 15:48:24

0

沒有,但你可以創建一個新的位圖當前的內存的大小,並寫出你的記憶結構上它。

您正在尋找CreateBitmap函數。將lpvBits設置爲您的數據。

3

嘗試CreateBitmap()

HBITMAP LoadBitmapFromBuffer(char *buffer, int width, int height) 
{ 
    return CreateBitmap(width, height, 1, 24, buffer); 
} 
3

CreateDIBSection可以稍微複雜的使用,但事情可以做一個是創建一個設備無關的位圖,給你一個指針到緩衝區的位圖位。當然,你已經有了一個充滿位圖位的緩衝區,但至少你可以複製數據。

投機位:CreateDIBSection還可以創建文件對象的位圖,大概有一個辦法讓Windows來給你代表一個內存塊的文件對象,這可能會誘使CreateDIBSection到讓你直接從內置的位圖你緩衝。

+0

CreateDIBSection是使用的正確API。它使用的內存必須是特定類型的內核內存(因爲圖形設備驅動程序需要訪問它) - 可以通過文件部分(作爲內核結構本身)或通過讓CreateDIBSection分配內存來滿足。 – 2010-05-22 07:25:18