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

Posted

技术标签:

【中文标题】无法从内存中正确加载位图【英文标题】:Can't properly load bitmap from the memory 【发布时间】:2013-10-15 08:44:40 【问题描述】:

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

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

感谢任何可能有帮助的想法!

【问题讨论】:

您是否尝试过传递有效的设备上下文句柄? 也许你应该这样做,documentation 并不建议你可以传递一个无效的 / NULL。 @DyP 我发现这是问题所在,与 DC 无关 相关:***.com/q/15127010/420683 @Jonathan Potter char *ibuf 【参考方案1】:

可能对其他人如何遇到此问题有帮助(黑色方块,其中包含您尝试加载的图像的尺寸)。

第三种方法有效。

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)。**

【讨论】:

以上是关于无法从内存中正确加载位图的主要内容,如果未能解决你的问题,请参考以下文章

从内存创建 Windows GDI 位图

无法加载多个位图 - WinAPI [重复]

Android:从图库加载的位图在 ImageView 中旋转

C#位图从像素中读取不正确的颜色

无法从资源加载位图

无法将 .fbx 从搅拌机正确加载到 Monogame