我想在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