【发布时间】:2011-06-03 16:30:55
【问题描述】:
我有一个应用程序可以从数据库中加载一些 blob 数据,这些数据可以表示各种位图和图标的 png 格式或原始二进制数据。这是存储在std::vector<unsigned char>
我正在使用CImageList 对象在树视图、工具栏图像等中显示各种图像,但问题是从内存中的数据创建位图变得模糊,就好像它在执行以下操作时缺少像素一样:
std::vector<unsigned char> bits;
HBITMAP hbitmap = CreateBitmap(16, 16, 1, 32, bits.data());
为了暂时解决这个问题,我只是将向量中的 data() 写入一个临时文件,然后使用 LoadImage 将其读回并从中创建 HBITMAP。这非常有效,但是这无疑是一种无耻的黑客行为,我希望完全没有必要。
我在网上四处查看,但没有找到任何关于如何“正确”从内存中创建 hbitmap 的非常好的示例。我希望能够创建这些位图以添加到图像列表中,而无需任何文件 i/o 并且尽可能地复制有限数量的数据。
寻找执行此操作的最佳方法,显然 Windows 特定代码很好。
更新:
根据 jdv 的回答,我开始使用 CreateCompatibleBitmap、CreateDIBitmap,最后是 CreateDIBSection。所有这些最终都创建了可爱的黑色位图,而不是以前的模糊位图,所以我一定又做错了,我的猜测是因为这个位图创建是在一个没有屏幕 dc 或使用 @ 的窗口概念的对象中完成的987654324@ 和 CreateCompatibleDC(NULL) 不好。示例代码:
BITMAPINFO bmi;
ZeroMemory(&bmi, sizeof(BITMAPINFO));
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biHeight = 16;
bmi.bmiHeader.biWidth = 16;
bmi.bmiHeader.biPlanes = 1;
HDC dc = CreateCompatibleDC(NULL);
HBITMAP hbitmap = CreateDIBSection(dc, &bmi, DIB_RGB_COLORS, (void**)blobData.GetMember<FILEDATAFIELD_DATA>().data(), NULL, 0);
我现在当然认为必须有一种更简单的方法来解决这个问题,也许完全避免 HBITMAP 并直接使用 CBitmap 类?当涉及到将图像添加到CImageList 时,无论如何我都在使用CBitmap::FromHandle(HBITMAP hbitmap, COLORREF mask)。有谁知道从std::vector<unsigned char> 初始化CBitmap 对象的简单方法?
【问题讨论】:
-
请不要将问题编辑为新含义,因为它会使答案无效。随意发布一个新问题并链接到旧问题。
-
抱歉,我只是后退了一步,意识到我进入 GDI 领域的唯一原因是因为我在添加到 CImageList 时使用了 FromHandle 方法......无论如何,MFC CBitmap 只是简单地包装了 GDI 调用,所以非常相似。
标签: c++ mfc bitmap gdi hbitmap