gpt4 book ai didi

c++ - 从内存缓冲区创建 HBITMAP

转载 作者:可可西里 更新时间:2023-11-01 15:22:10 25 4
gpt4 key购买 nike

我有一个应用程序可以从数据库中加载一些 blob 数据,这些数据可以表示各种位图和图标的 png 格式或原始二进制数据。这被存储在 std::vector<unsigned char>

我正在使用 CImageList 对象在 TreeView 、工具栏图像等中显示各种图像,但问题是从内存中的数据创建位图变得模糊,就像在执行以下操作时缺少像素一样:

std::vector<unsigned char> bits;
HBITMAP hbitmap = CreateBitmap(16, 16, 1, 32, bits.data());

为了暂时解决这个问题,我只是将 vector 中的 data() 写到一个临时文件中,然后使用 LoadImage 将其读回并从中创建 HBITMAP。这非常有效,但不可否认这是一个无耻的黑客行为,我希望应该是完全没有必要的。

我在网上四处寻找,但没有找到任何关于如何“正确”从内存创建 hbitmaps 的真正好的例子。我希望能够创建这些位图以添加到图像列表中,而无需任何文件 i/o 和有限数量的复制数据(如果可能的话)。

正在寻找执行此操作的最佳方法,显然 Windows 特定代码很好。

更新:

根据 jdv 的回答,我开始使用 CreateCompatibleBitmap、CreateDIBitmap,最后是 CreateDIBSection。所有这些最终都创建了可爱的黑色位图,而不是以前的模糊位图,所以我一定又做错了什么,我的猜测是因为这个位图创建是在一个没有屏幕 dc 概念的对象或使用 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 初始化 std::vector<unsigned char> 对象的简单方法?

最佳答案

我会使用 CreateCompatibleBitmap,然后调用 SetDIBits 用您的数据填充它。这些是我见过的有效函数,而且 SetDIBits 非常灵活,尽管很冗长。

在我使用 MFC 的那些年里,CreateBitmap 由于疑似性能问题而被避免。

关于c++ - 从内存缓冲区创建 HBITMAP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4598872/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com