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

时间:2010-05-22 03:30:47

标签: c++ windows winapi bitmap

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

我正在寻找的功能是这样的:

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

4 个答案:

答案 0 :(得分:6)

没关系,我找到了解决办法!这是初始化代码:

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

答案 1 :(得分:4)

尝试CreateBitmap()

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

答案 2 :(得分:3)

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

推测一点:CreateDIBSection也可以从文件对象创建位图,并且可能有一种方法可以让Windows为您提供一个代表一块内存的文件对象,这可能会诱使CreateDIBSection给出你直接从你的缓冲区构建一个位图。

答案 3 :(得分:0)

不,但您可以在内存中创建一个与当前内存大小相当的新位图,并将内存结构写入其中。

您正在寻找CreateBitmap功能。将lpvBits设置为您的数据。