|
#1
|
||||
|
||||
Сканер цвета
Доброго времени суток!
Помогите пожалуйста с модулем - он же сканер цвета. Вот код модуля, в котором 3 процедуры. Код:
unit Unit2; interface uses Classes, Graphics; type TScan = class(TThread) private Procedure FindVisual; Procedure Control; protected procedure Execute; override; end; Var Scan : TScan; implementation Uses Unit1; { TScan } Procedure TScan.FindVisual; Begin Form1.Panel1.Color:= clLime; End; Procedure TScan.Control; Begin Form1.Panel1.Color:= clRed; End; procedure TScan.Execute; var x,y : integer; begin Repeat For x:=X1 To X2 Do For y:=Y1 To Y2 Do // If GetPixel(c.Handle,x,y)=Cl Then If c.Pixels[x,y]=Cl Then Synchronize(FindVisual); Until Terminated; end; end. Procedure TScan.Execute - сканирует указанную область экрана на соответствие цвета, который выбран в ColorDialog на основной форме и если условие выполняется, то передает команду процедуре TScan.FindVisual. Procedure TScan.FindVisual - обрабатывает результаты со сканера и выполняет действие № 1. Проблема возникла вот в чем. Как правильно прописать в процедуре TScan.Execute условие когда в заданой области нет того самого цвета, который выбран в ColorDialog на основной форме и передать команду процедуре TScan.Control, которая будет выполнять действие № 2. Спасибо заранее! |
#2
|
||||
|
||||
Да нет, немного по-другому этот код работает чем описано, образец не с экрана поступает, а из битмапа с, проще отслеживать напрямую, примерно так
Код:
var DC: HDC; begin DC:= GetDC(0); Panel2.Color:= GetPixel(DC, X, Y); ReleaseDC(0, DC); end; Идею в принципе уловил, непонятки лишь насчёт отслеживаемых пикселей что в промежутке между X1Y1..X2Y2, как они определяются, предложенный из drkb кусман проверен на обработчике сдвига мышки, панелька окрашивается в цвет пикселя что под курсором, оно работает Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
LIONSMILE (27.06.2018)
|
#3
|
||||
|
||||
Добрый вечер многоуважаемый Alegun!
Туть суть немного в другом. Цвет панели, это как бы я указал просто, опеределенное действие. А теперь поясню чтобы не было как раз тех самых непоняток. С главной формы я определяю координаты области экрана (верхний левый угол - X1Y1, правый нижний угол - X2Y2), в компоненте ColorDialog указываю необходимый цвет (например красный), который должен находиться в области X1Y1 X2Y2, и если он там есть то выполняется одно условие. Вот этот и есть модуль-сканер цвета, который запускается по таймеру каждые 15 секунд, и проверяет это самое условие, т.е. если допустим красный цвет попадает в область X1Y1 X2Y2 то программа выполняет действие (пускай будет клик мышки). А если сканер не находит этот красный цвет, то останавливает выполнения действия (клик мышки), при этом сканер продолжает работать и искать все в той же области искомый цвет (красный) с тем же интервалом 15 секунд, и если через вдруг при очередном сканировании находит искомый красный цвет, то возобновляет выполнение действия (клик мышки). Этот код я видел, он мне немного не пожходит вот почему. Тут условие такое, что мышь в это время находится вне области X1Y1 X2Y2 и выполняет опеределенное действие, а этот код и определяет цвет под курсором, т.е. в том месте где находится мышь, при этом координаты нахождения мыши на экране фиксированы и записаны (т.е. никаких лево и право) и она соответственно будет бить все время в один пиксель, в одном месте. У меня собственно в сканере (код выше) получилось сделать так: Код:
procedure TScan.Execute; var x,y : integer; begin Repeat For x:=X1 To X2 Do For y:=Y1 To Y2 Do // If GetPixel(c.Handle,x,y)=Cl Then If c.Pixels[x,y]=Cl Then Synchronize(FindVisual); else If c.Pixels[x,y]<>Cl Then Synchronize(Conrtol); Until Terminated; end; Но тут проблема у меня в <>Cl и я это понимаю, так как значение CL может быть и больше и меньше, и оно может тоже попадать в область X1Y1 X2Y2 соответсвенно это не то требование, которое мне нужно. А как по уму записать это условие, у меня чот голова не догоняет пока. Т.е. нужно следующее - если в области X1Y1 X2Y2 искомый цвет то выполняется процедура 1, если в этой же области этого цвета нет, то выполняется процедура 2. Однако этот искомый цвет может появляться и исчезать периодически. Для этого собственно и сделал сканер, который работает по времени. Добиться того чтобы выполнялось действие 1 у меня в принципе получилось, вот теперь осталось получить действие 2 при работе сканера... а на что заменить вот этот кусок If c.Pixels[x,y]=Cl я не знаю. Последний раз редактировалось LIONSMILE, 27.06.2018 в 18:21. |
#4
|
|||
|
|||
1. комбинация "<>" означает "не равно".
2. if в else там вообще не нужен, бо как цвет либо равен, либо не равен, т.е. код можно переделать так: Код:
procedure TScan.Execute; var x,y : integer; begin Repeat For x:=X1 To X2 Do For y:=Y1 To Y2 Do If c.Pixels[x,y]=Cl Then Synchronize(FindVisual) Else Synchronize(Conrtol); Until Terminated; end; ЗЫ. Ну и ошибка там в коде была, так что он вообще компилиться не должен был. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
LIONSMILE (28.06.2018)
|
#5
|
||||
|
||||
Тогда здесь в циклах вроде проверять нужно весь диапазон, типа
Код:
procedure TScan.Execute; var x,y : integer; flg: boolean; begin flg:= false; Repeat For x:=X1 To X2 Do For y:=Y1 To Y2 Do If c.Pixels[x,y]=Cl then flg:= true; if flg Then Synchronize(FindVisual) Else Synchronize(Conrtol); Until Terminated; end; Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
LIONSMILE (28.06.2018)
|
#6
|
||||
|
||||
Alegun, Lmikle Огромное спасибо! Все работает.
|