C++ Win32 C/C++;从内存缓冲区加载图像

C++ Win32 C/C++;从内存缓冲区加载图像,c++,windows,winapi,bitmap,C++,Windows,Winapi,Bitmap,我想在Win32应用程序上加载图像(.bmp)文件,但不想使用Windows API中的标准LoadBitmap/LoadImage:我想从内存中已有的缓冲区加载。我可以轻松地直接从文件加载位图并在屏幕上打印,但这个问题让我陷入困境 我要找的是这样一个函数: HBITMAP LoadBitmapFromBuffer(char* buffer, int width, int height); 不可以,但您可以在内存中创建一个与当前位图大小相同的新位图,并将内存结构写入其中 您正在寻找函数。将lp

我想在Win32应用程序上加载图像(.bmp)文件,但不想使用Windows API中的标准LoadBitmap/LoadImage:我想从内存中已有的缓冲区加载。我可以轻松地直接从文件加载位图并在屏幕上打印,但这个问题让我陷入困境

我要找的是这样一个函数:

HBITMAP LoadBitmapFromBuffer(char* buffer, int width, int height);
不可以,但您可以在内存中创建一个与当前位图大小相同的新位图,并将内存结构写入其中

您正在寻找函数。将lpvBits设置为您的数据。

尝试:


CreateDIBSection
的使用可能有点复杂,但它可以做的一件事是创建一个与设备无关的位图,并为位图位提供一个指向缓冲区的指针。当然,您已经有一个满是位图位的缓冲区,但至少可以复制数据


推测一下:
CreateDIBSection
也可以从文件对象创建位图,可能有一种方法可以让Windows给你一个表示内存块的文件对象,这可能会欺骗
CreateDIBSection
给你一个直接从缓冲区构建的位图。

不过,我找到了我的解决方案!以下是初始化代码:

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);

CreateDIBSection是要使用的正确API。它使用的内存必须是一种特殊类型的内核内存(因为图形设备驱动程序需要访问它)——这可以由一个文件段(作为内核结构本身)来满足或者让CealdidiBeTebe分配内存。你好,我是java开发者,但是在我的应用程序中,我还需要从C++加载图像,我不知道如何去做。我在互联网上研究了这么长时间,但还是得不到它。所以请你提供你的全部代码,我非常需要它。请
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);