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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
Ganibal95
1 / 1 / 0
Регистрация: 15.01.2012
Сообщений: 23
#1

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

15.01.2012, 20:12. Просмотров 1713. Ответов 3
Метки нет (Все метки)

Здрасте
Проблемма состоит в том что функция, то работает, то не работает...
Задача функции, нужно просканировать целую область пикселей и если пиксель найден, то возратить 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++
Всем доброго времени суток. Столкнулся со странной проблемой. Вот код который на xp работал как часы, попробовал под win7 и он выдаёт...

GetPixel и его странности - C++
дело такое: есть функция которая должна искать цвет в RGB на определённом пикселе (где находится курсор) выглядит она так POINT...

[WinApi] Аналог GetPixel - C++
можете подскзать аналог GetPixel он слишком много тормозит или как можна сделать в моем случае: У меня есть лабиринт шарик бегает...

Есть ли в С++ функция, быстрее GetPixel? - C++
А то я тут пока гулял по интернету нашёл одного человека, который говорил: Это правда, что GetPixel не сильно быстро работает?...

GetPixel, почему первый иф равен тру, а второй - нет - C++
Уважаемые знатоки, в первом GetPixel корды верхнего левого угла иконки поплавка (певая вкладка, опять таки вверху слева), а во втором...

Не работает: 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++
у меня не получается посмотри: ...... COLORREF c; BYTE r,g,b; c=GetPixel(i,j); r=GetRValue(c); g=... b=.... ..... ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
zss
Модератор
Эксперт С++
6358 / 5922 / 1919
Регистрация: 18.12.2011
Сообщений: 15,219
Завершенные тесты: 1
15.01.2012, 20:33 #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  [ТС] #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
Модератор
Эксперт С++
6358 / 5922 / 1919
Регистрация: 18.12.2011
Сообщений: 15,219
Завершенные тесты: 1
16.01.2012, 19:53 #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;
А дальше - дело техники
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.01.2012, 19:53
Привет! Вот еще темы с ответами:

Сканирование - C++
В общем возможно хочу бред сделать но все же... :pardon: Имеется эмулятор(в моем случае PPSSPP написанный на С++), и с помощью неё я...

Сканирование IP - C++
(Извиняюсь, не знаю в какой теме написать) Как можно просканировать свой динамический ip на открытые порты?

Сканирование штрихкодов. - C++
Как программно управлять сканером штрихкодов. Пишу на VC++7.0. Заранее благодарю.

Сканирование экрана - C++
Здравствуйте, нужна помощь новичку по winapi. Нужно сделать сканирование выбранной области экрана и запись результата в двумерный...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.01.2012, 19:53
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru