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

GetPixel Сканирование область пикселей - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
Ganibal95
1 / 1 / 0
Регистрация: 15.01.2012
Сообщений: 23
15.01.2012, 20:12     GetPixel Сканирование область пикселей #1
Здрасте
Проблемма состоит в том что функция, то работает, то не работает...
Задача функции, нужно просканировать целую область пикселей и если пиксель найден, то возратить 1, если не найден возратить 0.
Вот код:
Код
DWORD PixelSearth(int x, int y, int ix, int iy, COLORREF Color)
{
	COLORREF Pixl;
	HDC d3ddc2;
	HWND d3dhwnd2;
	d3dhwnd2 = GetForegroundWindow();
	d3ddc2 = GetDC(d3dhwnd2);
	int ux = ix - x;
	int uy = iy - y;
	for(int i=0;i<=uy;i++)
	{
		for(int j=0;j<=ux;j++)
		{
			Pixl=GetPixel(d3ddc2, x+i, y+j);
			if(Pixl==Color) return (1);
		}
	}
return (0);
}
Может там что-то исправить нужно!?
И еще как-бы сделать чтоб опредялять не точный цвет пикселя, а с погрешностью?
Надеюсь на вашу помощь
P.S Я новичок в C++

Добавлено через 21 минуту
Помогите плз
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.01.2012, 20:12     GetPixel Сканирование область пикселей
Посмотрите здесь:

C++ Сканирование каталога
GetPixel C++
C++ Не работает: COLORREF c; BYTE r,g,b; c=GetPixel(i,j); r=GetRValue(c); g=... b=.... ..... c=RGB(r,g,b); SetPixel(i,j,c);
C++ [C++][WinApi] Аналог GetPixel
GetPixel, почему первый иф равен тру, а второй - нет C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5952 / 5557 / 1787
Регистрация: 18.12.2011
Сообщений: 14,201
Завершенные тесты: 1
15.01.2012, 20:33     GetPixel Сканирование область пикселей #2
Из COLORREF переменной цвета выделить можно так
C++
1
2
BYTE r=GetRValue(Color); 
BYTE g=GetGValue(Color); BYTE и=GetBValue(Color);









А потом сравнивайте с нужной точностью
C++
1
2
if(abs(b-bp)<10 && abs(r-rp)<10 && abs(g-gp)<10)
   return 1;




Ganibal95
1 / 1 / 0
Регистрация: 15.01.2012
Сообщений: 23
15.01.2012, 21:31  [ТС]     GetPixel Сканирование область пикселей #3
А можите это в функцию приведенную выше засунуть? А то я не совсем пойму откуда переменные bp и.т.д...

Добавлено через 7 минут
zss2, по идее мне нужно чтоб эта функция выполняла, так-же как в autoIt
Вот описание этой функции в AutoIt
Найти пиксел заданного цвета в указанном прямоугольнике

PixelSearch ( left, top, right, bottom, color, shade, step)

Параметры

left левая координата прямоугольника.
top верхняя координата прямоугольника.
right правая координата прямоугольника.
bottom верхняя координата прямоугольника.
color десятичное значение цвета.
shade-variation [опциональный] величина от 0 до 255 указывает разрешенное число каналов сопоставимого цвета для rgb компонентов. Стандартное значение 0 (точное сопоставление).
step [опциональный] шаг поиска (в пикселах). Значение 2 означает проверку каждого второго пиксела. Стандартное значение 1.

Добавлено через 2 минуты
---------
И еше нужно чтоб функция сканировала с начало экрана, а не сначало окна...

Добавлено через 17 минут
--------
Уже сделал вот так:
Код
DWORD PixelSearth(int x, int y, int ix, int iy, COLORREF Color, int shade)
{
	COLORREF Pixl;
	HDC d3ddc2;
	HWND d3dhwnd2;
	d3dhwnd2 = GetForegroundWindow();
	d3ddc2 = GetDC(d3dhwnd2);
	BYTE r=GetRValue(Color); 
	BYTE g=GetGValue(Color); 
	BYTE b=GetBValue(Color);
	int ux = ix - x;
	int uy = iy - y;
	for(int i=0;i<=uy;i++)
	{
		for(int j=0;j<=ux;j++)
		{
			Pixl=GetPixel(d3ddc2, x+i, y+j);
			BYTE rp=GetRValue(Pixl); 
			BYTE gp=GetGValue(Pixl); 
			BYTE bp=GetBValue(Pixl);
			if(abs(b-bp)<=shade && abs(r-rp)<=shade && abs(g-gp)<=shade) return (1);
		}
	}
return (0);
}
Думаю что сканирования окна/экрана задается тут:
Код
d3dhwnd2 = GetForegroundWindow();
d3ddc2 = GetDC(d3dhwnd2);
Мне нужно именно экрана

Добавлено через 3 минуты
-----------------------
нашол ошибку, исправил:
Код
DWORD PixelSearth(int x, int y, int ix, int iy, COLORREF Color, int shade)
{
	COLORREF Pixl;
	HDC d3ddc2;
	HWND d3dhwnd2;
	d3dhwnd2 = GetForegroundWindow();
	d3ddc2 = GetDC(d3dhwnd2);
	BYTE r=GetRValue(Color); 
	BYTE g=GetGValue(Color); 
	BYTE b=GetBValue(Color);
	int ux = ix - x;
	int uy = iy - y;
	for(int i=0;i<=uy;i++)
	{
		for(int j=0;j<=ux;j++)
		{
			Pixl=GetPixel(d3ddc2, x+j, y+i);
			BYTE rp=GetRValue(Pixl); 
			BYTE gp=GetGValue(Pixl); 
			BYTE bp=GetBValue(Pixl);
			if(abs(b-bp)<=shade && abs(r-rp)<=shade && abs(g-gp)<=shade) return (1);
		}
	}
return (0);
}
Теперь осталось сделать область сканирования ВСЕГО экрана.

Добавлено через 18 минут
---------
Добавил Step:
Код
DWORD PixelSearth(int x, int y, int ix, int iy, COLORREF Color, int shade, int Step)
{
	COLORREF Pixl;
	HDC d3ddc2;
	HWND d3dhwnd2;
	d3dhwnd2 = GetForegroundWindow();
	d3ddc2 = GetDC(d3dhwnd2);
	BYTE r=GetRValue(Color);
	BYTE g=GetGValue(Color);
	BYTE b=GetBValue(Color);
	int ux = ix - x;
	int uy = iy - y;
	for(int i=0;i<=uy;i++)
	{
		for(int j=0;j<=ux;j+=Step)
		{
			Pixl=GetPixel(d3ddc2, x+j, y+i);
			BYTE rp=GetRValue(Pixl); 
			BYTE gp=GetGValue(Pixl); 
			BYTE bp=GetBValue(Pixl);
			if(abs(b-bp)<=shade && abs(r-rp)<=shade && abs(g-gp)<=shade) return (1);
		}
	}
return (0);
}
Теперь ост. только сканирование всего экрана! Помогите
zss
Модератор
Эксперт С++
 Аватар для zss
5952 / 5557 / 1787
Регистрация: 18.12.2011
Сообщений: 14,201
Завершенные тесты: 1
16.01.2012, 19:53     GetPixel Сканирование область пикселей #4
Получить контекст экрана и его размеры можно так
C++
1
2
3
4
5
HWND hwndScreen=GetDesktopWindow();
HDC hdcScreen=GetDC(hwndScreen);
Rect rc;GetWindowRect(hwndScreen,&rc);
int ScreenWidth=rc.right;
int ScreenHeight=rc.bottom;
А дальше - дело техники
Yandex
Объявления
16.01.2012, 19:53     GetPixel Сканирование область пикселей
Ответ Создать тему
Опции темы

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