【发布时间】:2015-01-03 19:56:43
【问题描述】:
您好,我使用了 getpixel 方法、bitblt 或它所谓的(创建位图标题),然后检查所有值。这是非常缓慢的。例如,如果我必须检测红色或特定颜色的东西,则需要很长时间。一定有更快的方法吧?我确实尝试使用桌面作为 HWND,然后使用我需要找到颜色的窗口,但桌面速度更快.. 猜测是因为它必须寻找我猜的窗口。我使用这两种方法都得到了很高的 cpu 使用率。
void Get_Color(int x,int y,int w,int h,int &red,int &green,int &blue,int action)
{
HDC hdc, hdcTemp;
RECT rect;
BYTE*bitPointer;
HWND Desktop = GetDesktopWindow();
hdc = GetDC(Desktop);
GetWindowRect(Desktop, &rect);
hdcTemp = CreateCompatibleDC(hdc);
BITMAPINFO bitmap;
bitmap.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bitmap.bmiHeader.biWidth = w;
bitmap.bmiHeader.biHeight = h;
bitmap.bmiHeader.biPlanes = 1;
bitmap.bmiHeader.biBitCount = 32;
bitmap.bmiHeader.biCompression = BI_RGB;
bitmap.bmiHeader.biSizeImage = 0;
bitmap.bmiHeader.biClrUsed = 0;
bitmap.bmiHeader.biClrImportant = 0;
HBITMAP hBitmap2 = CreateDIBSection(hdcTemp, &bitmap, DIB_RGB_COLORS, (void**)(&bitPointer), NULL, NULL);
HGDIOBJ save = SelectObject(hdcTemp, hBitmap2);
BitBlt(hdcTemp, 0, 0, w, h, hdc, x, y, SRCCOPY);
if(action==1)
{
for(int j=0;j<=w*h*4;j+=4)
{
red = bitPointer[j+2];
green = bitPointer[j+1];
blue = bitPointer[j];
if(red<30 && green>190 && blue>190)
{
break;
}
}
}
else
{
for(int j=0;j<=w*h*4;j+=4)
{
red = bitPointer[j+2];
green = bitPointer[j+1];
blue = bitPointer[j];
break;
}
}
///RELEASE
DeleteObject( SelectObject(hdcTemp, save) );
DeleteDC(hdcTemp);
DeleteDC(hdc);
ReleaseDC(NULL,hdc);
ReleaseDC(NULL,hdcTemp);
}
【问题讨论】:
-
您应该检测一次RGB,保存状态/值,并将其作为参数传递。无需在每次访问像素时检查 RGB。
-
你能解释更多吗?我没有完全理解你.. :d
-
你的意思是我不应该使用 for 循环来循环值?那我怎样才能得到颜色呢?
-
我建议将位图转换为RGB值一次,然后您可以参考您的RGB结构。我建议使用
值的矩阵。您的代码每次都会从头开始搜索。 -
你认为最占用CPU的操作是什么?因为它非常激烈。
标签: c++ rgb detect getpixel bitblt