Что нового

PixelGetColor - как получить на выходе значение цвета в RGB

Invasion168

Новичок
Сообщения
12
Репутация
0
Итак. Задался целью написания бота.
Суть в следующем: в конкретной области экрана появляется число, бот строит матрицу этого числа и выводит msgbox с ним (на самом деле цели задачи намного глубже но на данном этапе реализовать собственными силами не получится).
Итак, представим, что у нас появляется картинка числа 1 размером 5на7 пикселей => что ее матрицу можно представить так:
0 0 0 0 0
0 0 1 0 0
0 1 1 0 0
0 0 1 0 0
0 0 1 0 0
0 0 0 0 0
Значит, строчно можно 1 записать как (00000 00100 01100 00100 00100 00000)
Ну это так, теория.
На практике сразу же произошла беда, которая состоит в след:
Код:
$iX1Y1 = PixelGetColor(1267, 163)
MsgBox(0,"nomer_cveta", $iX1Y1)

Число которое в итоге выдает не совпадает ни с одним из известных мне нумераций числа!
Итак плавно подобрался к вопросу: что же это за число? :scratch:
1dfce0e421eb.jpg

ЗЫ. Надо наверное сразу предупредить:
только начал учиться програмировать, сначала изучал ВБ6 но понял что без подключения внешних ДЛЛ не обойтись.
В автоите же это вполне реально (для того он и создан)
По поводу ImageSearche - он у меня приципиально отказался работать, так что пришлось выдумывать свой алгоритм

Спасибо за внимание
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Re: PixelGetColor - объявляю ему войну.

Это Dec, тебе нужен Hex.
Код:
MsgBox(0,0,"Dec = "&$iX1Y1&@CR&"Hex = 0x"&(Hex($iX1Y1, 6))
 
Автор
I

Invasion168

Новичок
Сообщения
12
Репутация
0
re

Это Dec, тебе нужен Hex.
Код: AutoIt [Выделить]
MsgBox(0,0,"Dec = "&$iX1Y1&@CR&"Hex = 0x"&(Hex($iX1Y1, 6))

Спасибо. Значит пгк шифранул цвет.
Далее, скопировал ваш код, вставил и выдало ошибку. Ругается на эту строчку таким образом: Error parsing function call! Что то упустил ?
 
Автор
I

Invasion168

Новичок
Сообщения
12
Репутация
0
Re: PixelGetColor - объявляю ему войну.

Скобку перед Hex уберите.
Спасибо помогло
Итак. Первый этап преодолен. Интересно на каком я дальше застряну ) пошел писать код кривыми руками!
 

ynbIpb

Скриптер
Сообщения
399
Репутация
110
Re: PixelGetColor - объявляю ему войну.

скобка лишняя.
$iX1Y1 = 16120575
MsgBox(0, "", "Dec = "&$iX1Y1&@CR&"Hex = 0x"& Hex($iX1Y1, 6))
я разрабатывал нечто подобное для Lineage2, тут
1111li.png
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Re: PixelGetColor - объявляю ему войну.

Invasion168 [?]
Что то упустил ?
да, правила форума. срочно читать!
Предупреждение За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


Данные правила могут пополняться локальными правилами раздела.
Как правильно называть темы

"PixelGetColor - объявляю ему войну." - это неприемлемое название темы, переименуйте тему иначе она будет закрыта, а вам возможно будет выдан бан на несколько дней.

С уважением, Модератор форума.
 
Автор
I

Invasion168

Новичок
Сообщения
12
Репутация
0
я разрабатывал нечто подобное для Lineage2
Очень интересный код! Мне он вроде не подойдет, хотя...
Половину из него не понял т.к. туториалы по автоиту только неделю штудирую а учусь программировать всего второй месяц, чувствую себя первоклассником, пытающимся понять литературный образ Пьера Безухова, а также невероятную палитру Шагала. Опять лирика поперла. :scratch:

Надеюсь, со своим упорством и вашим терпением все же доведу дело до конца!

Зы. Каюсь, пару строк у вас свистнул :smile:. В итоге получил:
Код:
$iX1Y1 = PixelGetColor(1267, 163)
$iX1Y1 = Hex($iX1Y1, 6)
MsgBox(0,"nomer",$iX1Y1)
 
Автор
I

Invasion168

Новичок
Сообщения
12
Репутация
0
Итак. Думал я дальше думал, и пришел к такому:если допустим взять Dec всех пикселей числа и сложить - то получиться уникальный номер
представим:
1 = 1231238744
2 = 2344323423
3 = 3344522344 (это суммы всех пикселей числа)

возможно ли тогда сложить все пиксели??
(снова теория)
попробовал получить номера двух пикселей и сложить их
в итоге опять что-т намутил и выдало ошибку *видимо слабоват еще в азах синтаксиса*

Код:
$iX1Y1 = PixelGetColor(1267, 163)
$iX2Y1 = PixelGetColor(1268, 163)
$iC32 = $iX1Y1 + $iX2Y2
MsgBox(0,"chislo",$ic32)


ЗЫ Надеюсь вас не напрягает моя недалекость и постепенность ? :-\
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Invasion168 [?]
и выдало ошибку
А Вы читайте свой код перед запуском. У вас цвет в переменной $iX2Y1, а суммируете Вы неизвестную переменную $iX2Y2.
 
Автор
I

Invasion168

Новичок
Сообщения
12
Репутация
0
А Вы читайте свой код перед запуском.
вот уже неделю по три часа в сутки спавши разбираюсь с кодом :wacko:. Но согласен - ошибка не простительна, если хочу стать программистом надо быть внимательным!

У вас цвет в переменной $iX2Y1, а суммируете Вы неизвестную переменную $iX2Y2.
:whistle:
действительно дурацкая ошибка ) а я перелопатил весь гугл и туториалы на тему Func ... EndFunc
:beer:
:IL_AutoIt_1:
 

Belfigor

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

Invasion168

Новичок
Сообщения
12
Репутация
0
Писал я писал и в итоге написал вот такую некрасивую ерунду (кусочек вставляю), которая однако исправно работает:
Код:
$iX1Y13 = PixelGetColor(1325, 167)
$iX2Y13 = PixelGetColor(1326, 167)
$iX3Y13 = PixelGetColor(1327, 167)
$iX4Y13 = PixelGetColor(1328, 167)
$iX1Y23 = PixelGetColor(1325, 168)
$iX2Y23 = PixelGetColor(1326, 168)
$iX3Y23 = PixelGetColor(1327, 168)
$iX4Y23 = PixelGetColor(1328, 168)
$iX1Y33 = PixelGetColor(1325, 169)
$iX2Y33 = PixelGetColor(1326, 169)
$iX3Y33 = PixelGetColor(1327, 169)
$iX4Y33 = PixelGetColor(1328, 169)
$iX1Y43 = PixelGetColor(1325, 170)
$iX2Y43 = PixelGetColor(1326, 170)
$iX3Y43 = PixelGetColor(1327, 170)
$iX4Y43 = PixelGetColor(1328, 170)

$iQC1 = $iX1Y1 + $iX2Y1 + $iX3Y1 + $iX4Y1 + $iX1Y2 + $iX2Y2 + $iX3Y2 + $iX4Y2 + $iX1Y3 + $iX2Y3 + $iX3Y3 + $iX4Y3 + $iX1Y4 + $iX2Y4 + $iX3Y4 + $iX4Y4 + $iX1Y12 + $iX2Y12 + $iX3Y12 + $iX4Y12 + $iX1Y22 + $iX2Y22 + $iX3Y22 + $iX4Y22 + $iX1Y32 + $iX2Y32 + $iX3Y32 + $iX4Y32 + $iX1Y42 + $iX2Y42 + $iX3Y42 + $iX4Y42 + $iX1Y13 + $iX2Y13 + $iX3Y13 + $iX4Y13 + $iX1Y23 + $iX2Y23 + $iX3Y23 + $iX4Y23 + $iX1Y33 + $iX2Y33 + $iX3Y33 + $iX4Y33 + $iX1Y43 + $iX2Y43 + $iX3Y43 + $iX4Y43


Попробую объяснить что у нас тут происходит: мы берем номер цвета в области 4х4 пикселя и суммируем тем самым получив уникально число для данной области, если наглядно то это примерно так:
0 2 0 5
0 0 0 0
0 0 0 4
1 0 0 0
итого:12 ( в моем случае числа 9тизначные поэтому уникальность гарантирована)
Вопрос в следующем: можно ли вместо получения переменной одного пикселя сразу высчитать область, тем самым уменьшив код с 18 строк до 1 ? (на самом деле у меня сейчас 500 строк и хотелось бы для удобства уменьшить их количество не потеряв функциональности)
Но этот вопрос не так существенен, вот следующий вопрос на засыпку!

Можно ли задать случайное передвижения мыши по экрану в течении n-ного времени и можно ли задать нажатие клавиши мыши в заданной области но на произвольный пиксел этой области??
Если да, то можно ли показать приблизительный пример кода ?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Invasion168 [?]
получив уникально число для данной области
ИМХО, для этого можно использовать PixelChecksum(), но если Вам все же хочется самому это сосчитать, то можно попробовать так.
Код:
$iSumm = 0
$iXmin = 100
$iXmax = 110
$iYmin = 80
$iYmax = 90

For $i = $iXmin To $iXmax
	For $j = $iYmin To $iYmax
		$iSumm += PixelGetColor($i, $j)
	Next
Next
MsgBox(64, 'Info', '$iSumm = ' & $iSumm)

задать случайное передвижения мыши по экрану
Попробуйте так.
Код:
HotKeySet('{Esc}', '_Exit')
_RandomMouseMove()
$iStart = TimerInit()
While 1
	If TimerDiff($iStart) > 500 Then
		_RandomMouseMove()
		$iStart = TimerInit()
	EndIf
	Sleep(50)
WEnd

Func _Exit()
	Exit
EndFunc   ;==>_Exit

Func _RandomMouseMove()
	Local $i_X = Random(0, @DesktopWidth, 1), $i_Y = Random(0, @DesktopHeight, 1)
	MouseMove($i_X, $i_Y, Random(1, 50, 1))
EndFunc   ;==>_RandomMouseMove
 
Автор
I

Invasion168

Новичок
Сообщения
12
Репутация
0
madmasles - огромное спасибо, ответы получены! Функции разбираются (я же не просто тупо копи паст делаю, а пытаюсь вникнуть и на их примерах понять логику языка! :smile:)

Буду пробовать написать рандомное нажатие в области на этих двух примерах, мне кажется это возможно.
 
Автор
I

Invasion168

Новичок
Сообщения
12
Репутация
0
Итак труды дали свои плоды и я кое как написал следующее:
Код:
$iR = PixelGetColor(40, 90) ;16711680
$iT = 1
$iC = 1
While $iT <= 100
	$iC = 1
	$iR2 = PixelGetColor(40, 90) ;16711680
	    If $iR2 = 16711680 Then
			     MouseClick("left", 450, 500, $iC, 20)
			     MouseClick("left", 750, 540, 1, 50)
			 ElseIf $iR2 < 16711680 Then
				    MouseClick("left", 350, 500, $iC, 20)
			        MouseClick("left", 750, 540, 1, 50)
		EndIf
		Sleep(1000)
		$iR3 = PixelGetColor(40, 90) ;16711680
	    If  $iR3 = 16711680 Then
			While $iR3 = 0
				Sleep(1000)
			 MouseClick("left", 450, 500, $iC, 20)
			 MouseClick("left", 750, 540, 1, 20)
			 $iR3 = PixelGetColor(40, 90) ;16711680
			 WEnd
		ElseIf $iR3 < 16711680 Then
			While $iR3 = 16711680
			 MouseClick("left", 350, 500, $iC, 20)
			 MouseClick("left", 750, 540, 1, 20)
			 $iR3 = PixelGetColor(40, 90) ;16711680
			Wend
		EndIf
	Sleep(3000)
	$iR3 = PixelGetColor(40, 90) ;16711680
	$iT = $iT + 1
WEnd

программа работает так как надо но!!! хотелось бы что бы при каждом новом While $iR3 = 0 (While $iR3 = 16711680) значение количества кликов ($iC) увеличивалась по формуле $iC=$iC*2. Перепробовал все что знал и в итоге так и не понял как такое написать.
Поэтому обращаюсь к вам, т.к. это последний пункт правильного действия чтобы завершить программу
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Так?
Код:
;...
If  $iR3 = 16711680 Then
	$iC *= 2
	While $iR3 = 0
		Sleep(1000)
		MouseClick("left", 450, 500, $iC, 20)
		MouseClick("left", 750, 540, 1, 20)
		$iR3 = PixelGetColor(40, 90) ;16711680
	WEnd
;...
 
Автор
I

Invasion168

Новичок
Сообщения
12
Репутация
0
Нет не так )
While же выполняет все что находиться в теле до того момента пока аргумент перестанет быть правильным, а это может и не быть или быть много раз, так в случае многократности $iC удаивалось от предыдущего тоесть примерно так

While(1) - $iC=2
While(2) $iC=4
While(3) $iC=8
While(4) $iC=16
ну и так далее.
 
Верх