繁体   English   中英

无法从内存正确加载位图

[英]Can't properly load bitmap from the memory

问题简介
我得到了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);

结果:是黑色正方形,具有我要加载的图片的尺寸。

任何有帮助的想法都将受到赞赏!

这可能对其他人有帮助(可能会遇到此问题)( 黑色正方形具有您要加载的图像的尺寸 )。

第3种方法有效。

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!!

我的错误是,我尝试将指针传递给指向数据位的指针,而不是在将数据位复制到void (即pToFill) 之后,应该将其传递给 。**

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM