2010-05-22 77 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