C++ 如何获取窗口工作区每个像素的RGB值数组

C++ 如何获取窗口工作区每个像素的RGB值数组,c++,winapi,gdi,pixel,C++,Winapi,Gdi,Pixel,是否有一种方法可以通过gdi接收窗口客户端区域中每个像素的颜色值?如@JerryCoffin评论中所述。这里有一个简单的例子 hDC = GetDC(hwnd); hBitmap = CreateCompatibleBitmap(hDC, width, height); hMemDC = CreateCompatibleDC(hDC); hOld = SelectObject(hMemDC, hBitmap); BitBlt(hMemDC, 0, 0, width, height, hDC, x

是否有一种方法可以通过gdi接收窗口客户端区域中每个像素的颜色值?

如@JerryCoffin评论中所述。这里有一个简单的例子

hDC = GetDC(hwnd);
hBitmap = CreateCompatibleBitmap(hDC, width, height);
hMemDC = CreateCompatibleDC(hDC);
hOld = SelectObject(hMemDC, hBitmap);
BitBlt(hMemDC, 0, 0, width, height, hDC, x, y, SRCCOPY);

// Clean up
DeleteDC(hMemDC);
ReleaseDC(hwnd, hDC);

您应该在内存DC中选择一个位图对象,您可以使用GDI函数,然后还可以使用
GetRValue()
GetGValue()
、和
GetBValue()
宏来提取颜色值。

这是针对您自己的窗口还是针对其他人的窗口?一般来说,你不应该弄乱别人的窗户。既然你自己画了你的窗口,你应该已经知道它是什么颜色了。。。我正在使用各种各样的函数来绘制窗口,所以我必须对其中的每一个进行反向工程,以找出什么像素有什么颜色。。。似乎有点overkill@xcrypt:假设绘制窗口的代码采用HDC(或等效值)作为参数,只需创建一个位图,将其选择到内存DC中,然后将其作为绘制窗口的目标。@JerryCoffin我该怎么做?我不是这方面的专家GDI@xcrypt:详细信息将取决于代码的其余部分。我对这方面的了解还不足以做出明智的猜测。请注意,这可能不包括客户端区域中的所有像素。例如,如果另一个窗口覆盖了您的窗口,则这些像素将不可用(因为它们从未被绘制)。最好是在内存DC中创建位图,然后将绘制代码直接运行到该内存DC中。这样,您就可以在没有剪辑的情况下获得完全逼真的比特,并且避免了大量的视频回读开销。