안녕하세요 저는 getpixel 메서드, bitblt 또는 비트 맵 머리글 만들기라는 것을 사용하고 모든 값을 사용했습니다. 매우 느립니다. exapmple 위해 뭔가 빨간색 또는 특정 색을 감지해야했다면 매우 오랜 시간이 걸릴 것입니다. 더 빠른 길을 갈거야? 나는 바탕 화면을 HWND로 사용하려고 시도한 다음 색상을 찾을 필요가있는 창을 보았지만 바탕 화면은 어떻게 든 더 빨랐다. 창을 찾아야했기 때문에 추측했다. 두 방법 모두를 사용하여 높은 CPU 사용량을 얻습니다.가장 빠른 RGB 색감 C++
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 –
당신은 순환을 위해 값을 사용하지 말아야한다는 것을 의미합니까? 그러면 색상을 어떻게 얻을 수 있습니까? –