Szukanie Pixela po Koloru

0

0x10

Gość
Szukałem ale nic nie znalazłem na temat szukania pixelu po kolorze.

EDIT. Przeprasz za pomyłkę w Temacie ;D ale pisałem to na szybko ;]
 

discovery44

Były Moderator
Dołączył
Sierpień 14, 2007
Posty
763
http://www.haxite.org/index.php3?site=forum&nx1=f_display&ID=94831&start=6&f_page=0
Jeżeli chodziło Ci o pokazanie współrzędnych piksela o kolorze RGB(1,2,3) to możesz szukać po pikselu ;p Albo przeszukać ten adres: http://xion.org.pl/files/texts/mgt/html/3_4.html i może coś znajdziesz ;) Ja nie mam chęci na czytanie. Przeleciałem tę stronę i znalazłem kod:
Kod:
[COLOR=green]// ColorPicker - pobieracz  kolorów[/COLOR]
     
    [COLOR=blue]#include[/COLOR] [COLOR=gray]<string>[/COLOR]
    [COLOR=blue]#include[/COLOR] [COLOR=gray]<sstream>[/COLOR]
    [COLOR=blue]#define[/COLOR] WIN32_LEAN_AND_MEAN
    [COLOR=blue]#include[/COLOR] [COLOR=gray]<windows.h>[/COLOR]
    [COLOR=blue]#include[/COLOR] [COLOR=gray]<windowsx.h>[/COLOR]
    [COLOR=gray] [/COLOR]
    [COLOR=gray] [/COLOR]
    [COLOR=green]// dane okna[/COLOR]
    std::string g_strKlasaOkna = [COLOR=gray]"od0dogk_ColorPicker_Window"[/COLOR];
    HWND g_hwndOkno = NULL;
     
    [COLOR=green]// uchwyt do kontekstu ekranu[/COLOR]
    HDC g_hdcEkran = NULL;
     
    [COLOR=green]// pobrany kolor[/COLOR]
    COLORREF g_clKolor = RGB([COLOR=maroon]255[/COLOR],  [COLOR=maroon]255[/COLOR], [COLOR=maroon]255[/COLOR]);     [COLOR=green]// początkowo biały[/COLOR]
     
     
    [COLOR=green]//-------------------  procedura  zdarzeniowa okna------------------------ [/COLOR]
     
    LRESULT CALLBACK WindowEventProc(HWND hWnd, UINT uMsg,  WPARAM  wParam, LPARAM lParam)
    {
       [COLOR=blue]switch[/COLOR]  (uMsg)
       {
             [COLOR=blue]case[/COLOR]  WM_LBUTTONDOWN:
    [COLOR=green]               [/COLOR][COLOR=green]// łapiemy myszkę[/COLOR]
                   SetCapture (hWnd);
     
    [COLOR=green]               // ustawiamy  kursor w  kształcie celownika[/COLOR]
                   SetCursor  (LoadCursor(NULL,  IDC_CROSS));
                   [COLOR=blue]return[/COLOR]  [COLOR=maroon]0[/COLOR];
     
             [COLOR=blue]case[/COLOR]  WM_MOUSEMOVE:
    [COLOR=green]               // sprawdzamy,  czy myszka  jest złapana[/COLOR]
                   [COLOR=blue]if[/COLOR]  (GetCapture() ==  hWnd)
                   {
    [COLOR=green]                     //  odczytujemy  współrzędne kursora[/COLOR]
                         POINT ptKursor;
                         ptKursor.x =  GET_X_LPARAM(lParam);
                         ptKursor.y =  GET_Y_LPARAM(lParam);
     
    [COLOR=green]                      [/COLOR][COLOR=green]// przeliczamy je na koordynaty  ekranowe[/COLOR]
                         ClientToScreen (hWnd,  &ptKursor);
     
    [COLOR=green]                     //  pobieramy kolor  z miejsca kursora[/COLOR]
                         g_clKolor = GetPixel(g_hdcEkran,
                                              ptKursor.x,  ptKursor.y);
     
    [COLOR=green]                     //  wymuszamy  odświeżenie okna programu,[/COLOR]
    [COLOR=green]                     [/COLOR][COLOR=green]// aby pokazać pobrany kolor[/COLOR]
                         InvalidateRect  (hWnd, NULL,  TRUE);
                   }
                   [COLOR=blue]return[/COLOR]  [COLOR=maroon]0[/COLOR];
     
             [COLOR=blue]case[/COLOR]  WM_LBUTTONUP:
    [COLOR=green]               [/COLOR][COLOR=green]// uwalniamy mysz[/COLOR]
                   ReleaseCapture();
     
    [COLOR=green]               // ustawiamy  kursor  strzałki[/COLOR]
                   SetCursor  (LoadCursor(NULL,  IDC_ARROW));
                   [COLOR=blue]return[/COLOR]  [COLOR=maroon]0[/COLOR];
     
             [COLOR=blue]case[/COLOR] WM_PAINT:
             {
    [COLOR=green]               // odrysowanie  zawartości  okna[/COLOR]
                   {
                         PAINTSTRUCT ps;
                         HDC hdcOkno;
     
    [COLOR=green]                      //  zaczynamy[/COLOR]
                         hdcOkno =  BeginPaint(hWnd,  &ps);
     
    [COLOR=green]                      [/COLOR][COLOR=green]// pobieramy obszar klienta okna[/COLOR]
                         RECT rcObszarKlienta;
                         GetClientRect (hWnd,  &rcObszarKlienta);
     
    [COLOR=green]                     //  wypełniamy go  pobranym kolorem[/COLOR]
    [COLOR=green]                     // w tym  celu  najpierw tworzymy odpowiedni pędzel,[/COLOR]
    [COLOR=green]                     // a  potem  wypełniamy prostokąt obszaru klienta[/COLOR]
    [COLOR=green]                     // potem  usuwamy  pędzel[/COLOR]
                         HBRUSH hbrPedzel =  CreateSolidBrush(g_clKolor);
                         FillRect  (hdcOkno,  &rcObszarKlienta, hbrPedzel);
                         DeleteObject  (hbrPedzel);
     
    [COLOR=green]                      [/COLOR][COLOR=green]// kończymy rysowanie[/COLOR]
                         EndPaint (hWnd, &ps);
                   }
     
    [COLOR=green]               // pokazanie  składowych  koloru[/COLOR]
                   {
    [COLOR=green]                     //  pobieramy te  składowe i konwertujemy na napis[/COLOR]
                         std::stringstream  Strumien;
                         Strumien <<  [COLOR=gray]"RGB: "[/COLOR] << ([COLOR=blue]int[/COLOR])  GetRValue(g_clKolor)
                                  <<  [COLOR=gray]", "[/COLOR] << ([COLOR=blue]int[/COLOR])  GetGValue(g_clKolor)
                                  <<  [COLOR=gray]", "[/COLOR] << ([COLOR=blue]int[/COLOR])  GetBValue(g_clKolor);
     
    [COLOR=green]                      [/COLOR][COLOR=green]// ustawiamy ten napis jako tytuł  okna programu[/COLOR]
                         SetWindowText  (hWnd,  Strumien.str().c_str());
                   }
     
                   [COLOR=blue]return[/COLOR]  [COLOR=maroon]0[/COLOR];
             }
     
             [COLOR=blue]case[/COLOR]  WM_DESTROY:
    [COLOR=green]               // zwalniamy  kontekst  ekranu[/COLOR]
                   ReleaseDC (NULL, g_hdcEkran);
     
    [COLOR=green]               // kończymy  program[/COLOR]
                   PostQuitMessage ([COLOR=maroon]0[/COLOR]);
                   [COLOR=blue]return[/COLOR]  [COLOR=maroon]0[/COLOR];
       }
     
       [COLOR=blue]return[/COLOR]  DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
     
     
    [COLOR=green]//-----------------------  funkcja  WinMain()---------------------------- [/COLOR]
     
    [COLOR=blue]int[/COLOR]  WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, [COLOR=blue]int[/COLOR]  nCmdShow)
    {
    [COLOR=green]   /* rejestrujemy klasę okna  */[/COLOR]
     
       WNDCLAS*** KlasaOkna;
       
    [COLOR=green]   // wypełniamy strukturę  WNDCLAS***[/COLOR]
       ZeroMemory (&KlasaOkna, [COLOR=blue]sizeof[/COLOR](WNDCLAS***));
       KlasaOkna.cbSize = [COLOR=blue]sizeof[/COLOR](WNDCLAS***);
       KlasaOkna.hInstance = hInstance;
       KlasaOkna.lpfnWndProc =  WindowEventProc;
       KlasaOkna.lpszClassName =  g_strKlasaOkna.c_str();
       KlasaOkna.hCursor =  LoadCursor(NULL,  IDC_ARROW);
       KlasaOkna.hIcon = LoadIcon(NULL,  IDI_APPLICATION);
       
    [COLOR=green]   [/COLOR][COLOR=green]// rejestrujemy klasę okna[/COLOR]
       RegisterClas*** (&KlasaOkna);
     
     
    [COLOR=green]   /* tworzymy okno */[/COLOR]
     
    [COLOR=green]   // tworzymy okno funkcją  CreateWindowEx[/COLOR]
       g_hwndOkno =  CreateWindowEx(WS_EX_TOOLWINDOW,
                                    g_strKlasaOkna.c_str(),
                                   NULL,
                                    WS_OVERLAPPED |  WS_BORDER
                                   |  WS_CAPTION |  WS_SYSMENU,
                                   0,  0,
                                   125,
                                   80,
                                   NULL,
                                   NULL,
                                   hInstance,
                                   NULL);
       
    [COLOR=green]   // pokazujemy nasze okno i  je od razu  odświeżamy[/COLOR]
       ShowWindow (g_hwndOkno, nCmdShow);
       UpdateWindow (g_hwndOkno);
     
     
    [COLOR=green]   /* pobieramy kontekst  urządzenia  ekranu */[/COLOR]
       g_hdcEkran = GetDC(NULL);
     
     
    [COLOR=green]   /* pętla komunikatów */[/COLOR]
     
       MSG msgKomunikat;
       [COLOR=blue]while[/COLOR]  (GetMessage(&msgKomunikat, NULL, [COLOR=maroon]0[/COLOR],  [COLOR=maroon]0[/COLOR]))
       {
             TranslateMessage (&msgKomunikat);
             DispatchMessage (&msgKomunikat);
       }
     
    [COLOR=green]   // zwracamy kod wyjścia[/COLOR]
       [COLOR=blue]return[/COLOR] [COLOR=blue]static_cast[/COLOR]<[COLOR=blue]int[/COLOR]>(msgKomunikat.wParam);
    }
 
Ostatnia edycja:
0

0x10

Gość
Dobra poradziłem sobie z tym szukaniem pixela, ale znowu mam problem, teraz ze śledzeniem tego pixela. Proszę pomóżcie.
 
0

0x10

Gość
Ale ja szukam tego pixela tak. Cały czas sprawdzam czy pod kursorem myszy nie ma takiego i takiego koloru, jak jest to cały czas myszka zostaje w tym miejscu gdzie znalazł tego piexela. Nie mogę zrobić żeby szukało tego pixela na całym ekranie bo to za długo trwa. Myślałem że znajdziecie jakiś sposób, jak śledzić tego pixela.
 

hxv

Były Moderator
Dołączył
Sierpień 9, 2006
Posty
797
Jeśli pixel porusza się z punktu A do punktu B w linii prostej z prędkością X pikseli na sekundę, to możesz co sekundę przeszukiwać obszar w odległości do X pixeli od ostatniej pozycji aby go znaleźć. Jeśli po prostu znika i pojawia się w losowo wybranym punkcie na ekranie to poza skanowaniem całego obrazu (lub ew. jakimś hookiem w aplikacji która go tworzy) nie widzę innego rozwiązania, pixele nie są ze sobą jakoś powiązane - w momencie gdy jakiś 'znika' po prostu rysowany jest na jego miejscu inny.
 
0

0x10

Gość
Tak też myślałem że z tym wyszukiwaniem pixela nie da rady, no cóż będe musiał walnąć hooka ;] Dzięki za pomoc
 
Do góry Bottom