【发布时间】:2019-08-25 11:58:18
【问题描述】:
许多论坛提供以下代码,说明如何将屏幕像素的副本放入数组:
char* Pixels = NULL;
HDC MemDC = CreateCompatibleDC(Context);
HBITMAP Section = CreateDIBSection(Context, &Info, DIB_RGB_COLORS, (void**)&Pixels, 0, 0);
DeleteObject(SelectObject(MemDC, Section));
BitBlt(MemDC, 0, 0, Width, Height, Context, Area.left, Area.top, SRCCOPY);
DeleteDC(MemDC);
std::fstream hFile(FilePath, std::ios::out | std::ios::binary);
if (hFile.is_open())
{
hFile.write((char*)&Header, sizeof(Header));
hFile.write((char*)&Info.bmiHeader, sizeof(Info.bmiHeader));
hFile.write(Pixels, (((BitsPerPixel * Width + 31) & ~31) / 8) * Height);
hFile.close();
DeleteObject(Section);
return true;
}
(Link)
但这实际上涉及将像素“内存”区域从屏幕 HDC 复制到内存中。为什么不这样:
char* Pixels = NULL;
HBITMAP Section = CreateDIBSection(Context, &Info, DIB_RGB_COLORS, (void**)&Pixels, 0, 0);
SelectObject(Context, Section);
上下文 HDC 已包含所有数据。为什么我不能读呢?
我认为位图必须选择到 HDC 中,并且 HDC 实际上携带数据。那么为什么CreateDIBSection 会返回一个指针,尽管位图还没有被选择到任何 HDC 中呢? (如果它提供了一个指向作为参数传递的 HDC 内存的指针,则该数组已经包含屏幕的像素值,但情况并非如此,因为仍然需要 BitBlt。)
我得出这个结论是因为 BitBlt 接受 HDC 参数,而不是位图。这可能意味着它将数据复制到关联的 HDC。
【问题讨论】:
标签: c++ bitblt gdi createdibsection