【问题标题】:How to get the array of RGB values for each pixel of the client area of a window如何获取窗口客户区每个像素的RGB值数组
【发布时间】:2011-09-29 14:01:55
【问题描述】:

有没有办法通过 gdi 接收窗口客户区中每个像素的颜色值?

【问题讨论】:

  • 这是为您自己的窗口之一还是为其他人的窗口?一般来说,你不应该弄乱别人的窗户。既然你自己画了你的窗户,你应该已经知道它是什么颜色了。
  • 对于我自己的应用程序的窗口...我正在使用各种函数来绘制窗口,所以我必须对每一个函数进行逆向工程以找出什么像素有什么颜色...似乎有点矫枉过正
  • @xcrypt: 假设绘制窗口的代码采用 HDC(或等价物)作为参数,只需创建一个位图,将其选择到内存 DC,然后将其作为绘制目标传递窗户。
  • @JerryCoffin 我该怎么做呢?我不是真正的 GDI 专家
  • @xcrypt:详细信息将取决于您的其余代码。我对此知之甚少,甚至无法做出明智的猜测。

标签: c++ winapi gdi pixel


【解决方案1】:

正如@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 中选择一个位图对象,您可以对其使用 GetPixel GDI 函数,然后您还可以使用 GetRValue()GetGValue()GetBValue() 宏提取颜色值。

【讨论】:

  • 请注意,这可能不包括您工作区中的所有像素。例如,如果另一个窗口覆盖了您的窗口,则这些像素将不可用(因为它们从未被绘制过)。更好的是在内存 DC 中创建位图,然后将您的绘制代码直接运行到该内存 DC 中。这样一来,您就可以完全保真地获得比特,而无需剪辑,并且避免了大的视频回读费用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-10
  • 1970-01-01
相关资源
最近更新 更多