Многие форумы дают следующий код относительно того, как получить в массив копию пикселей экрана:
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;
}
( Ссылка )
Но это включает в себя фактическое копирование области «памяти» пикселей с экрана HDC в область памяти. Почему бы не это:
char* Pixels = NULL;
HBITMAP Section = CreateDIBSection(Context, &Info, DIB_RGB_COLORS, (void**)&Pixels, 0, 0);
SelectObject(Context, Section);
Context HDC уже содержит все данные. Почему я не могу просто прочитать это?
И я подумал, что растровое изображение должно быть должно быть выбрано в HDC, и что HDC на самом деле переносит данные. Тогда почему CreateDIBSection
возвращает указатель, хотя растровое изображение еще не было выбрано ни в одном HDC? (Если он дает указатель на память HDC, переданную в качестве аргумента, тогда массив уже содержит значения пикселей экрана, но это не так, потому что BitBlt
все еще требуется.)
Я пришел к такому выводу, потому что BitBlt принимает аргумент HDC, а не растровое изображение. Это, вероятно, означает, что он копирует данные в связанный HDC.