1

Тема: AHK: Помогите разобраться с PixelSearch

Добрый день.
Есть такой код:

PixelSearch, Px, Py, 0, 0, 1920, 1080, 0xFFE597, 0, fast
MouseMove, %Px%, %Py%

Т.е. он должен искать по всему экрану пиксел имеющий цвет "FFE597", при нахождении перемещает туда курсор.
Но этого не происходит, я весь форум переискал и попробовал каждый код, всё равно не работает.
Что не так?
Заранее благодарен за помощь.

2

Re: AHK: Помогите разобраться с PixelSearch

Либо такого пикселя просто нет, либо Вы не разобрались с Coordmode. Этот код находит нужный цвет в активном окне.

Кстати, в русскоязычной справке нет перевода CoordMode и  PixelSearch. Есть желающие поработать?

3 (изменено: minoss, 2010-12-26 12:37:22)

Re: AHK: Помогите разобраться с PixelSearch

ypppu пишет:

Либо такого пикселя просто нет, либо Вы не разобрались с Coordmode. Этот код находит нужный цвет в активном окне.

Такой пиксель есть, и даже не один.
Соглашусь с вами, я скорее всего не разобрался с CoordMode, но как бы я не пробовал его прописать, всё равно ничего не работает.
Буду благодарен, если скажите как нужно правильно.

4

Re: AHK: Помогите разобраться с PixelSearch

Попробуйте погонять скрипт на рабочем столе с цветами 0xFFFFFF и 0x000000.
Потом проверьте, что искомый цвет точно 0xFFE597, а не 0x97E5FF например.

5

Re: AHK: Помогите разобраться с PixelSearch

ypppu пишет:

Попробуйте погонять скрипт на рабочем столе с цветами 0xFFFFFF и 0x000000.
Потом проверьте, что искомый цвет точно 0xFFE597, а не 0x97E5FF например.

На рабочем столе работает.
А мне то нужно искать данный цвет пикселя не на рабочем столе а в определённом активном приложении.
Искомый цвет я определил при помощи "пипетки" программы "FastStone Capture", а это значит что такой пиксель 100% присутствует.
Вот по этому то я и решил спросить, в чём же проблема...

6

Re: AHK: Помогите разобраться с PixelSearch

minoss пишет:

Соглашусь с вами, я скорее всего не разобрался с CoordMode

Учитываете, что PixelSearch по умолчанию ищет цвет в формате BGR? В то время, как большинство программ представляет цвет в формате RGB.

7

Re: AHK: Помогите разобраться с PixelSearch

ypppu пишет:

Учитываете, что PixelSearch по умолчанию ищет цвет в формате BGR? В то время, как большинство программ представляет цвет в формате RGB.

К сожалению я этого не знал. Но даже если бы сразу знал, то думаю изменился бы только вопрос.
Я перевёл FFE69A в 9AE6FF, но всё равно; возможно я просто не понял.

8

Re: AHK: Помогите разобраться с PixelSearch

Потренируйтесь в другом окне с этим цветом (например в Paint) . В худшем случае у Вас программа какая-то особенная, не позволяет искать пиксел.

9

Re: AHK: Помогите разобраться с PixelSearch

Правильно так:

CoordMode, Pixel
CoordMode, Mouse
PixelSearch, Px, Py, 0, 0, 1920, 1080, 0x9AE6FF   ; если так сработает, можно попробовать добавить ", 0, Fast"
MouseMove, Px, Py
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10

Re: AHK: Помогите разобраться с PixelSearch

teadrinker, не работает.

11 (изменено: ypppu, 2013-01-15 12:14:42)

Re: AHK: Помогите разобраться с PixelSearch

Да есть много всяких программ, которые делают и определение пикселя и ещё очень много всего, но правильно работающие платные, и делают не совсем то, что хотелось бы.
Я через AHK уже много для неё сделал, но как я писал в соседней теме (http://forum.script-coding.com/viewtopic.php?pid=43043) проблема у меня ещё и в MouseMove, хоть работает, но всегда по разному, опять же, не смотря на Coordmode.
Но если что, то вот весь мини-скриптик:

WinWait, MyApp, 
IfWinNotActive, MyApp, , MyApp, 
WinWaitActive, MyApp, 
sleep, 3000
CoordMode, Pixel
CoordMode, Mouse
PixelSearch, Px, Py, 0, 0, 1920, 1080, 0x19EF19, 0, Fast
MouseMove, %Px%, %Py%

А вот что происходит... Открывается окно "MyApp", ждёт 3 сек., и ничего не происходит, абсолютно; даже закрыть программу через "Exit" в трее не получается (т.е. меню даже не появляется).
Вот такие пироги

12

Re: AHK: Помогите разобраться с PixelSearch


CoordMode, Pixel, Window
nazhWhile := 0					; Ожидает появления nazhimaite.bmp
while (nazhWhile == 0) {
	ImageSearch, varX, varY, 0, 0, A_ScreenWidth, A_ScreenHeight, % "*50 *Trans000000 " "img\items\nazhimaite.bmp"
	if (ErrorLevel == 0) {
		nazhWhile := 1
		
		varX += 19
		varY += 64
		
	} else {
		sleep 50
	}
}
PixelGetColor, pix_color, varX, varY	; под найденным элементом получаем цвет пикселя
srch_pix_x1 := varX - 15					; задаём область поиска вокруг этой точки
srch_pix_y1 := varY - 15
srch_pix_x2 := varX + 15
srch_pix_y2 := varY + 15

PixelSearch, find_x, find_y, srch_pix_x1, srch_pix_y1 , srch_pix_x2, srch_pix_y2, pix_color
SendPlay {Click, %find_x%, %find_y%, 0}

Поиск на изображении в окне Paint.net скрина в *.bmp формате. Как только доходит до инструкции PixelSearch работа залипает на поиске, что как описал оратор выше, сценарий зависает до окончания поиска и его вырубить можно только через диспетчер, или долго подождав, пока отработает. С CoordMode перепробовал все варианты, к переменным в инструкции PixelSearch ставил проценты. Не понимаю, как правильно делается запись, но очень нужно. Подскажите пожалуйста.

13

Re: AHK: Помогите разобраться с PixelSearch

PixelSearch, find_x, find_y, srch_pix_x1, srch_pix_y1 , srch_pix_x2, srch_pix_y2, pix_color, 0, Fast

Так лучше?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

14

Re: AHK: Помогите разобраться с PixelSearch

Шикарно! Дай Вам Бог долгих лет жизни!

15

Re: AHK: Помогите разобраться с PixelSearch


nazhWhile := 0					; Ожидает появления nazhimaite.bmp
while (nazhWhile == 0) {
	ImageSearch, varX, varY, 0, 0, A_ScreenWidth, A_ScreenHeight, % "*50 *Trans000000 " "img\items\nazhimaite.bmp"
	if (ErrorLevel == 0) {
		nazhWhile := 1
		
		varX += 19
		varY += 64
		
	} else {
		sleep 20
	}
}

PixelGetColor, pix_color, varX, varY

srch_pix_x1 := varX - 11	; общая область поиска
srch_pix_y1 := varY - 11
srch_pix_x2 := varX + 11
srch_pix_y2 := varY + 11

pix_x1 := srch_pix_x1		; изменяемые стартовые координаты области поиска
pix_y1 := srch_pix_y1

coordArr := Object()
err := 0
pix_count := 0
while (err != 2) {
	PixelSearch, find_x, find_y, pix_x1, pix_y1, srch_pix_x2, srch_pix_y2, pix_color, 0, Fast
	if (ErrorLevel == 0) {
		err := 0
		coordArr.Push(find_x, find_y)
		pix_x1 := % find_x + 1
	} else if (ErrorLevel == 1) {
		pix_x1 := srch_pix_x1
		pix_y1 := % find_y + 1
		err++
	}
	pix_count++
}

my_var := 1
while (my_var < pix_count * 2) {
	x := coordArr[my_var]
	y := coordArr[my_var + 1]
	SendPlay {Click, %x%, %y%, 0}
	my_var += 2
	sleep 50
}

MsgBox % "Найдено пикселей ->`n" pix_count

Подскажите пожалуйста, нужно, чтобы в целом, были найдены все пиксели выбранного цвета в указанной области, а потом прокликать по ним. Но как-то криво работает, не пойму в чём причина. =/

16 (изменено: serzh82saratov, 2016-04-27 23:11:55)

Re: AHK: Помогите разобраться с PixelSearch


2:: 
	For k, v in Obj := SeveralSearch(100, 1, 111, 11, 0x000000) 
		Click % v[1] " " v[2]
	MsgBox % "Найдено пикселей ->`n" Obj.MaxIndex()
	Return

SeveralSearch(x1, y1, x2, y2, Color, Variation = 0, RGB = "")  {
	prY := y2, ErrorCount := 0, Coords := []
	Loop
	{
		PixelSearch, mX, mY, x1, y1, x2, y2, %Color%, %Variation%, Fast %RGB% 
		If (ErrorLevel && ++ErrorCount > 1)
			Break
		If (mY = "" || mY > prY)
			x1 := 0, y1 := prY + 1, prY := y2
		Else
			x1 := mX + 1, ErrorCount := 0, prY := mY, Coords.Push([mX, mY])
	} 
	Return Coords
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

17

Re: AHK: Помогите разобраться с PixelSearch

Красиво, но возвращаемый массив содержит пустые переменные почему-то. То есть он содержит количество найденных объектов, но их координаты отсутствуют. Уточните пожалуйста эту деталь, если у Вас работает и спасибо за Ваше время.

18

Re: AHK: Помогите разобраться с PixelSearch

	For k, v in Obj := SeveralSearch(100, 1, 111, 11, 0x000000) 
		MsgBox % "x" v[1] " y" v[2]
	MsgBox % "Найдено пикселей ->`n" Obj.MaxIndex()
	Return

Что, так ничего?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

19 (изменено: KusochekDobra, 2016-04-27 23:13:06)

Re: AHK: Помогите разобраться с PixelSearch

Да, я так же, через MsgBox смотрел.

20

Re: AHK: Помогите разобраться с PixelSearch

Ну тогда не знаю, оно в одном месте

Coords.Push([mX, mY])

массив заполняет, соответственно и MaxIndex оттуда же. У меня работает.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

21

Re: AHK: Помогите разобраться с PixelSearch

Вот я в параметры вызова вместо чисел подставляю переменные результирующие область поиска и так же, цвет, полученный в результате PixelGetColor. Первым сообщением получаю "x =  y = ", а вторым "Найдено пикселей -> 26", соответственно в пустые координаты не кликает. Свой, работающий криво код убрал в комментарий. Осваиваю синтаксис после другого софта, поэтому не ведаю практически никаких тонкостей.

22

Re: AHK: Помогите разобраться с PixelSearch

У вас с такой картинкой работает? Отправьте архив с картинкой на которой не работает.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

23

Re: AHK: Помогите разобраться с PixelSearch

Дело то не в картинке. Если подставить MsgBox после


; предыдущий код
x1 := mX + 1, ErrorCount := 0, prY := mY, сoords.Push([mX, mY])
MsgBox % mX " " mY

То показывает оба числа, а когда Return возвращает результат заполненного 26-ю объектами массива, то его элементы не содержат этих значений. Картинка здесь отрабатывает свою функцию на 100%
Хотя, если я правильно делаю запись, то если сразу извлекать их в MsgBox, то первый элемент содержит координаты, а следующие уже нет.


x1 := mX + 1, ErrorCount := 0, prY := mY, сoords.Push([mX, mY])
MsgBox % coords[A_Index, 1] " " coords[A_Index, 2]

24

Re: AHK: Помогите разобраться с PixelSearch

Хотя, если я правильно делаю запись

Нет там не каждой итерации происходит запись.

Дело то не в картинке. Если подставить MsgBox

Так там уже MsgBox где надо стоит, у меня при запуске из архива находит 11 пикселей, и все их кликает. Вы код из архива запускали, или я зря стараюсь?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

25

Re: AHK: Помогите разобраться с PixelSearch

Да, запускал, благодарю за труды. Но мы, вероятно, говорим о двух разных сценариях, с разными же условиями. Я пытаюсь приманстырить Ваш вариант к своему, а Вы, рассуждаете о функциональности своей поделки вне этого контекста, поэтому у Вас и должно всё работать. Но целью, должно быть, чтобы работало у меня.

26

Re: AHK: Помогите разобраться с PixelSearch

И как это сделать в контексте отсутствия полного кода?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

27 (изменено: KusochekDobra, 2016-04-28 01:06:10)

Re: AHK: Помогите разобраться с PixelSearch

Подставьте пожалуйста мою поделку и передайте параметрами переменные, которые она должна получить. Нарисуйте в пайнте квадратик такой же взяв его цвет. Если не будет работать, то наверое нужно комп перезагрузить, может он на меня обиделся. А обманывать Вас не вижу никаких причин. Ещё раз низко кланяюсь за упорство разъяснять нубу его неправоту.

А выше посмотрите, там всё есть.

28

Re: AHK: Помогите разобраться с PixelSearch


nazhWhile := 0					; Ожидает появления nazhimaite.bmp
while (nazhWhile == 0) {
	ImageSearch, varX, varY, 0, 0, A_ScreenWidth, A_ScreenHeight, % "*50 *Trans000000 " "img\items\nazhimaite.bmp"
	if (ErrorLevel == 0) {
		nazhWhile := 1
		varX += 19
		varY += 64
	} else {
		sleep 20
	}
}

PixelGetColor, pix_color, varX, varY ; получает цвет пикселя под найденным объектом

srch_pix_x1 := varX - 11	; общая область поиска 22 х 22 пикселя
srch_pix_y1 := varY - 11
srch_pix_x2 := varX + 11
srch_pix_y2 := varY + 11

pix_x1 := srch_pix_x1		; изменяемые стартовые координаты области поиска
pix_y1 := srch_pix_y1

coordArr := []
err := 0, pix_count := 0
while (err != 2) {
	PixelSearch, find_x, find_y, pix_x1, pix_y1, srch_pix_x2, srch_pix_y2, pix_color, 0, Fast
	if (ErrorLevel == 0) {
		err := 0
		coordArr.Push(find_x, find_y)
		pix_x1 := % find_x + 1
		pix_count++
	} else if (ErrorLevel == 1) {
		pix_x1 := srch_pix_x1
		pix_y1 := % find_y + 1
		err++
	}
}
my_var := 1
while (my_var < pix_count * 2) {
	x := coordArr[my_var]
	y := coordArr[my_var + 1]
	SendPlay {Click, %x%, %y%, 0}
	my_var += 2
	sleep 50
}

MsgBox % "Найдено пикселей ->`n" pix_count

Весь код.
Первый вайл можно не брать в расчёт. Искать для пущей точности теста лучше треугольник. Поскольку его положение известно, искать пиксели в небольшой области вокруг него. У меня pix_x1 и pix_y1 - это верхний левый угол области поиска,  который я смещаю на один пиксель вправо всякий раз, когда пиксель найден и на один пиксель вниз, когда не найден, возвращая при этом pix_x1 в исходное положение. Логично, что подряд 2 фейла утверждают, что справа после последнего найденного пикселя таких же нет и в следующей строке так же, прекращая поиск. Последний цикл просто перебирает координаты перемещая по ним курсор, дабы визуально подтвердить, что не зря хлебом кормили. Всё вроде правильно, но на деле находит 221 пиксель, после чего катает курсор по правой границе треугольника сверху вниз, как будто не происходит


pix_x1 := srch_pix_x1

возвращающего ИКС координату области поиска в исходное положение.

Я с уважением отношусь к грамотно оформленному коду, предлагающему более изящное решение, чем мой способ "в лоб", но последний хотя бы мышь тягает по экрану, хоть и не так, как требуется. Быть может Вы взглянете опытным взором, где я "не там" запятую может поставил, или не дописал чего?

В предыдущем софте единственной функцией можно было получить массив с координатами, а здесь вот, приходится изобретать этот велосипед, но у того проекта возможностей в разы меньше, чем у АНК и он не развивается уже давно. Поэтому придётся приложить много упорства, чтобы перевести все прошлые работы в новый функционал. Я здесь если не навсегда, то на долго и в отсутствии достойной литературы и очень фрагментированных знаний об этом инструменте, надеюсь на понимание местных жителей.

29

Re: AHK: Помогите разобраться с PixelSearch

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

30

Re: AHK: Помогите разобраться с PixelSearch

Большое спасибо! Переписал всё в чистый вариант и заработало, а если подставить в тестовый сценарий, то почему-то не работает, хотя всё лишнее убрано в комментарий.


Click % v[1] " " v[2]

Не водит мышкой, но


SendPlay {Click, %x%, %y%, 0}

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

У меня не сложный код. Вместо вызова метода, выполняются все те же операции. Ошибку свою понял, когда спать уже пошёл. Поиск следующего пикселя нужно осуществлять не просто со следующей координаты ИКС, но правую часть области поиска нужно поднимать на высоту координаты y1, чтобы поиск осуществлялся строке. Иначе, если следующий за найденным пиксель не окажется на месте, будет найден тот, что ниже, со следующей ИКС координатой, если такой имеется, при этом  все предыдущие пиксели найдены не будут. Поэтому он у меня и катал курсором по правому краю треугольника, от вершины к основанию. Но всё равно почему-то клацает неправильно. Теперь зависает на первом пикселе. =/

Вот вариант, который был необходим. В метод добавил 4 переменные, чтобы модифицируемая область поиска возвращалась к координатам области поиска, передаваемой параметрами. Так немного быстрее происходит анализ.

31

Re: AHK: Помогите разобраться с PixelSearch

Разобрался со своей проблемой. Как позже обратил внимание в гугль переводе справки по PixelSearch, в скобочках указано, что в случае, если пиксель не будет найден, то параметры получающие координаты окажутся пустыми. Что в принципе было обнаружено в поиске решения. Жаль, что Вы не сочли важным хотя бы бегло посмотреть на скудные строки моего скромного сценария, предпочитая не указывать на ошибки, а предлагая своё решение без пояснений. Как всякий нуб, нуждался я именно в первом. Но в любом случае, за участие спасибо!

32 (изменено: serzh82saratov, 2016-05-02 13:40:32)

Re: AHK: Помогите разобраться с PixelSearch

KusochekDobra пишет:

Разобрался со своей проблемой.

Не совсем, правильнее так:


SeveralSearch(ix1, iy1, w, h, Color, Variation = 0, RGB = "")  {
	x1 := ix1, y1 := iy1, x2 := ix1 + w - 1, y2 := iy2 := iy1 + h - 1
	ErrorCount := 0, Coords := []
	Loop
	{
		PixelSearch, mX, mY, x1, y1, x2, y2, %Color%, %Variation%, Fast %RGB%
		If (mY = "" && ++ErrorCount > 1)
			Break
		If (mY = "")
			x1 := ix1, y1 += 1, y2 := iy2
		Else
			x1 := mX + 1, y1 := y2 := mY, ErrorCount := 0, Coords.Push([mX, mY])
	}
	Return Coords
}

для удобства x2, y2 заменил на ширину и высоту. Вот архив с картинкой. Предложенное мною решение было перекопировано с поиска картинки, с пикселем после найденного высоту области лучше сводить к единице. Ну и конечно поправил ошибку с x1 := 0.

хотя для этого значения нужно предварительно извлекать в другие переменные.

Как видите из архива, не надо.

Жаль, что Вы не сочли важным хотя бы бегло посмотреть на скудные строки моего скромного сценария, предпочитая не указывать на ошибки, а предлагая своё решение

Зачем, если переписав чужой код я написал бы тоже самое что и предложил.

без пояснений. Как всякий нуб, нуждался я именно в первом.

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui