系统相关
首页 > 系统相关> > c – 从内存缓冲区创建HBITMAP

c – 从内存缓冲区创建HBITMAP

作者:互联网

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

我正在使用CImageList对象在树视图,工具栏图像等中显示各种图像,但问题是从内存中的数据创建位图模糊,好像它在执行如下操作时缺少像素:

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

为了解决这个问题,我现在只需将向量中的data()写入临时文件,然后使用LoadImage将其读回并从中创建HBITMAP.这完全有效,但无可否认这是一个无耻的黑客,我希望完全没必要.

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

寻找最好的方法来做到这一点,显然Windows特定的代码是好的.

更新:

根据jdv的回答,我开始使用CreateCompatibleBitmap,CreateDIBitmap,最后是CreateDIBSection.所有这些最终创建了可爱的黑色位图,而不是之前的模糊位图,所以我必须再次做错了我的猜测是因为这个位图创建是在没有使用GetDC的屏幕dc或窗口概念的对象中完成的(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掩码).有没有人知道从std :: vector< unsigned char>?初始化CBitmap对象的简单方法?

解决方法:

我将使用CreateCompatibleBitmap,然后调用SetDIBits以使用您的数据填充它.这些是我见过的功能,而且SetDIBits非常灵活,虽然冗长.

在我的MFC年代,由于可疑的性能问题,避免使用CreateBitmap.

标签:hbitmap,c,mfc,bitmap,gdi
来源: https://codeday.me/bug/20190923/1814172.html