Author Topic: IF_PICTURE_IN - Для новичков  (Read 106179 times)

0 Members and 4 Guests are viewing this topic.

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
IF_PICTURE_IN - Для новичков
« on: March 07, 2019, 01:01:05 PM »
Очень часто вижу на форуме, как новички пытаются разобраться в том, как находить нужную картинку на экране. Мне это понятно, так как несколько лет назад сам тут ломал голову не одни сутки над этим ))) Решил написать для новичков подробный мануал на эту тему. Приступим...

1:
Начнем с того, что у  Clickermann-а, как и у других программ, нет реальных глаз, как у человека, и для того, чтобы "визуально" работать с экраном, ему нужно сделать снимок этого экрана и поместить в свой графический буфер. Вот этот снимок он и делает с помощью команды GETSCREEN. Если эта команада без координат, то Clickermann помещает в свой графический буфер скриншот ВСЕГО вашего экрана. Если же будут указаны координаты, как - GETSCREEN (x1, y1, x2, y2 ), то Clickermann поместит в свой графический буфер скриншот, сделанный строго в указанных координатах. Поехали дальше...

2:
Если после GETSCREEN (в следующей строке) вы используете команду COLORMODE и указываете режим COLORMODE-а, как - COLORMODE(5), то в буфер Clickermann-а поступает не та картинка, которая находится на вашем экране, а измененная, в зависимости от режима, указанного в команде COLORMODE. Для наглядности (чтобы было понятно) можно поиграться со следующим кодом. Только прежде, чем его запускать в кликере, сохраните этот скрипт в какую-либо папку.
Code: (clickermann) [Select]
GETSCREEN // Clickermann помещает в свой графический буфер скриншот вашего экрана
COLORMODE(3) // Применяет к этому скриншоту режим COLORMODE
SCREENSHOTFIX(0,0, $_xmax,$_ymax, "file.bmp") // Сохроняет скриншот, находящийся в его буфере, в папку, в которой будет сохранен этот скрипт
HALT // Останавливает скрипт
После того, как скрипт отработает, в папке, в которой он сохранен, появится скриншот вашего экрана. Откройте этот скриншот и посмотрите его. Потом установите в скрипте другой режим COLORMODE - к примеру COLORMODE(6), и повторите операцию. Вы увидите разницу, между первым скрином и тем, что появится во второй раз. Проанализировав эту разницу, вы можете понять - как работает команда COLORMODE. Идем далее...

3:
После того, как Clickermann отскринит ваш экран и поместит скрин в свой графический буфер, он будет готов приступить к анализу этого скриншота. В нашем случае, он будет готов к поиску вашей заготовленной картинки на том скриншоте, который находится в буфере Clickermann-а. Имейте в виду, что та заготовка картинки, которую вы будете искать, должна быть сделана в соответствующем режиме COLORMODE, который Clickermann применял к скриншоту вашего экрана, при помещении его в свой буфер, для анализа. Поиском картинки у нас занимается оператор - IF_PICTURE_IN. Не трудно понять, что перефразируя с английского языка, это выглядит как - ЕСЛИ_КАРТИНКА_В. И так, рассмотрим этот оператор подробнее...
Code: (clickermann) [Select]
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "file.bmp", -1, 100)
// IF_PICTURE_IN - Это - оператор, который говорит Clickermann-у о том, чем он будет заниматься, а именно - искать картинку
// 0,0, $_xmax,$_ymax - Это координаты, в которых Clickermann будет искать картинку
// file.bmp - Это собственно наш заготовленный скриншот, который мы будем искать "на экране"
// О таких параметрах, как -1 и 100, вполне понятно написано в справке Clickermann-а
Думаю, что с этим тоже разобрались...

4:
Далее у нас идет оператор END_IF, говорящий о закрытии условия - ЕСЛИ_КАРТИНКА_В
Есть еще один оператор, который мы можем использовать во всей этой теме. Это - ELSE. Вариантов перевода этого оператора с английского языка не мало, но в нашем случае подходит вариант - ИНАЧЕ. Вот, как выглядит полностью наш скрипт вместе с этим оператором:
Code: (clickermann) [Select]
GETSCREEN // Clickermann помещает в свой графический буфер скриншот вашего экрана
COLORMODE(3) // Применяет к этому скриншоту режим COLORMODE
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "file.bmp", -1, 100) // "ЕСЛИ_КАРТИНКА_В..." - ищет картинку в заданных координатах на скрине, находящемся в буфере.
   // Тут мы прописываем команды на случай, если картинка найдена.
ELSE // "ИНАЧЕ"
   // Тут прописываем действия на случай, если картинка не найдена.
END_IF // КОНЕЦ_"ЕСЛИ..." - конец условия

5:
Теперь создадим скрин, который в последствии будем искать на экране. Создадим скрин цифры "3:". Вставляем код в кликер, который дан в пункте "2:" этого поста, а далее смотрим видео...
https://www.youtube.com/watch?v=aasgn66DgtE
« Last Edit: December 06, 2019, 11:24:05 PM by Hito »
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: IF_PICTURE_IN - Для новичков
« Reply #1 on: March 07, 2019, 03:25:39 PM »
Еще необходимо описать процедуру подготовки и сохранения картинки в PAINT-е. У многих с этим возникают огромные трудности.
И можно в типовые алгоритмы отправлять.
Добавил )
Я не ду... Потому и не бу...

Alexxx

  • Зашел в гости
  • *
  • Posts: 9
    • View Profile
Re: IF_PICTURE_IN - Для новичков
« Reply #2 on: March 09, 2019, 02:33:59 PM »
Спасибо за информацию. Проясните пару моментов, пожалуйста.
 1). Получение скриншота небольшой области экрана как то ускоряет процесс в сравнении со скриншотом всего экрана, скажем, в Windows7(10)?
 2). Как на скриншоте части экрана задаются координаты поиска нужной области - от края полученной картинки или от края экрана?

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: IF_PICTURE_IN - Для новичков
« Reply #3 on: March 09, 2019, 05:52:07 PM »
Спасибо за информацию. Проясните пару моментов, пожалуйста.
 1). Получение скриншота небольшой области экрана как то ускоряет процесс в сравнении со скриншотом всего экрана, скажем, в Windows7(10)?
 2). Как на скриншоте части экрана задаются координаты поиска нужной области - от края полученной картинки или от края экрана?

1. При указании маленькой области снимка при разрешении например 1920х1080 сам процесс GETSCREEN отрабатывает в разы быстрее.

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

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: IF_PICTURE_IN - Для новичков
« Reply #4 on: March 09, 2019, 05:56:32 PM »
2. Размер скриншота не изменяется, просто обновляется только указанная область. Остальная часть снимка может содержать части старых снимков, если был снимок всего экрана, или вообще остаться черной.
Хм... А почему тогда, если я скриню пол экрана, то при SCREENSHOTFIX(0,0, $_xmax,$_ymax, "file.bmp"), у меня сохроняется скрин, на ктором только пол экрана...?
Я не ду... Потому и не бу...

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: IF_PICTURE_IN - Для новичков
« Reply #5 on: March 09, 2019, 06:01:57 PM »
Хм... А почему тогда, если я скриню пол экрана, то при SCREENSHOTFIX(0,0, $_xmax,$_ymax, "file.bmp"), у меня сохроняется скрин, на ктором только пол экрана...?

Запускаю код
Code: (clickermann) [Select]
GETSCREEN(100,100,500,500)
SCREENSHOTFIX(0,0, $_xmax,$_ymax, "file.bmp", 0)
HALT

В результате снимок равен размеру экрана, но при этом изменился только участок 100,100,500,500

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: IF_PICTURE_IN - Для новичков
« Reply #6 on: March 09, 2019, 06:28:50 PM »
Хм... А почему тогда, если я скриню пол экрана, то при SCREENSHOTFIX(0,0, $_xmax,$_ymax, "file.bmp"), у меня сохроняется скрин, на ктором только пол экрана...?

Запускаю код
Code: (clickermann) [Select]
GETSCREEN(100,100,500,500)
SCREENSHOTFIX(0,0, $_xmax,$_ymax, "file.bmp", 0)
HALT

В результате снимок равен размеру экрана, но при этом изменился только участок 100,100,500,500

Хм... Да...
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: IF_PICTURE_IN - Для новичков
« Reply #7 on: March 09, 2019, 06:30:30 PM »
Аааа... Я с привязкой к окну перепутал... В привязке если делаешь скрин, то "0,0, $_xmax,$_ymax" будет равно размеру окна, к которому кликер привязан.
Я не ду... Потому и не бу...

Alexxx

  • Зашел в гости
  • *
  • Posts: 9
    • View Profile
Re: IF_PICTURE_IN - Для новичков
« Reply #8 on: March 14, 2019, 06:30:08 PM »
Спасибо за развёрнутые ответы. А нет ли на форуме такой же темы для команды "IF_PIXEL_IN"? Поиск ничего не даёт. Не понятно, как прикрутить к команде какое либо действие при поиске нескольких цветов. Допустим, я ищу на участке скрина цвета красный и зелёный. Как сделать, что бы в зависимости от найденного цвета переменная принимала значение "1" (0), а в лог печаталось сообщение "красный" (зелёный)?

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: IF_PICTURE_IN - Для новичков
« Reply #9 on: March 14, 2019, 10:33:02 PM »
Как сделать, что бы в зависимости от найденного цвета переменная принимала значение "1" (0), а в лог печаталось сообщение "красный" (зелёный)?

Code: (clickermann) [Select]
GETSCREEN
IF_PIXEL_IN(0,0, $_xmax,$_ymax, 255)
   LOGWRITE ("Красный")
   $peremennaya = 1
else
   IF_PIXEL_IN(0,0, $_xmax,$_ymax, 122) // Я хз - какой там зеленый...
      LOGWRITE ("Зеленый")
      $peremennaya = 1
   else
      $peremennaya = 0
   END_IF
END_IF

IF($peremennaya)
   // какой-то цвет был найден - смотри лог
else
  // Никакого цвета не было найдено
END_IF
HALT
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: IF_PICTURE_IN - Для новичков
« Reply #10 on: March 15, 2019, 01:38:11 AM »
IF($peremennaya)
В данном случае $peremennaya выполняет функцию переменной типа - boolean. Если $peremennaya имеет значение - 0, то она является false, а если она имеет значение отличное от ноля, то она является true.
« Last Edit: March 15, 2019, 01:55:04 AM by Hito »
Я не ду... Потому и не бу...

Kibes

  • Освоившийся
  • **
  • Posts: 23
    • View Profile
Re: IF_PICTURE_IN - Для новичков
« Reply #11 on: March 15, 2019, 11:19:07 PM »
Подскажите, а если мне нужно перебирать много картинок, скажем так:
001.bmp
002.bmp
003.bmp
...
010.bmp
Мне для каждого файла нужно писать отдельную процедуру, или можно прикрутить счетчик, что бы к конце файла добавляло +1

Космич

  • Активный участник
  • ***
  • Posts: 265
    • View Profile
Re: IF_PICTURE_IN - Для новичков
« Reply #12 on: March 15, 2019, 11:48:28 PM »
Code: (clickermann) [Select]
FOR($count = 1, $count < 11)
   GETSCREEN
   IF_PICTURE_IN (0,0, $_xmax,$_ymax, STRCONCAT(STRCUT("00", 0, 3 - STRLEN($count)), $count, ".bmp"), -1, 100)
      LCLICK($_return1, $_return2)
      WAITMS(100)
   END_IF
END_CYC
« Last Edit: March 15, 2019, 11:59:52 PM by Космич »
«Иногда ты ваяешь до тех пор, пока до тебя не дойдёт, что именно ты делаешь.»

Kibes

  • Освоившийся
  • **
  • Posts: 23
    • View Profile
Re: IF_PICTURE_IN - Для новичков
« Reply #13 on: March 16, 2019, 01:05:10 AM »
Спасибо, подстроил под чуть под свой код, все работает :)

Омск

  • Зашел в гости
  • *
  • Posts: 5
    • View Profile
Re: IF_PICTURE_IN - Для новичков
« Reply #14 on: March 16, 2019, 07:48:25 PM »
Я посмотрел видео и не понял, как используется картинка, которая скопирована из скриншота? Какая строчка кода ищет эту картинку?