Что нового

Colors.au3 (CheckPixel, TrimColor, GetSimpleColor)

Lexx98

Продвинутый
Сообщения
272
Репутация
73
;;; Функция TrimColor была описана в теме с рецензиями товарищем Арчи. Она просто вычисляет среднее значение трёх составляющих цвета.

;;; Функция CheckPixel проверяет наличие в прямоугольнике x1, y1; x2, y2 точки с более высоким TrimColor чем заданный $light
UPD. Улучшил функцию CheckPixel.
- Прежде всего убрал из цикла вычисление одного и того же тримколора (будет работать чуть быстрее).
- Добавил 6-й необязательный параметр, верхняя граница яркости, по умолчанию чисто белый.
- Проверка на нижнюю границу идёт теперь не строго больше, а больше либо равно.
-- Так что теперь можно искать не только более яркую точку, но и более тёмную Для этого в $light посылаете 0x00 (чёрный), а в $light2 тот цвет, не ярче которого ищется точка. Или необходимые границы.
-- Дабы не добавлять проверок на десятичность числа, теперь можно вводить в параметрах $light(1и2) не сам цвет в шестнадцатиричном виде, а его яркость (тримколор) в шестнадцатиричном виде. То бишь к примеру 0x00 = как чёрный, 0xFF как белый.
- Ещё обновление функции CheckPixel. Смотреть пост номер 4, перенёс и в первый пост тоже.

Старый вариант
Код:
Func CheckPixel($x1, $y1, $x2, $y2, $light, $light2=0xFFFFFF)
Local $i, $j, $pixelfound=0, $PTcolor, $l1t, $l2t
$i=$y1
$l1t=TrimColor($light)
$l2t=TrimColor($light2)
While $i<=$y2 and $pixelfound==0
$j=$x1
While  $j<=$x2 and $pixelfound==0
$PTcolor=TrimColor("0x"&Hex(PixelGetColor($j, $i), 6))
if $PTcolor>=$l1t and $PTcolor<=$l2t then 
$pixelfound=1
endif
$j+=1
WEnd
$i+=1
WEnd
return $pixelfound
EndFunc ; =>CheckPixel


Func TrimColor($TargetTrim)
;cs TrimarkColor - Comment Start
;Исползуется для получения из цвета в формате RGB значение яркости пикселя. Возвращает значение от 0 до 255.
;Скорость:
;Функция выполняется за ~0.06-0.10 мс.
;(с) Archy26 :)
;#ce TrimarkColor - Comment End
Dim $a, $a_fin
$a = Hex($TargetTrim, 6)
$a_fin = (Dec(StringTrimRight($a, 4)) + Dec(StringTrimLeft(StringTrimRight($a, 2), 2)) + Dec(StringTrimLeft($a, 4)))/3
$TargetTrim = Round($a_fin, 0)
Return $TargetTrim
EndFunc

Последний вариант

Код:
Func CheckPixel($x1, $y1, $x2, $y2, $light, $light2=0xFF)
Local $i, $j, $pixelfound=0, $PTcolor, $l1t, $l2t
$i=$y1
if $light>0xFF then
 $l1t=TrimColor($light)
else
 $l1t=$light
endif
if $light2>0xFF then
  $l2t=TrimColor($light2)
else
 $l2t=$light2
endif
While $i<=$y2 and $pixelfound==0
$j=$x1
While  $j<=$x2 and $pixelfound==0
$PTcolor=TrimColor("0x"&Hex(PixelGetColor($j, $i), 6))
if $PTcolor>=$l1t and $PTcolor<=$l2t then
$pixelfound=1
endif
$j+=1
WEnd
$i+=1
WEnd

return $pixelfound
EndFunc ; =>CheckPixel


Func TrimColor($TargetTrim)
;cs TrimarkColor - Comment Start
;Исползуется для получения из цвета в формате RGB значение яркости пикселя. Возвращает значение от 0 до 255.
;Скорость:
;Функция выполняется за ~0.06-0.10 мс.
;(с) Archy26 :)
;#ce TrimarkColor - Comment End
Dim $a, $a_fin
$a = Hex($TargetTrim, 6)
$a_fin = (Dec(StringTrimRight($a, 4)) + Dec(StringTrimLeft(StringTrimRight($a, 2), 2)) + Dec(StringTrimLeft($a, 4)))/3
$TargetTrim = Round($a_fin, 0)
Return $TargetTrim
EndFunc


UPD. 15.03.2011
Примеры.

Для области 150:30 - 160:31

Проверка на точку ярче 0х30
if CheckPixel(150, 30, 160, 31, 0x30) then

На точку темнее 0x80
if CheckPixel(150, 30, 160, 31, 0x00, 0x80) then

На точку с яркостью между 0x30 и 0x80
if CheckPixel(150, 30, 160, 31, 0x30, 0x80) then

Убеждаемся что нет точки ярче 0x80
if CheckPixel(150, 30, 160, 31, 0x80)==0 then

Убеждаемся что все точки ярче 0x30 (= нет точек темнее)
if CheckPixel(150, 30, 160, 31, 0x00, 0x30)==0 then


UPD 22 декабря 2011.
Код:
Func GetSimpleColor($x1, $y1, $mnoj=1)
Dim $a, $cred, $cgreen, $cblue, $c1, $c2, $c3
$a = Hex(PixelGetColor($x1, $y1), 6)
$cred = Dec(StringTrimRight($a, 4))
;$as = Dec($as)
$cgreen = Dec(StringTrimLeft(StringTrimRight($a, 2), 2))
;$as1 = Dec($as1)
$cblue = Dec(StringTrimLeft($a, 4))
if $cred>=$cgreen*$mnoj then
 if $cred>=$cblue*$mnoj then
  $c1="red"
   if $cblue>=$cgreen then
    $c2="blue"
    $c3="green"
   else
    $c2="green"
    $c3="blue"
   endif
 else 
  $c1="blue"
  $c2="red"
 endif
else
 if $cgreen>=$cblue*$mnoj then
  $c1="green"
   if $cblue>=$cred then
    $c2="blue"
    $c3="red"
   else
    $c2="red"
    $c3="blue"
   endif
 else
  if $cblue>=$cgreen*$mnoj then
   $c1="blue"
   $c2="green"
  else
   $c1="grey"
  endif
 endif
endif


return $c1

EndFunc ; => GetSimpleColor

Функция вычисления доминирующего простого цвета - красного, зелёного, синего, градиента серого.
Важно понимать параметр множителя. При дефолтном множителе в 1, цвет 0х919090 будет приниматься как красный, хотя по сути он серый. Множитель - это величина, во сколько раз должен быть показатель основного цвета ярче остальных.
Увы, плохо сработает при низких яркостях, но их можно отсекать CheckPixel-ом, да и обычно там, где требуется определить цвет, он довольно яркий. У меня обычно используется множитель 1.2 - 1.3
Вы можете сами поиграться, и посмотреть какие результаты выдаёт функция на каких цветах в зависимости от множителя.
Для правильной работы множитель должен быть больше или равен 1.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Re: Colors.au3 (CheckPixel и TrimColor)

Переноси со всех форумов все свои темы, дублирующие перенесенные мною будут стерты.
 

Archy26

EVE DEVE eve bot development group
Сообщения
60
Репутация
42
Re: Colors.au3 (CheckPixel и TrimColor)

Ох японский городовой!
Лекс прости меня, ради бога, что я не посмотрел код внимательнее раньше!
Вот жеж ты намутил-то!!!
1) Тримкалор возвращает число от 0 до 255. Для чего каждый раз задавать (и вычислять её к тому же) последнюю переменную? Это замедляет и без того несовершенную в своей заторможенности графическую проверку отягощая её ненужными вычислениями.
Сделай проверочку, что если переменная $light2 равна значению от нуля до 255, то и вичислять её не нужно. задаёшь нужное значение от 0 до 255 и вуаля.
едем дальше:
2) Зачем вообще задавать какой-то определённый цвет, если мы по-яркости ориентируемся? Чем меньше всех этих вычислений, через трим, тем лучше :smile:
3) В общем, найду минут 5 напишу функцию, чтобы не быть голословным.
 
Автор
L

Lexx98

Продвинутый
Сообщения
272
Репутация
73
Re: Colors.au3 (CheckPixel и TrimColor)

Нате, минута кодирования...
Код:
Func CheckPixel($x1, $y1, $x2, $y2, $light, $light2=0xFFFFFF)
Local $i, $j, $pixelfound=0, $PTcolor, $l1t, $l2t
$i=$y1
if $light>0xFF then
 $l1t=TrimColor($light)
else 
 $l1t=Dec($light)  
endif
if $light2>0xFF then
 if $light2<0xFFFFFF then
  $l2t=TrimColor($light2)
 else
  $l2t=255
 endif
else
 $l2t=Dec($light2)  
endif
While $i<=$y2 and $pixelfound==0
$j=$x1
While  $j<=$x2 and $pixelfound==0
$PTcolor=TrimColor("0x"&Hex(PixelGetColor($j, $i), 6))
if $PTcolor>=$l1t and $PTcolor<=$l2t then 
$pixelfound=1
endif
$j+=1
WEnd
$i+=1
WEnd
return $pixelfound
EndFunc ; =>CheckPixel


Дабы не добавлять проверок на десятичность числа, теперь можно вводить в параметрах $light(1и2) не сам цвет в шестнадцатиричном виде, а его яркость (тримколор) в шестнадцатиричном виде. То бишь к примеру 0x0 = как чёрный, 0xFF как белый.
Пока что не запускал, но по идее багов быть де должно.

И спасибо за ценные замечания.
 

Archy26

EVE DEVE eve bot development group
Сообщения
60
Репутация
42
Re: Colors.au3 (CheckPixel и TrimColor)

Ога, уже лучше.
Я прошу прощения.
У меня щас времени много по-идее, но сил нету ни на что - очень сильно болею. Час-два ясного сознания, и потом опять жар и бред, лекарства и процедуры... ууууффф... Болеть это плохо.
 
Автор
L

Lexx98

Продвинутый
Сообщения
272
Репутация
73
Re: Colors.au3 (CheckPixel и TrimColor)

В общем, нашёл таки баг, когда попробовал задавать яркость в формате 0хАА. Оно оказывается прекрасно понимает что 0хFF есть 255 (и десятичные легко и правильно сравниваются с 16-тиричными без дополнительных преобразований), и дополнительно Децимировать его не надо, оно тогда становится совсем не 255.
Так что убрал Dec а также ещё одну проверку, потому что последний параметр по умолчанию теперь передаётся не цветом чёрный, а сразу яркостью 0xFF. Вот последний вариант. Должен работать как следует.

Код:
Func CheckPixel($x1, $y1, $x2, $y2, $light, $light2=0xFF)
Local $i, $j, $pixelfound=0, $PTcolor, $l1t, $l2t
$i=$y1
if $light>0xFF then
 $l1t=TrimColor($light)
else
 $l1t=$light
endif
if $light2>0xFF then
  $l2t=TrimColor($light2)
else
 $l2t=$light2
endif
While $i<=$y2 and $pixelfound==0
$j=$x1
While  $j<=$x2 and $pixelfound==0
$PTcolor=TrimColor("0x"&Hex(PixelGetColor($j, $i), 6))
if $PTcolor>=$l1t and $PTcolor<=$l2t then 
$pixelfound=1
endif
$j+=1
WEnd
$i+=1
WEnd

return $pixelfound
EndFunc ; =>CheckPixel
 

Archy26

EVE DEVE eve bot development group
Сообщения
60
Репутация
42
Re: Colors.au3 (CheckPixel и TrimColor)

Лекс, а почему ты в месте где можно использовать конечный цикл со счётчиком for\next используешь бесконечный цикл while\wend, и ещё счётчик к нему прикручиваешь? лшняя работа по-моему.
 
Автор
L

Lexx98

Продвинутый
Сообщения
272
Репутация
73
Re: Colors.au3 (CheckPixel и TrimColor)

Ответ прост. Зачем мне проверять все 100 точек (к примеру, в области 10 на 10), если уже к примеру на 10-й сработает проверка? В итоге в данном случае мой вариант сработает в 10 раз быстрее чем полная проверка.
Хотя, не помню точно, можно ли прервать выполнение for...next, просто это мне в тот момент показалось более логичным, и если for...next в автоите всё-таки прерываемый, тогда я об этом не знал или не думал.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Re: Colors.au3 (CheckPixel и TrimColor)

Любой цикл прерывается командой ExitLoop
 

Enemy

Знающий
Сообщения
42
Репутация
7
Re: Colors.au3 (CheckPixel и TrimColor)

Здравствуйте, почему мне ошибку выдает:
$PTcolor=TrimColor("0x"&Hex(PixelGetColor($j, $i), 6))
$PTcolor=^ ERROR

Что я не так делаю? Указал
Func CheckPixel($x1=317, $y1=99, $x2=318, $y2=100, $light=255, $light2=0x00) вначале
 
Автор
L

Lexx98

Продвинутый
Сообщения
272
Репутация
73
Re: Colors.au3 (CheckPixel и TrimColor)

В общем - почитайте хелп о вызове функций. И вообще, вам надо теории почитать хоть немного, раз уж вы совсем в программировании не понимаете.
В данном случае нужно вызывать так:
CheckPixel(317, 99, 318, 100, 255, 0x00)
И то оно не сработает. Читайте описание функции. Цвет 2 можно не задавать, если вам нужно найти точку ярче заданной. Цвет 1 задаётся в 16-ричном коде. Вида 0xNN где NN есть 16-ричное число.

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

Хоть убейте, не пойму что полезного нашли в предыдущем сообщении... :blink:
 

Enemy

Знающий
Сообщения
42
Репутация
7
Re: Colors.au3 (CheckPixel и TrimColor)

If CheckPixel(317, 99, 318, 100, 0x00, 0x01)=0x00 Then

ошибка:
$PTcolor=TrimColor("0x"&Hex(PixelGetColor($j, $i), 6))
$PTcolor=^ ERROR
Вот смотрите, я задаю область 317-99 на 318-100 т.е.2 на 2 пикселя, мне нужно найти черный цвет в этом квадрате, если его нет, выполнять какие-то действия
Правильно?
 
Автор
L

Lexx98

Продвинутый
Сообщения
272
Репутация
73
Re: Colors.au3 (CheckPixel и TrimColor)

Enemy сказал(а):
If CheckPixel(317, 99, 318, 100, 0x00, 0x01)=0x00 Then

ошибка:
$PTcolor=TrimColor("0x"&Hex(PixelGetColor($j, $i), 6))
$PTcolor=^ ERROR
Вот смотрите, я задаю область 317-99 на 318-100 т.е.2 на 2 пикселя, мне нужно найти черный цвет в этом квадрате, если его нет, выполнять какие-то действия
Правильно?

If CheckPixel(317, 99, 318, 100, 0x00, 0x00)==0 Then
два знака равенства в сравнении. И сравнивать с 0 (отсутсвие) или 1 (наличие).
Поправил. Вот условие на ненахождение чёрной точки.

Само собой, чтобы работало, нужно вставить не только CheckPixel функцию себе в код, но и TrimColor. В общем, весь код в теге автоита в первом посте.

Оффтоп. Ушёл спать. :smile:
 

NoMad73rus

Продвинутый
Сообщения
124
Репутация
80
Re: Colors.au3 (CheckPixel и TrimColor)

SirMaksFromEho, извиняюсь, но не логичнее будет сделать возврат True/False из функции? Вариантов то всего два, а при использовании это избавит от лишних равенств:
Код:
if CheckPixel(...) then ...
if not CheckPixel(...) then ...
 
Автор
L

Lexx98

Продвинутый
Сообщения
272
Репутация
73
Re: Colors.au3 (CheckPixel и TrimColor)

Я могу ошибаться, но вроде автоит позволяет делать такие условия без переделки функции. При этом просто 0 приравнивается к False а всё что не 0 - к True.
По крайней мере первый вариант работает точно (я его и в примерах написал), и во всех скриптах оно у меня так работает.
 

running-frag

why me?
Сообщения
441
Репутация
60
Re: Colors.au3 (CheckPixel и TrimColor)

бывает такие моменты, когда у нас БГ не совсем одноцветное (ну как пример какой нить градиент от 001515 до 001212, тогда функция становится полностью нерабочая)
немного переделал, добавлено по сути одно условие - разница должна быть больше чем N (50 в моём случае)

Код:
Func my_CheckPixel ($x1, $y1, $x2, $y2, $_color)
	Local $_found = False
	Local $_pixel
	Local $_trim_color
	
	$_trim_color = TrimColor ($_color)
	
	For $x = $x1 To $x2
		For $y = $y1 To $y2
			
			$_pixel = TrimColor ("0x"& Hex (PixelGetColor ($x, $y), 6))
			
			If $_pixel > $_trim_color And (Abs($_pixel - $_trim_color) > 50) Then
				;ConsoleWrite (@CR& Abs($_pixel - $_trim_color)&@CR)
				; 1. Если Trim пикселя больше чем начального цвета (того что мы воодили).
				; 2. Если разница (по модулю текущий трим минус вводнимый) больше чем 50.
				$_found = True
				Return $_found
			EndIf
			
		Next
	Next
	
	#cs
	While $i <= $y2 And $pixelfound == 0
		$j = $x1
			While $j <= $x2 and $pixelfound == 0
				$_pixel = TrimColor ("0x"&Hex (PixelGetColor ($j, $i), 6))
				
				If $_pixel >= $_color_trim And $_pixel <= $_ctop_trim And ($l1t +50) > 100 then 
					$pixelfound = 1
					ConsoleWrite (@CR& "PTCOLOR: " &Hex (PixelGetColor ($j, $i), 6) &" is trimer then "& $light&@CR)
					ConsoleWrite ($PTcolor&@CR)
				endif
				
				$j += 1
			WEnd
		$i += 1
	WEnd
#ce
	return $_found
EndFunc


ps: это как возможные доработки скрипта для ТС (всё таки с него лепил своё)
 
Автор
L

Lexx98

Продвинутый
Сообщения
272
Репутация
73
Re: Colors.au3 (CheckPixel и TrimColor)

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

running-frag

why me?
Сообщения
441
Репутация
60
Re: Colors.au3 (CheckPixel и TrimColor)

на последний и смотрел

ам ну пример смотри какой, овервью в еве
если рамка есть (овервью выбран) то пиксель затемняется (внутренний пиксель белой рамки), и если мы делаем с него отсчёт, то след. пиксель (будет другой) будет светлее, но мы же ищем "намного" светлее, т.е. по сути мы добавили минимум светлости (разница между стартовым пикселем и пикселем в зоне поиска)

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


Добавлено:
Сообщение автоматически объединено:

и ещё добавлю, если у нас цвет динамический, т.е. по тому же овервью, есть три варианта ;)
1. static
2. hovered
3. selected + hovered

и в этих трёх пунктам твоё вариант не справляется, поэтому и переписал специальную "разницу в яркости относительно стартового"

в общем там много чего накладывается, короче как сказано выше - писал под личные нужды


Добавлено:
Сообщение автоматически объединено:

подробнее отпишу в личку
 
Автор
L

Lexx98

Продвинутый
Сообщения
272
Репутация
73
Re: Colors.au3 (CheckPixel и TrimColor)

Даже при двойном осветлении (выделен + наведена мышка) фон там будет не ярче определённого значения (а всё нужное-важное, как раз ярче его в любом случае). Вот я всегда его и проверяю. И не мучаюсь сначала с фоном чёрного, потом с фоном одинарного осветления, потом с двойного...

Вообще, я тебя не совсем понял. Давай с картинками показывай! Мало ли кому ещё будет полезно это разобрать.
 

running-frag

why me?
Сообщения
441
Репутация
60
Re: Colors.au3 (CheckPixel и TrimColor)

у меня не чёрная тема ингейм, это меняет дело?

upd:в моё случае я просто "играюсь" числом (в моём случае это 50, градация белого) а не отлавливаю "максимальное значение цвета"
 
Верх