以最快的方式获取像素颜色
Get Pixel color fastest way?
我正在尝试为Windows应用程序制作一个自动cliker。它运行良好,但速度非常慢!我目前正在使用"getPixel"方法,该方法每次调用时都会重新加载数组。
这是我当前的代码:
hdc = GetDC(HWND_DESKTOP);
bx = GetSystemMetrics(SM_CXSCREEN);
by = GetSystemMetrics(SM_CYSCREEN);
start_bx = (bx/2) - (MAX_WIDTH/2);
start_by = (by/2) - (MAX_HEIGHT/2);
end_bx = (bx/2) + (MAX_WIDTH/2);
end_by = (by/2) + (MAX_HEIGHT/2);
for(y=start_by; y<end_by; y+=10)
{
for(x=start_bx; x<end_bx; x+=10)
{
pixel = GetPixel(*hdc, x, y);
if(pixel==RGB(255, 0, 0))
{
SetCursorPos(x,y);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
Sleep(50);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
Sleep(25);
}
}
}
所以基本上,它只是扫描屏幕中的一系列像素,如果检测到红色按钮,就会启动鼠标事件。
我知道还有其他方法可以获取像素颜色,例如bitblt。但是我做了一些研究,我不明白我应该怎么做,以便扫描彩色阵列。我需要一些可以非常快速地扫描屏幕才能抓住按钮的东西。
你能帮帮我吗?
谢谢。
我找到了一个完美的方法,它显然比GetPixel更快:
HDC hdc, hdcTemp;
RECT rect;
BYTE* bitPointer;
int x, y;
int red, green, blue, alpha;
while(true)
{
hdc = GetDC(HWND_DESKTOP);
GetWindowRect(hWND_Desktop, &rect);
int MAX_WIDTH = rect.right;
int MAX_HEIGHT = rect.bottom;
hdcTemp = CreateCompatibleDC(hdc);
BITMAPINFO bitmap;
bitmap.bmiHeader.biSize = sizeof(bitmap.bmiHeader);
bitmap.bmiHeader.biWidth = MAX_WIDTH;
bitmap.bmiHeader.biHeight = MAX_HEIGHT;
bitmap.bmiHeader.biPlanes = 1;
bitmap.bmiHeader.biBitCount = 32;
bitmap.bmiHeader.biCompression = BI_RGB;
bitmap.bmiHeader.biSizeImage = MAX_WIDTH * 4 * MAX_HEIGHT;
bitmap.bmiHeader.biClrUsed = 0;
bitmap.bmiHeader.biClrImportant = 0;
HBITMAP hBitmap2 = CreateDIBSection(hdcTemp, &bitmap, DIB_RGB_COLORS, (void**)(&bitPointer), NULL, NULL);
SelectObject(hdcTemp, hBitmap2);
BitBlt(hdcTemp, 0, 0, MAX_WIDTH, MAX_HEIGHT, hdc, 0, 0, SRCCOPY);
for (int i=0; i<(MAX_WIDTH * 4 * MAX_HEIGHT); i+=4)
{
red = (int)bitPointer[i];
green = (int)bitPointer[i+1];
blue = (int)bitPointer[i+2];
alpha = (int)bitPointer[i+3];
x = i / (4 * MAX_HEIGHT);
y = i / (4 * MAX_WIDTH);
if (red == 255 && green == 0 && blue == 0)
{
SetCursorPos(x,y);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
Sleep(50);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
Sleep(25);
}
}
}
我希望这可以帮助其他人。
简单的答案是,如果这是你坚持使用的方法,那么就没有太多需要优化的了。正如其他人在评论中指出的那样,您可能应该使用不同的方法来定位要单击的区域。例如,看看如何使用FindWindow。
如果您不想更改方法,那么至少在每次完整的屏幕扫描后让您的线程休眠一会儿。
相关文章:
- opencv::Mat,从原始数据中获取像素值
- 如何在C 中获取像素着色器版本和顶点着色版版本
- 如何在Qt 5中从QGraphicsScene中获取像素单击或鼠标悬停的RGB值
- 如何使用 Windows API 获取像素格式布局
- OpenCV-从相机设备获取像素数据
- 如何沿数学函数获取像素
- 从IDirect3DSurface9获取像素
- 从 DICOM 文件 .dcm 获取像素数据
- 访问私有数据以从图像中获取像素时C++错误
- 以最快的方式获取像素颜色
- 从 SDL2 纹理获取像素信息
- glsl-获取像素颜色[像素着色器]
- 如何在openCV中获取像素矩阵并重塑矩阵
- Opencv -从特征匹配中获取像素坐标
- 在Gdk::Pixbuf上获取像素值,使用Gdk::Cairo设置像素值
- OpenCV从Mat图像中获取像素通道值
- 使用magick++获取像素颜色
- FreeImage:获取像素颜色
- 如何从图像中获取像素坐标
- 如何从鼠标点击中获取像素值