我有一个应用程序可以从数据库中加载一些 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。所有这些最终都创建了可爱的黑色位图而不是以前的模糊位图,所以我一定又做错了,我的猜测是因为这个位图创建是在一个没有屏幕直流或窗口概念的对象中完成GetDC(NULL)
的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)
。有谁知道CBitmap
从 a 初始化对象的简单方法std::vector<unsigned char>
?