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