Что нового

ImageSearch.au3 и все что связано с этой библиотекой

Shk_Alex

Новичок
Сообщения
11
Репутация
0
Либо у меня мозг не варит, либо руки не от туда....

Правильно я понимаю как пользоваться этой надстройкой?:

Берем ImageSearch.dll.ХХbit.rar
распаковываем
переименовываем (убираем .ХХbit )
Копируем в папку Windows или любую путь к которой указан в умолчаниях.
Так?

Вот мой результат:
if $result[0]="0" then return 0
if $result^ ERROR


Тут: http://autoit-script.ru/index.php?topic=3026.0 он решился перемещением DLL в папку со скриптом. Мне не помогло...

UPD переименовываем (убираем .ХХbit и добавляем DLL в названии)
 
Автор
Belfigor

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Это DLL. Ее можно использовать везде где есть команды работы с DLL
 

edward_freedom

Осваивающий
Сообщения
200
Репутация
44
Belfigor
Чтобы я не делал, никак не получаеться, обидно очень :'(
AutoItX3.dll я смог использовать почти все функции, кроче PixelSearch.А тут облом :( Может поможешь) :beer:
 
Автор
Belfigor

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Я не разбираюсь в работе с длл. Попробуй использовать длл из AutoHotKey, функции ImageSearchDll выдраны от тудова.
 

anonymous7

Знающий
Сообщения
40
Репутация
8
Если кому пригодится добавил параметр $hwnd, но работает только с видимыми окнами.
 

mousekey

вот он какой, серверный олень
Сообщения
8
Репутация
5
В файле с параметром $hwnd ошибка, если $resultPosition равен 0 (возвращать верхний левый угол изображения), то этот код, вычисляющий координаты с учетом положения окна не отработает. Выложил поправленный вариант.
С моей же стороны вопрос - как бы сделать возвращаемые координаты по клиентской части окна? Т.е. вместо WinGetPos что-то вроде WinGetClientPos, т.к. сейчас приходится ради одной этой функции выставлять:
Opt("PixelCoordMode", 0)
Opt("MouseCoordMode", 0)

А хотелось бы, чтобы они были в
Opt("PixelCoordMode", 2)
Opt("MouseCoordMode", 2)

update: нашел реализацию этой функции в этой теме: http://autoit-script.ru/index.php/topic,2497.msg18137.html#msg18137 (она там в спойлере)
 

AntiCuster

Новичок
Сообщения
1
Репутация
1
не находит скрин что в файле
$x = 0
$y = 0
$left = 0
$top = 0
$right = 300
$bottom = 180
$result = _ImageSearchArea("123.bmp", 1, $left, $top, $right, $bottom, $x, $y, 1)
If $result = 1 Then
MouseClick("left", $x, $y, 1)
EndIf
Sleep(500)
точнее действий нет что в условии
 

valdur2000

Знающий
Сообщения
155
Репутация
7
Здравствуйте, скачал архивы, imagesearch.au3 положил в include, ImageSearchDLL.dll положил в windows\System32, в папку со скриптом и в папку include. создал простейший скрипт:

Код:
#include <imagesearch.au3>
_ImageSearch("C:\AutoIt\otelo\1.jpg",0,48, 119,0)


вот такая ошибка на выходе:

C:\AutoIt\test.au3(3,57) : ERROR: _ImageSearch() called with Const or expression on ByRef-param(s).
_ImageSearch("C:\AutoIt\otelo\1.jpg",0,48, 119,0)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
C:\Program Files\AutoIt3\Include\imagesearch.au3(30,76) : REF: definition of _ImageSearch().
Func _ImageSearch($findImage,$resultPosition,ByRef $x, ByRef $y,$tolerance)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
C:\AutoIt\test.au3 - 1 error(s), 0 warning(s)
ошибка показывает на закрывающую скобку. система Win 7 32bit.
Плиз хелп.

ответ, надо было объявить локальные переменные
Код:
#include <imagesearch.au3>
Local $x="48",$y="119"
_ImageSearch("C:\AutoIt\otelo\1.jpg",0,$x,$y,0)

вопрос снят.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Код:
#include <imagesearch.au3>
$XPoint = 48
$YPoint = 119
_ImageSearch("C:\AutoIt\otelo\1.jpg",0,$XPoint,$YPoint,0)

В параметрах функии есть ByRef
 

Exhale

Darkness for eternity
Сообщения
11
Репутация
0
Вот занимаюсь сейчас ботов для одной браузерки, и столкнулся с кучкой проблем.

Дело в том, что в процессе выполнения бота постоянно надо проверять области на наличее тех или иных изображений (кнопок и т.д. и т.п.). Решил эту проблему путем проверки 1-2 пикселей фиксированного цвета, фиксированного расположения. Все идеально работает, быстро качественно, без ошибок. Но есть одна большая проблема - бот заточен под браузер Google Chrome на разрешении экрана 1600х900 - но стоит изменить браузер или разрешение и ничего естественно не работает.

Сложность заключается в том, что даже без смены разрешения - в IE например те же самые пиксели имеют временами совершенно не прогнозируемые координаты а то еще зачастую и поцвету отличаются. Про смену разрешения я говорить вообще боюсь.

Пример.
В Chrome проверяем пиксели 890,546 с цветом #FFDCA9 и 800,463 с цветом #0019D9 - все ок.
А в IE те же самые пиксели имеют корды 864,540 с цветом #FСDC99 и 876,456 с цветом #0110СF

Разрешение это еще больший трабл. При смене разрешение - возможно выпадание некоторых пикселей напрочь.

IE вообще я давно понял что убожество полное, ибо я еще сайты пишу и не по наслышке знаю, сколько с ним бывает проблем.

Хочется сделать бота универсальным. Т.е. что бы пользрватель запускал бота на любом браузере с любым разрешением и все работало.

Так вот вопрос к знатокам - может кто-нибудь посоветует пути реализации этого нюанса?
Как вариант можно использовать долгие (ну не сликшом) функции - например человек запускает бота в первый раз в данном браузере (с данным разрешением экрана) - и бот однократно анализирует браузерку - записывая координаты и цвета в ini допустим - откуда в последствии берет данные.

PixelChecksum кстати почему-то криво работает - если на десктопе все работает прямо, то в браузерке - контрольная сумма почему-то все время скажет на одно и том же регионе при отсутствии всяких видимых изменений картинки.
 
Автор
Belfigor

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Вирт машина на которую любой желающий поставит какой угодно браузер и какое угодно разрешение из того что ты предложишь.
 

EVEGamer

Знающий
Сообщения
27
Репутация
12
Код:
Func _ImageSearch($IS_FindImage,ByRef $IS_Left,ByRef $IS_Top,$IS_Right,$IS_Bottom)
	$IS_FindImage="*"&0x10&" "&$IS_FindImage
	$IS_Result=DllCall("ImageSearch.dll","str","ImageSearch","int",$IS_Left,"int",$IS_Top,"int",$IS_Right,"int",$IS_Bottom,"str",$IS_FindImage)
    If Not IsArray($IS_Result) Or $IS_Result[0] = "0" Then Return 0
	$IS_Array = StringSplit($IS_Result[0],"|")
	$IS_CoordFindX=Int(Number($IS_Array[2]))
	$IS_CoordFindY=Int(Number($IS_Array[3]))
	Return 1
EndFunc
 

mousekey

вот он какой, серверный олень
Сообщения
8
Репутация
5
Выкладываю допиленный ImageSearch.au3 с исправленной ошибкой, про которую я упоминал выше, плюс добавлена функция

Код:
Func _ImageSearchClientArea($findImage, $resultPosition, ByRef $x, ByRef $y, $tolerance, $hwnd)

которая корректно работает при
Код:
Opt("PixelCoordMode", 2)
Opt("MouseCoordMode", 2)

и указании правильного $hwnd который, к примеру, можно получить так:

Код:
Global $handle = WinGetHandle($windowName, "")
 
Автор
Belfigor

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
mousekey
добавил данный вариант в первый пост
 

person888

Новичок
Сообщения
9
Репутация
1
А как реализовать
Код:
Func _ImageSearchAreaClientArea($findImage, $resultPosition, $left , $top , $right , $bottom ,  ByRef $x, ByRef $y, $tolerance, $hwnd)

Чтобы он искал в области клиента окна

Это была бы отличная функция
 
Автор
Belfigor

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Код:
WinGetPos ( "title" [, "text"] )
WinGetClientSize ( "title" [, "text"] )

[box title=Немного теории о том как использовать эти команды]У стандартного окна не являющегося Embended по дефолту есть Header и Border. Многие ботоводы пытаются намеренно отвязать своих ботов от привязки к позиции окна используя команды
Код:
Opt("PixelCoordMode", 2) ;Отсчет координат пикселей от левого верхнего угла клиентской части окна
Opt("MouseCoordMode", 2) ;Отсчет координат мыши от левого верхнего угла клиентской части окна

Увы это не всегда решает проблему, поэтому приходится прибегать к математическим расчетам.

Header - шапка окна
Border - левая, правая и нижняя рамка окна. Бордеры всегда равны друг другу.
Команда WinGetPos возвращает тебе X,Y окна и W,H окна.
Команда WinGetClientSize возвращает тебе W,H именно клиентской части окна, то есть без учета хэдера и бордеров.

Зная W,H окна([2],[3] от WGP) и W,H клиентской части ([0],[1] от WGCS), по формуле
((Wокна - Wклиента)/2) мы узнаем Wбордера которая равна Hбордера
По формуле
(Hокна - Hклиента - Hбордера) мы узнаем Hхэдера

После этих несложных манипуляций мы имеем размеры хэдера и бордера.

Далее используя ячейки (0),[1] от WGP (X,Y) и высчитанные выше хэдер и бордер (H,B), мы по формуле
X1=X+H, Y1=Y+B
можем узнать именно X1,Y1, клиентской части LT (LeftTop) окна.
Далее прибавив к X1,Y1 размер клиентской части окна ([0],[1] от WGCS) по формуле
X2=X1 + Wклиента, Y2=Y1+Hклиента
мы получаем X2,Y2 клиента, являющиеся RB(RightBottom) клиента, которые уже можно успешно скармливать в эту функцию: _ImageSearchAreaClientArea.

Как результат у нас есть все параметры нужные для работы. Все вычисления можно запихнуть в отдельную функцию и применить ее как надстройку для ImageSearch.
[/box]
Пока писал, обнаружил баг, нельзя отобразить в сообщении следующий текст:
открывающая квадратная скобка - ноль - закрывающая квадратная скобка
 

person888

Новичок
Сообщения
9
Репутация
1
Спасибо, вот что получилось. Работает правда очень медленно

Код:
Func _ImageSearchAreaClientArea($findImage, $resultPosition, $xp , $yp , $dw, $dh , ByRef $x, ByRef $y, $tolerance, $hwnd)

	If $hwnd <> 0 Then
		Local $clientWindowPos = _WinGetClientPos($hwnd)
		If @error Then Return 0
		Local $clientWindowSize = WinGetClientSize($hwnd)
		If @error Then Return 0
	Else
		Return 0
	EndIf

	If $clientWindowSize[0] = 0 Or $clientWindowSize[1] = 0 Then
		Return 0
	EndIf

	If $hwnd <> 0 Then
		Local $wpos = _WinGetClientPos($hwnd)
		$x = $x - $wpos[0]
		$y = $y - $wpos[1]
		$xp1 = $xp+$wpos[0]
		$yp1 = $yp+$wpos[1]
		$dw1 = $dw+$wpos[0]
		$dh1 = $dh+$wpos[1]
	EndIf

	If $tolerance > 0 Then $findImage = "*" & $tolerance & " " & $findImage
	Local $result = DllCall("ImageSearchDLL.dll", "str", "ImageSearch", "int", $xp1, "int", $yp1, "int", $dw1, "int", $dh1, "str", $findImage)
	;MsgBox( 64 , "Test Coord" , $xp1 & "|" & $yp1 & "|" & $dw1 & "|" & $dh1 & " original|" & $xp & "|" & $yp & "|" & $dw & "|" & $dh)
	; If error exit
	If $result[0] = "0" Then Return 0

	; Otherwise get the x,y location of the match and the size of the image to
	; compute the centre of search
	Dim $array = StringSplit($result[0], "|")

	$x = Int(Number($array[2]))
	$y = Int(Number($array[3]))
	If $resultPosition = 1 Then
		$x = $x + Int(Number($array[4]) / 2)
		$y = $y + Int(Number($array[5]) / 2)
	EndIf

	Return 1
EndFunc

Func _WinGetClientPos($hwnd)
	Local $Size = WinGetClientSize($hwnd)

	If Not IsArray($Size) Then
		Return SetError(1, 0, 0)
	EndIf

	Local $tPOINT = DllStructCreate($tagPOINT)

	For $i = 1 To 2
		DllStructSetData($tPOINT, $i, 0)
	Next
	_WinAPI_ClientToScreen($hwnd, $tPOINT)
	If @error Then
		Return SetError(1, 0, 0)
	EndIf

	Local $Pos[4]

	For $i = 0 To 1
		$Pos[$i] = DllStructGetData($tPOINT, $i + 1)
	Next
	For $i = 2 To 3
		$Pos[$i] = $Size[$i - 2]
	Next

	Return $Pos
EndFunc   ;==>_WinGetClientPos
 
Верх