从内存创建 Windows GDI 位图

Posted

技术标签:

【中文标题】从内存创建 Windows GDI 位图【英文标题】:Create a Windows GDI Bitmap from memory 【发布时间】:2011-10-20 17:45:59 【问题描述】:

如何从内存本身加载位图(使用每个必要的标头正确构建,存储在内存中),并将 HBITMAP 与它关联?

【问题讨论】:

Win32 C/C++ Load Image from memory buffer 的可能重复项 【参考方案1】:

您必须使用 CreateDIBSection 创建一个新缓冲区,然后将您的位复制到其中......就像这样:

std::ifstream is;
is.open("Image.bmp", std::ios::binary);
is.seekg (0, std::ios::end);
length = is.tellg();
is.seekg (0, std::ios::beg);
pBuffer = new char [length];
is.read (pBuffer,length);
is.close();

tagBITMAPFILEHEADER bfh = *(tagBITMAPFILEHEADER*)pBuffer;
tagBITMAPINFOHEADER bih = *(tagBITMAPINFOHEADER*)(pBuffer+sizeof(tagBITMAPFILEHEADER));
RGBQUAD             rgb = *(RGBQUAD*)(pBuffer+sizeof(tagBITMAPFILEHEADER)+sizeof(tagBITMAPINFOHEADER));

BITMAPINFO bi;
bi.bmiColors[0] = rgb;
bi.bmiHeader = bih;

char* pPixels = (pBuffer+bfh.bfOffBits);

char* ppvBits;

hBitmap = CreateDIBSection(NULL, &bi, DIB_RGB_COLORS, (void**) &ppvBits, NULL, 0);
SetDIBits(NULL, hBitmap, 0, bih.biHeight, pPixels, &bi, DIB_RGB_COLORS);

GetObject(hBitmap, sizeof(BITMAP), &cBitmap);

【讨论】:

bi.bmiColors[0] = rgb; BITMAPINFO 结构可能需要 bmiColors 中的 0-256 个条目,具体取决于每个像素的位数。 您至少应该归功于您复制答案的布鲁诺。 ***.com/questions/2886831/… 当然,有没有一种“官方”的方式来做到这一点?......或者通过归功于他,你的意思是只是链接到原始的后排序? 我不知道是否有官方的方式,但链接到原始答案可能是一个好的开始,特别是因为原始答案可能会有讨论。

以上是关于从内存创建 Windows GDI 位图的主要内容,如果未能解决你的问题,请参考以下文章

Delphi GDI对象之脱屏位图(Offscreen Bitmaps),也叫内存位图

GDI根据位图和透明度创建蒙版

GDI:原始 DC 位图更改,无法恢复

C#搞跨平台桌面UI,分别实现Windows,Mac,Linux屏幕截图

windoes任务管理器中的“句柄数”是啥意思!

当字节数组的源是 jpg 时,从存储的字节数组创建位图并保存到磁盘会引发 GDI+ 异常