从内存创建 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),也叫内存位图