Автор Тема: IF_PICTURE_IN - Для новичков  (Прочитано 67929 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Hito

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

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

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

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

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

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

Hito

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

Alexxx

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

Oraven

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

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

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

Hito

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

Oraven

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

Запускаю код
Код: Clickermann
  1. GETSCREEN(100,100,500,500)
  2. SCREENSHOTFIX(0,0, $_xmax,$_ymax, "file.bmp", 0)
  3. HALT

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

Hito

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

Запускаю код
Код: Clickermann
  1. GETSCREEN(100,100,500,500)
  2. SCREENSHOTFIX(0,0, $_xmax,$_ymax, "file.bmp", 0)
  3. HALT

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

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

Hito

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

Alexxx

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

Hito

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

Код: Clickermann
  1. GETSCREEN
  2. IF_PIXEL_IN(0,0, $_xmax,$_ymax, 255)
  3.   LOGWRITE ("Красный")
  4.   $peremennaya = 1
  5. else
  6.   IF_PIXEL_IN(0,0, $_xmax,$_ymax, 122) // Я хз - какой там зеленый...
  7.      LOGWRITE ("Зеленый")
  8.      $peremennaya = 1
  9.   else
  10.      $peremennaya = 0
  11.   END_IF
  12. END_IF
  13.  
  14. IF($peremennaya)
  15.   // какой-то цвет был найден - смотри лог
  16. else
  17.  // Никакого цвета не было найдено
  18. END_IF
  19. HALT
Я не ду... Потому и не бу...

Hito

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

Kibes

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

Космич

  • Активный участник
  • ***
  • Сообщений: 265
    • Просмотр профиля
Re: IF_PICTURE_IN - Для новичков
« Ответ #12 : Март 15, 2019, 11:48:28 pm »
Код: Clickermann
  1. FOR($count = 1, $count < 11)
  2.   GETSCREEN
  3.   IF_PICTURE_IN (0,0, $_xmax,$_ymax, STRCONCAT(STRCUT("00", 0, 3 - STRLEN($count)), $count, ".bmp"), -1, 100)
  4.      LCLICK($_return1, $_return2)
  5.      WAITMS(100)
  6.   END_IF
  7. END_CYC
« Последнее редактирование: Март 15, 2019, 11:59:52 pm от Космич »
«Иногда ты ваяешь до тех пор, пока до тебя не дойдёт, что именно ты делаешь.»

Kibes

  • Освоившийся
  • **
  • Сообщений: 23
    • Просмотр профиля
Re: IF_PICTURE_IN - Для новичков
« Ответ #13 : Март 16, 2019, 01:05:10 am »
Спасибо, подстроил под чуть под свой код, все работает :)

Омск

  • Зашел в гости
  • *
  • Сообщений: 5
    • Просмотр профиля
Re: IF_PICTURE_IN - Для новичков
« Ответ #14 : Март 16, 2019, 07:48:25 pm »
Я посмотрел видео и не понял, как используется картинка, которая скопирована из скриншота? Какая строчка кода ищет эту картинку?