无法从内存中正确加载位图

时间:2013-10-15 08:44:40

标签: c++ windows winapi bitmap

简介问题:
我获得了 zip存档,其中放置了 bmp格式的文件集。
我不想从该存档加载位图(创建系统对象)并将其 HBITMAP传递给客户端方法,该方法将在屏幕上显示。

我尝试了两种方法来解决我的任务:
1)使用临时文件(这种方法运行正常,但我认为效率低 - 因为需要对文件创建进行额外操作,并要求用户拥有一些允许他的权限创建文件)

hBitmap = (HBITMAP)LoadImage(NULL, fullpath.c_str(), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_DEFAULTCOLOR | LR_CREATEDIBSECTION );

2)将所需文件解压缩到内存并使用内存缓冲区创建位图 (我的解决方案基于来自SO和其他来源的类似问题的信息)

BITMAPFILEHEADER* bmfh = (BITMAPFILEHEADER*)ibuf;
BITMAPINFOHEADER* bmih = (BITMAPINFOHEADER*)(ibuf + sizeof(BITMAPFILEHEADER));
BITMAPINFO* bmi = (BITMAPINFO*)bmih;
void* pBMPdata = (void*)(ibuf + bmfh->bfOffBits);
hBitmap = CreateDIBitmap(NULL, bmih, CBM_INIT, pBMPdata, bmi, DIB_RGB_COLORS);

我需要第二方面的帮助。 当从第二种方法获得的HBITMAP加载图像时 - 显示黑色方块/

更新
我尝试了第三种方法:

BITMAPFILEHEADER* pBmfh = (BITMAPFILEHEADER*)ibuf;
BITMAPINFOHEADER* pBmih = (BITMAPINFOHEADER*)(ibuf + sizeof(BITMAPFILEHEADER));
BITMAPINFO* pBmi = (BITMAPINFO*)pBmih;
void* pBMPdata = (void*)(ibuf + pBmfh->bfOffBits);
void* pToFill = 0;
hBitmap = CreateDIBSection(NULL, pBmi, DIB_RGB_COLORS, &pToFill, NULL, NULL);

结果:是黑色方块,其中包含我要加载的图片的尺寸。

任何可能有用的想法都会受到赞赏!

1 个答案:

答案 0 :(得分:0)

对于其他人可能会遇到此问题(黑色方块,其中包含您要加载的图片的尺寸)可能会有所帮助。

第三种方法有效。

BITMAPFILEHEADER* pBmfh = (BITMAPFILEHEADER*)ibuf;
BITMAPINFOHEADER* pBmih = (BITMAPINFOHEADER*)(ibuf + sizeof(BITMAPFILEHEADER));
BITMAPINFO* pBmi = (BITMAPINFO*)pBmih;
void* pBMPdata = (void*)(ibuf + pBmfh->bfOffBits);
void* pToFill = 0;
hBitmap = CreateDIBSection(NULL, pBmi, DIB_RGB_COLORS, &pToFill, NULL, NULL);

memcpy(pToFill, pBMPdata, pBmfh->bfSize - pBmfh->bfOffBits); // this line should be added!!

我的错误是,我试图将指针传递给指向数据位的指针,而不是它 我应该在invokage copy databits到void 之后(这是pToFill)。**