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

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

【问题讨论】:

标签: c++ windows gdi


【解决方案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 个条目,具体取决于每个像素的位数。
  • 您至少应该归功于您复制答案的布鲁诺。 stackoverflow.com/questions/2886831/…
  • 当然,有没有一种“官方”的方式来做到这一点?......或者通过归功于他,你的意思是只是链接到原始的后排序?
  • 我不知道是否有官方的方式,但链接到原始答案可能是一个好的开始,特别是因为原始答案可能会有讨论。
猜你喜欢
  • 1970-01-01
  • 2017-01-25
  • 2020-04-12
  • 2015-01-25
  • 2012-06-06
  • 1970-01-01
  • 2012-06-17
  • 2010-12-11
  • 1970-01-01
相关资源
最近更新 更多