我想在Win32應用程序中加載一個圖像(.bmp)文件,但我不想使用Windows API的標準LoadBitmap/LoadImage:我想從它加載一個已經在內存中的緩衝區。我可以直接從文件中直接加載位圖並將其打印在屏幕上,但是這個問題讓我陷入困境。Win32 C/C++從內存緩衝區加載映像
我正在尋找的是,是這樣的一個功能:
HBITMAP LoadBitmapFromBuffer(char* buffer, int width, int height);
我想在Win32應用程序中加載一個圖像(.bmp)文件,但我不想使用Windows API的標準LoadBitmap/LoadImage:我想從它加載一個已經在內存中的緩衝區。我可以直接從文件中直接加載位圖並將其打印在屏幕上,但是這個問題讓我陷入困境。Win32 C/C++從內存緩衝區加載映像
我正在尋找的是,是這樣的一個功能:
HBITMAP LoadBitmapFromBuffer(char* buffer, int width, int height);
沒關係,我找到了我的解決方案!以下是初始化代碼:
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);
沒有,但你可以創建一個新的位圖當前的內存的大小,並寫出你的記憶結構上它。
您正在尋找CreateBitmap函數。將lpvBits設置爲您的數據。
HBITMAP LoadBitmapFromBuffer(char *buffer, int width, int height)
{
return CreateBitmap(width, height, 1, 24, buffer);
}
CreateDIBSection
可以稍微複雜的使用,但事情可以做一個是創建一個設備無關的位圖,給你一個指針到緩衝區的位圖位。當然,你已經有了一個充滿位圖位的緩衝區,但至少你可以複製數據。
投機位:CreateDIBSection
還可以創建文件對象的位圖,大概有一個辦法讓Windows來給你代表一個內存塊的文件對象,這可能會誘使CreateDIBSection
到讓你直接從內置的位圖你緩衝。
CreateDIBSection是使用的正確API。它使用的內存必須是特定類型的內核內存(因爲圖形設備驅動程序需要訪問它) - 可以通過文件部分(作爲內核結構本身)或通過讓CreateDIBSection分配內存來滿足。 – 2010-05-22 07:25:18
你好我是java開發人員,但在我的應用程序中,我也需要從C++加載圖像,我不知道該怎麼做。 我在互聯網上研究這麼久,但仍然不能得到它。 所以你會提供你的整個代碼,我需要它很糟糕。請 – Jony 2012-05-07 15:48:24