Что нового

PixelSearchEx - PixelSearch с расширенными возможностями

Belfigor

Модератор
Локальный модератор
Сообщения
3 551
Репутация
930
AutoIt: 3.3.1.1
Версия: 1.2
Категория: Создание элементов GUI
Описание: PixelSearchEx в отличии от PixelSearch ищет пиксель опираясь не только на его цвет и шейд но и на заранее заданные условия которые позволяют вам из нескольких одинаковых пикселей в области поиска найти именно тот уникальный пиксель, который вам нужен и узнать его X и Y координаты. Для работы требуется функция которая обрабатывает каждый новый найденный пиксель и возвращает значение True если пиксель удовлетворил заданным условиям или же False если не удовлетворил. Каждая такая функция пишется пользователем отдельно под себя. В архиве есть пример + тестовая картинка которые наглядно покажут как работает данная UDF. Все что вам нужно - это открыть прикрепленное изображение, подставить к переменным $TestX1 и $TestY1 свои значения левого верхнего угла картинки и запустить Example.au3. Файл PixelSearchEx.au3 необходимо либо поместить в папку Include AutoIt'а либо изменить инклуд с <PixelSearchEx.au3> на "PixelSearchEx.au3".
В отличии от PixelSearch у вас будет не 8 возможных параметров команды а 9.
PixelSearchEx(x1, y1, x2, y2, color, shade, Case, step, hwnd). При том если вы хотите указать обработку какого-либо из дополнительных условий вам всегда нужно будет указывать shade. Если доп обработку не указать то UDF сработает как простой PixelSearch. PixelSearch'и прописанные в обрабатывающей найденный пиксель функции - не предел для фантазии, в условия подставлять можно абсолютно все что угодно.

Пример:
Код:
#include <PixelSearchEx.au3>

Test()

Func Test() ;Задайте X и Y правого верхнего угла черной области тестовой картинки.
	Local $TestX1 = 804, $TestY1 = 748, $TestX2 = $TestX1+141, $TestY2 = $TestY1+141

	MsgBox(0,"","Ищу первый подходящий по цвету пиксель.", 3)
	WinA()
	$pix = PixelSearchEx($TestX1, $TestY1, $TestX2, $TestY2, 0x00E125, 5)
	If Not @error Then
		MouseMove($pix[0], $pix[1], 10)
		MsgBox(0,"","Подходящий по цвету пиксель найден.", 1)
	Else
		If @error = 2 Then MsgBox(0,"","Функция была использована с неправильным условием.", 1)
		MsgBox(0,"","Подходящий по цвету пиксель не найден.", 1)
	EndIf

	MsgBox(0,"","Ищу группу из двух пикселей.", 3)
	WinA()
	$pix = PixelSearchEx($TestX1, $TestY1, $TestX2, $TestY2, 0x00E125, 5, 1)
	If Not @error Then
		MouseMove($pix[0], $pix[1], 10)
		MsgBox(0,"","Группа из двух пикселей найдена.", 1)
	Else
		If @error = 2 Then MsgBox(0,"","Функция была использована с неправильным условием.", 1)
		MsgBox(0,"","Группа из двух пикселей не найдена.", 1)
	EndIf

	MsgBox(0,"","Ищу группу из трех пикселей"&@CR&"пытаясь использовать не описанное условие", 5)
	WinA()
	$pix = PixelSearchEx($TestX1, $TestY1, $TestX2, $TestY2, 0x00E125, 5, 8)
	If Not @error Then
		MouseMove($pix[0], $pix[1], 10)
		MsgBox(0,"","Группа из трех пикселей найдена.", 1)
	Else
		If @error = 1 Then MsgBox(0,"","Группа из трех пикселей не найдена.", 1)
		If @error = 2 Then MsgBox(0,"","Функция была использована с не заданным условием.", 5)
	EndIf
	
	MsgBox(0,"","Ищу группу из трех пикселей используя PixelSearchExDemo"&@CR&"отображая весь ход работы.", 5)
	WinA()
	$pix = PixelSearchExDemo($TestX1, $TestY1, $TestX2, $TestY2, 0x00E125, 5, 2)
	If Not @error Then
		MouseMove($pix[0], $pix[1], 10)
		MsgBox(0,"","Группа из трех пикселей найдена.", 1)
	Else
		If @error = 1 Then MsgBox(0,"","Группа из трех пикселей не найдена.", 1)
		If @error = 2 Then MsgBox(0,"","Функция была использована с не заданным условием.", 5)
	EndIf
	
	MsgBox(0,"","Ищу группу из четырех пикселей.", 1)
	WinA()
	$pix = PixelSearchEx($TestX1, $TestY1, $TestX2, $TestY2, 0x00E125, 5, 3)
	If Not @error Then
		MouseMove($pix[0], $pix[1], 10)
		MsgBox(0,"","Группа из четырех пикселей найдена.", 1)
	Else
		If @error = 2 Then MsgBox(0,"","Функция была использована с неправильным условием.", 1)
		MsgBox(0,"","Группа из четырех пикселей не найдена.", 1)
	EndIf
EndFunc

Func WinA() ;Просто для тестов, чтобы постоянно выскакивающие MsgBox не сбивали работу скрипта если он работает в локальных координатах окна.
	WinActivate("PixelSearchEx - Test")
	WinWaitActive("PixelSearchEx - Test")
EndFunc

Func PixelSearchExDemo($x1, $y1, $x2, $y2, $col, $shade=0, $Case = 0, $step=1, $hwnd=0)
	Local Const $Con[8] = [$x1, $y1, $x2, $y2, "0x"&Hex($col, 6), $shade, $step, $hwnd]
	WinA()
	While 1
		MouseMove($x1, $y1, 10)
		MsgBox(0,"","Начало текущей области поиска.", 1)
		WinA()
		MouseMove($x2, $y2, 10)
		MsgBox(0,"","Конец текущей области поиска.", 1)
		WinA()
		$Check = PixelSearch($x1, $y1, $x2, $y2, $Con[4], $Con[5], $Con[6], $Con[7])
		If Not @error Then
			MouseMove($Check[0], $Check[1], 10)
			MsgBox(0,"","Найден подходящий по цвету пиксель.", 1)
			WinA()
			If CheckPixel($Check, $Case) Then
				Return $Check
			Else
				If @error Then 
					MsgBox(0,"","Условие "&$Case&" не описано", 1)
					WinA()
					SetError(2)
					Return 0
				Else
					MsgBox(0,"","Данный пиксель не удовлетворяет "&$Case&"-му условию", 1)
					WinA()
					$x1 = $Check[0]+1
					$y1 = $Check[1]
					$y2 = $Check[1]
				EndIf
			EndIf
		Else
			If  $y2 < $Con[3] Then
				$x1 = $Con[0]
				$x2 = $Con[2]
				$y2 = $Con[3]
				$y1 = $y1+1
			Else
				SetError(1)
				Return 0
			EndIf
		EndIf
	WEnd
EndFunc

Источник: Belfigor
 

Вложения

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 159
Репутация
2 329
Re: PixelSearchEx - PixelSearch с расширенными возможностями.

Так нельзя постить скрипты.

1. Он нерабочий.
2. Где собственно пример?
3. Желательно прогонять пример через Tidy.
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3 551
Репутация
930
Re: PixelSearchEx - PixelSearch с расширенными возможностями.

Почему не рабочий? о_О. В архиве содержится 3 файла. PixelSearchEx.au3, Example.au3 и PixelSearchEx - Test Image.gif. У меня все ищет и работает о_О
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 159
Репутация
2 329
Re: PixelSearchEx - PixelSearch с расширенными возможностями.

Belfigor [?]
Почему не рабочий?
AutoIt3 Syntax Checker v1.54.8 Copyright (c) Tylo 2007

PixelSearchEx.au3(13,27) : ERROR: $x1 already declared as parameter
Dim $x1 = $Check[0]+1,
~~~~~~~~~~~~~~~~~~~~~^
PixelSearchEx.au3(13,44) : ERROR: $y1 already declared as parameter
Dim $x1 = $Check[0]+1, $y1 = $Check[1],
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
PixelSearchEx.au3(13,212) : ERROR: $y2 already declared as parameter
Dim $x1 = $Check[0]+1, $y1 = $Check[1], $y2 = $Check[1] ;Определяем текущей областью сканирования остаток строки в которой был найден подошедший по цвету но не подошедший по дополнительным условиям пиксель.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
PixelSearchEx.au3(18,22) : ERROR: $x1 already declared as parameter
Dim $x1 = $Con[0],
~~~~~~~~~~~~~~~~~^
PixelSearchEx.au3(18,37) : ERROR: $x2 already declared as parameter
Dim $x1 = $Con[0], $x2 = $Con[2],
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
PixelSearchEx.au3(18,182) : ERROR: $y2 already declared as parameter
Dim $x1 = $Con[0], $x2 = $Con[2], $y2 = $Con[3] ;Определяем X координату левого верхнего угла и X и Y координаты правого нижнего в соответствии с полученными изначально данными.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
Example.au3(124,27) : ERROR: $x1 already declared as parameter
Dim $x1 = $Check[0]+1,
~~~~~~~~~~~~~~~~~~~~~^
Example.au3(124,44) : ERROR: $y1 already declared as parameter
Dim $x1 = $Check[0]+1, $y1 = $Check[1],
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
Example.au3(124,212) : ERROR: $y2 already declared as parameter
Dim $x1 = $Check[0]+1, $y1 = $Check[1], $y2 = $Check[1] ;Определяем текущей областью сканирования остаток строки в которой был найден подошедший по цвету но не подошедший по дополнительным условиям пиксель.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
Example.au3(129,22) : ERROR: $x1 already declared as parameter
Dim $x1 = $Con[0],
~~~~~~~~~~~~~~~~~^
Example.au3(129,37) : ERROR: $x2 already declared as parameter
Dim $x1 = $Con[0], $x2 = $Con[2],
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
Example.au3(129,182) : ERROR: $y2 already declared as parameter
Dim $x1 = $Con[0], $x2 = $Con[2], $y2 = $Con[3] ;Определяем X координату левого верхнего угла и X и Y координаты правого нижнего в соответствии с полученными изначально данными.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
Example.au3 - 12 error(s), 0 warning(s)
Кроме этого, функция CheckPixel используется самой UDF, а выводится в примере, что в корне неправильно.

И ещё, к UDF должна быть хоть какая то документация.
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3 551
Репутация
930
Re: PixelSearchEx - PixelSearch с расширенными возможностями.

Документацию допишу, как написано в описании функция CheckPixel - это любая функция определенная пользователем обрабатывающая условия связанные с проверкой пикселя. Ее невозможно написать для всех одну, поэтому и включать ее в сам PixelSearchEx нет смысла.

UPD: Подправил описание и оформление внутри скрипта. Что касается ошибок, не нашел не одной, у меня скрипт работает на ура в том же виде что выложен тут о_О.
То что Syntax Checker подсвечивает повторные использования Dim как ошибку не делает скрипт не рабочим.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 159
Репутация
2 329
Re: PixelSearchEx - PixelSearch с расширенными возможностями.

Belfigor [?]
Ее невозможно написать для всех одну, поэтому и включать ее в сам PixelSearchEx нет смысла.
Тогда не нужно её использовать из PixelSearchEx.

То что Syntax Checker подсвечивает повторные использования Dim как ошибку не делает скрипт не рабочим.
Ок, он может и рабочий, но всё ровно это следует поправить, проверка синтаксиса не должна показывать ошибки. Тем более что это неправильный пример подражания для остальных, если уже скриптить, то правильно ;).
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3 551
Репутация
930
Re: PixelSearchEx - PixelSearch с расширенными возможностями.

Просто там бывают такие моменты, когда например надо переопределить маленький массив целиком.
Dim $1[4] = [1,2,3,4]
$1[4] = [5,6,7,8]
не работает и выводит ошибку, в таких случая приходится пользоваться повторяющимися Dim
Dim $1[4] = [1,2,3,4]
Dim $1[4] = [5,6,7,8]
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 159
Репутация
2 329
Re: PixelSearchEx - PixelSearch с расширенными возможностями.

Belfigor [?]
в таких случая приходится пользоваться повторяющимися Dim
В таких случаях массив передаётся ByRef, или создаётся временный.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 159
Репутация
2 329
Re: PixelSearchEx - PixelSearch с расширенными возможностями.

Над кнопкой «Подробнее» написанно «Пример:», так а где собственно пример?

:
P.S
Я не придираюсь (стараюсь по крайней мере :smile: ), просто чтобы на будущее было проще и понятнее для всех.
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3 551
Репутация
930
Re: PixelSearchEx - PixelSearch с расширенными возможностями.

Ну... Я просто скопировал шаблон твоего сообщения из какой-то другой темы и подставил свое, если над кнопкой "Подробнее" должно быть написано что-то другое то исправить не долго. Щас там содержимое самого файла PixelSearchEx.au3 :smile:.
P.S. исправил архив и код в сообщении.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 159
Репутация
2 329
Re: PixelSearchEx - PixelSearch с расширенными возможностями.

Belfigor [?]
Я просто скопировал шаблон твоего сообщения из какой-то другой темы и подставил свое
Я так и понял :smile: . Почитай Правила обязательного оформления публикаций.

Щас там содержимое самого файла PixelSearchEx.au3
Обычно если есть файл, то незачем дублировать в сообщении, однако было бы полезнее (или для заманчивости :smile: ) добавить именно пример, т.е содержание файла Example.au3.
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3 551
Репутация
930
Re: PixelSearchEx - PixelSearch с расширенными возможностями.

Исправил, вроде теперь оформление идеальное
 

syavak

Чайник
Сообщения
12
Репутация
1
Re: PixelSearchEx - PixelSearch с расширенными возможностями.

Belfigor сказал(а):
Func Test() ;Задайте X и Y правого верхнего угла черной области тестовой картинки.
Думаю тут должно быть
Func Test() ;Задайте X и Y левого верхнего угла черной области тестовой картинки.
 

SVNa

Чайник
Сообщения
9
Репутация
0
Re: PixelSearchEx - PixelSearch с расширенными возможностями.

Здравствуйте!

При включенной Opt("MustDeclareVars", 1)
выдаёт ошибку на строку

Variable used without being declared

Код:
$Check = PixelSearch($x1, $y1, $x2, $y2, $Con[4], $Con[5], $Con[6], $Con[7])
Код:


Как можно это исправить ?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Re: PixelSearchEx - PixelSearch с расширенными возможностями.

SVNa
выдаёт ошибку на строку
Variable used without being declared
...
Как можно это исправить ?
Объявить Global или Local ту переменную, на которую ругается SciTE. :smile:
 

SVNa

Чайник
Сообщения
9
Репутация
0
Re: PixelSearchEx - PixelSearch с расширенными возможностями.

madmasles сказал(а):
SVNa
выдаёт ошибку на строку
Variable used without being declared
...
Как можно это исправить ?
Объявить Global или Local ту переменную, на которую ругается SciTE. :smile:
Спасибо большое!
помогло обьявить Local $Check
 

Zaramot

I ♥ AutoIt
Сообщения
1 160
Репутация
657
Re: PixelSearchEx - PixelSearch с расширенными возможностями.

А кому нужно искать пиксель ? :wacko:
 

anonymous7

Новичок
Сообщения
40
Репутация
8
Re: PixelSearchEx - PixelSearch с расширенными возможностями.

Мне вот не понятно условие Case - что это за условие и что им задаётся, как им пользоваться. :scratch:
 

Duero

Чайник
Сообщения
14
Репутация
3
Re: PixelSearchEx - PixelSearch с расширенными возможностями.

Подскажите, вот в данной UDF идет поиск группы пикселей одного цвета, а как осуществить поиск группы пикселей разных цветов?
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
963
Re: PixelSearchEx - PixelSearch с расширенными возможностями.

Предупреждение Duero за нарушение общих правил (пункт В.8):
Так как эта конференция называется "Русское сообщество AutoIt", язык общения на ней - Русский. Названия фирм или программных продуктов, аббревиатуры и т.д. должны быть написаны так, как они пишутся в оригинале, например не следует писать УСБ вместо USB. На форуме крайне не рекомендуется намеренно искажать русский язык и использовать "сетевой жаргон" на подобии "Аффтар выпей йадау!".


С уважением, ваш Модератор.
 
Верх