Форум программистов, компьютерный форум CyberForum.ru

Поиск координат пикселя в окне. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
Bloodrinker
 Аватар для Bloodrinker
2 / 2 / 0
Регистрация: 04.10.2011
Сообщений: 63
20.10.2011, 21:30     Поиск координат пикселя в окне. #1
Здравствуйте, нужно решить проблему поиска координат пикселя. Т е мы знаем цвет - нужно найти координаты пикселя. Также интересно узнать как искать пиксель в неактивном окне.
Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.10.2011, 21:30     Поиск координат пикселя в окне.
Посмотрите здесь:

C++ вывод пикселя
C++ определение цвета пикселя
C++ C++ Поиск пикселя заданного цвета и замена другим.
C++ Цвет пикселя под курсором
Поиск пикселя и поиск изображения на экране C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Игорь с++
 Аватар для Игорь с++
429 / 452 / 15
Регистрация: 26.01.2011
Сообщений: 2,029
20.10.2011, 21:35     Поиск координат пикселя в окне. #2
вот текст программы которая отслеживает координаты мыши,но так как окно стоит в позиции 0,0 поэтому координаты мыши будут равны координатам пикселя
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include<iostream>
#include <stdio.h>
#define _WIN32_WINNT 0x0500
#include<windows.h>
#include<conio.h>
using namespace std;
 
HWND GetConsoleHwnd(void){
        #define MY_BUFSIZE 1024 // ГђГ*çìåð ГЎГіГґГҐГ°Г* äëÿ Г§Г*ãîëîâêГ* ГЄГ®Г*ñîëüГ*îãî îêГ*Г*.
        HWND hwndFound;         // ГќГІГ® ГІГ®, Г·ГІГ® áóäåò âîçâðГ*Г№ГҐГ*Г®.
        char pszNewWindowTitle[MY_BUFSIZE]; // Г“Г*ГЁГЄГ*ëüГ*ûé Г§Г*ãîëîâîê îêГ*Г*.
        char pszOldWindowTitle[MY_BUFSIZE]; // ÈçГ*Г*Г·Г*ëüГ*ûé Г§Г*ãîëîâîê îêГ*Г*.
        GetConsoleTitle(pszOldWindowTitle, MY_BUFSIZE);
        wsprintf(pszNewWindowTitle,"%d/%d",
        GetTickCount(),
        GetCurrentProcessId());
        SetConsoleTitle(pszNewWindowTitle);
        Sleep(1);
        hwndFound=FindWindow(NULL, pszNewWindowTitle);
        SetConsoleTitle(pszOldWindowTitle);
        return(hwndFound);
} 
 
int main()
{
     SetWindowPos(GetConsoleWindow(), 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
        //GetStdHandle(STD_OUTPUT_HANDLE)
        RECT r;
        POINT p;
        HWND wh=GetConsoleHwnd();
        COORD c={1,1};
        while(1){
                GetWindowRect(wh, &r);
                GetCursorPos(&p);
                SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);
                cout<<p.x-r.left<<":"<<p.y-r.top<<"    ";
        }
}
Bloodrinker
 Аватар для Bloodrinker
2 / 2 / 0
Регистрация: 04.10.2011
Сообщений: 63
20.10.2011, 21:58  [ТС]     Поиск координат пикселя в окне. #3
Спасибо конечно большое, этот код мне тоже очень пригодился. Но хотелось бы увидеть пример по поиску по цвету.
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
20.10.2011, 23:00     Поиск координат пикселя в окне. #4
Bloodrinker, вот пример поиск по цвету пикселя, если пиксель найден с указанным цветом, показать координаты пикселя на форме, медленный вариант.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
BOOL  SearchPixelPos(HWND hwnd, COLORREF color, LPPOINT pos) {
  RECT rect;
  HDC dc = GetDC(hwnd);
  GetClientRect(hwnd, &rect);
  for(long y = 0L; y < rect.bottom; y++) {
     for(long x = 0L; x < rect.right; x++) {
         if( GetPixel(dc, x, y) == color) {
               ReleaseDC(hwnd, dc);
               pos->x = x;
               pos->y = y;
               return TRUE;
          }
      }
  }
  ReleaseDC(hwnd, dc);
  return FALSE;
}
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;
    WCHAR buf[64];
    POINT pos;
    HDC dc;
    switch (message) 
    {
     case WM_PAINT: 
            dc = BeginPaint(hWnd, &ps);
            SetPixel(dc, 100, 100, RGB(255, 0, 0));  // будем искать вот этот красный пиксель
            EndPaint(hWnd, &ps);
        break;
    case WM_LBUTTONDOWN: 
         // поиск красного пикселя
         if( SearchPixelPos(hWnd, RGB(255, 0, 0), &pos) ) {
                wsprintfW(buf, L"Пиксель найден: X: %d, Y: %d", pos.x, pos.y);
                MessageBoxW(hWnd, buf, L":)", MB_OK | MB_ICONINFORMATION);
          } else
                MessageBoxW(hWnd, L"Указанный цвет-пикселя не был найден.", L"...", MB_OK | MB_ICONEXCLAMATION);
        break;
     case WM_DESTROY:
          PostQuitMessage(0);
        break;
       default: return DefWindowProc(hWnd, message, wParam, lParam);
   }
   return 0;
}
Bloodrinker
 Аватар для Bloodrinker
2 / 2 / 0
Регистрация: 04.10.2011
Сообщений: 63
21.10.2011, 02:25  [ТС]     Поиск координат пикселя в окне. #5
блин, задолбался разбираться

Добавлено через 2 часа 11 минут
xAtom, Мда... суть то понял, но так и не оживил код) можно более полный вариант?
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
21.10.2011, 07:45     Поиск координат пикселя в окне. #6
Цитата Сообщение от Bloodrinker Посмотреть сообщение
суть то понял, но так и не оживил код)
Bloodrinker, держи.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include<windows.h>
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
BOOL  SearchPixelPos(HWND hwnd, COLORREF color, LPPOINT pos);
BOOL  SearchPixelPosEx(HWND wnd, COLORREF color, LPPOINT pos);
 
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    MSG  msg;
    HWND wnd = CreateWindowW(L"STATIC", L"Поиск пикселя", WS_OVERLAPPEDWINDOW,
                      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
    if(! wnd)
         return 1;
    SetWindowLongW(wnd, GWL_WNDPROC, (LONG)WndProc);
    SetClassLongW(wnd,  GCL_HCURSOR, (LONG)LoadCursor(NULL, IDC_ARROW));
    SetClassLongW(wnd,  GCL_HBRBACKGROUND, (LONG) GetStockObject(BLACK_BRUSH));
    ShowWindow(wnd, SW_SHOWDEFAULT);
    UpdateWindow(wnd);
 
    ZeroMemory(&msg, sizeof(MSG));
    while(GetMessageW(&msg, NULL, 0u, 0u)) {
           TranslateMessage(&msg);
           DispatchMessageW(&msg);
    }
    DestroyWindow(wnd);
    return 0;
}
 
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;
    WCHAR buf[64];
    POINT pos;
    HDC dc;
 
    switch (message) 
    {
     case WM_PAINT: {
           dc = BeginPaint(hWnd, &ps);
           SetBkMode(dc, TRANSPARENT);
           SetTextColor(dc, 0x0000FFFF);
           SetTextAlign(dc, DT_VCENTER);
           TextOutW(dc, ps.rcPaint.right / 2, 10, L"нажми левую кнопку мыши", 23);
           SetPixel(dc, 100, 100, RGB(255, 0, 0));
           EndPaint(hWnd, &ps);
         } break;
     case WM_LBUTTONDOWN: 
 
         if( SearchPixelPos(hWnd, RGB(255, 0, 0), &pos) ) {
               wsprintfW(buf, L"Пиксель найден: X: %d, Y: %d", pos.x, pos.y);
               MessageBoxW(hWnd, buf, L":)", MB_OK | MB_ICONINFORMATION);
         } else
               MessageBoxW(hWnd, L"Указанный цвет-пикселя не был найден.", L"...", MB_OK | MB_ICONEXCLAMATION);
        break;
      case WM_DESTROY:
           PostQuitMessage(0);
           break;
      default: return DefWindowProcW(hWnd, message, wParam, lParam);
   }
   return 0;
}
 
// медленный вариант
BOOL  SearchPixelPos(HWND hwnd, COLORREF color, LPPOINT pos) {
  RECT rect;
  HDC dc = GetDC(hwnd);
  GetClientRect(hwnd, &rect);
  for(long y = 0L; y < rect.bottom; y++) {
       for(long x = 0L; x < rect.right; x++) {
           if( GetPixel(dc, x, y) == color) {
                 ReleaseDC(hwnd, dc);
                 pos->x = x;
                 pos->y = y;
                 return TRUE;
           }
       }
   }
  ReleaseDC(hwnd, dc);
  return FALSE;
}
Bloodrinker
 Аватар для Bloodrinker
2 / 2 / 0
Регистрация: 04.10.2011
Сообщений: 63
21.10.2011, 21:19  [ТС]     Поиск координат пикселя в окне. #7
Еще раз спасибо, медленно просто ужасно конечно... буду искать другой способ, т к мне необходимо проверить за время не более секунды 10-20 пикселей. Думаю тут одним WinApi не отделаться...
Vovik_0_1
 Аватар для Vovik_0_1
40 / 40 / 4
Регистрация: 28.07.2011
Сообщений: 431
25.06.2012, 17:10     Поиск координат пикселя в окне. #8
А можно как нить найти не один пиксель, а например картинку в окне и получить её координаты?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2012, 17:19     Поиск координат пикселя в окне.
Еще ссылки по теме:

Определение пикселя цвета в координатах C++
Ширина пикселя SetPixel C++
Получить цвет пикселя в RGB C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
25.06.2012, 17:19     Поиск координат пикселя в окне. #9
Vovik_0_1, с помощью функции взаимной корреляции, но работать будет ОЧЕНЬ медленно.
Yandex
Объявления
25.06.2012, 17:19     Поиск координат пикселя в окне.
Ответ Создать тему
Опции темы

Текущее время: 04:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru