问题简单介绍:
我拿到的是zip压缩包,里面放的是bmp格式的文件集。
我不想从该存档中加载位图(创建系统对象)并将其HBITMAP 传递给将其显示在屏幕上的客户端方法。
我尝试了 2 种方法来解决我的任务:
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);
结果:是黑色正方形,具有我要加载的图片的尺寸。
任何可能有帮助的想法表示赞赏!