- Сообщения
- 3,608
- Репутация
- 941
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'и прописанные в обрабатывающей найденный пиксель функции - не предел для фантазии, в условия подставлять можно абсолютно все что угодно.
Пример:
Источник: Belfigor
Версия: 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