Author Topic: Скрипт поиска картинки не срабатывает ( переустановил W-ws 7 на W-ws 10)  (Read 4872 times)

0 Members and 4 Guests are viewing this topic.

Barbredy

  • Зашел в гости
  • *
  • Posts: 2
    • View Profile
Перешел на 10 винду. В 7-ке все работало. Что нужно поправить в 10?

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Перешел на 10 винду. В 7-ке все работало. Что нужно поправить в 10?

Очевидно установить снова 7ку  ;D

Barbredy

  • Зашел в гости
  • *
  • Posts: 2
    • View Profile
Перешел на 10 винду. В 7-ке все работало. Что нужно поправить в 10?

Очевидно установить снова 7ку  ;D

Почему же другие элементарные задачи кликер воспринимает, а эту нет?

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Странный вопрос, тебе там куда виднее с чем ты там работаешь. Что это за картинки? Открой редактор и включи в нем лупу, если изображение есть значит кликер видит. А раз видит значит графика изменилась. Может там какое сглаживание по новому применяется. Если в обычном режиме не видит то это уже проблема.

Ведь можно сделать новые скриншоты и сравнить их со старыми.

Cleoss

  • Активный участник
  • ***
  • Posts: 260
  • Автоматизируй это!
    • View Profile
Я тут с полгода назад задавал подобный вопрос, у меня тоже скрины не видело (я вышел ненадолго и не весь). Оказалось, что лучше делать скрины не через ПринтСкрин -> Пейнт -> полноцветный! bmp 24bit, а через запуск соответствующего скрипта РОДНОЙ скриншотилкой из самого же кликера, еси вкратце то так:

Code: [Select]
getscreen
screenshot

Сделанный скрин при этом сохраняется в подпапке Screens (ртфм/Язык сценариев/Анализ экрана/screenshotfix), а из него уже сплайсим/кропим нужный нам кусочек для распознавания/ тыканья в него.

Для более удобного и быстрого деланья скринов и их сплайсов под распознавалки можно использовать код:

Code: [Select]
getscreen // делаем скрин
$pfx="Nazvanie" // задаём каждый раз одно общее префикс-имя файлов со скринами
$svto="C:\Docs\your\path\to\clickermann\projects\" // указываем папку сохранёнок
$fl1=strconcat($svto,$pfx,"++.bmp")
$fl2=strconcat($svto,$pfx,"+.bmp")
$fl3=strconcat($svto,$pfx,".bmp")
$xm=$_xmouse
$ym=$_ymouse
$xmm=$xm+50 // указываем ширину скриншота  ..
$ymm=$ym+50 // и его высоту (с учётом дальнейшей обрезки 10-пискельной цветной рамки по периметру, т. е. получим 30х30)
if (($xmm < $_xmax) & ($ymm < $_xmax))
PXLREPLACE($xm,$ym, $xmm,$ym+10, -1, 255) // выделяем толстым красным молдингом на большом скрине всего экрана ту область, которая кропнется
PXLREPLACE($xm,$ym+10, $xm+10,$ymm-10, -1, 255)
PXLREPLACE($xmm-10,$ym+10, $xmm,$ymm-10, -1, 255)
PXLREPLACE($xm,$ymm-10, $xmm,$ymm, -1, 255)
else
...
end_if
screenshotfix(0,0, $_xmax,$_ymax, $fl1) // сохраняем общий скриншот всего экрана с выделением рабочей области красной кромкой
//делаю для истории, а также для сохранения точной позиции рабочей области и окружающих элементов
screenshotfix($xm+11,$ym+11, $xmm-10,$ymm-10, $fl2) // делаем сплайс той области, на которую наведён курсор (чуть ниже и правее курсора)
screenshotfix($xm+11,$ym+11, $xmm-10,$ymm-10, $fl3) // тот же сплайс, но его уже можно тщательнее обрезать в редакторе типа Пейнта и сохр.
print("Screenz '",$pfx,"' saveddd! rnd= ", RND(100,1000))
$clpbd=strconcat("if_picture_in (",$xm+11,",",$ym+11,", ",$xmm-10,",",$ymm-10,", ",$fl3,") if_picture_in ($_xmax-",$_xmax-($xm+11),",$_ymax-",$_ymax-($ym+11),", $_xmax-",$_xmax-($xmm+10),",$_ymax-",$_ymax-($ymm+10),", ",$fl3,")")
toclip($clpbd)
halt

Как работает и что делает вышеуказанный скрипт:

Перед запуском скрипта наводим курсор на ту область, которую нужно сохранить (а точнее, чуть выше и левее -- то есть ставим курсор мыши в левый верхний угол этой области, с запасом 10 пикселей -- чтобы курсор не делал ховерОн-эффект при наведении на кнопку, эта же область 10*10 пикселей в дальнейшем обрежется вместе с красным молдингом). Когда навели точно курсор, запускаем скрипт. На выходе получаем три скриншота: один для всего экрана Nazanie++.bmp с выделением рабочей области красным цветом и два скрина с маленькой рабочей областью 30*30 пкс. Если второй запасной мелкий скрин не нужен (который я сохраняю для быстрого отката), то можно строку второго скриншотфикса закомментить. Перед первым запуском задаём свою исходную папку и каждый раз указываем в скрипте начальный префикс для скринов (не забываем это делать (!!!) каждый раз, иначе скрипт просто перезапишет последнюю созданную и уже изменённую под себя скриншотинку или, если не устраивает подобный расклад, заменяем скриншотфикс на скриншотекс).
(Обновлено в 18.30 msk).
Теперь скрипт копирует в буфер обмена результирующую функцию иф_пикча_ин со всеми подставленными параметрами в двух формата координат (абсолютном и относительном) в следующем виде:
Code: (clickermann) [Select]
if_picture_in (447,125, 476,154, C:\clickermann\projects\test.bmp)
if_picture_in ($_xmax-992,$_ymax-774, $_xmax-943,$_ymax-725, C:\clickermann\projects\test.bmp)

То есть сразу после снятия скрина можно вставить в свой готовящийся скрипт готовую функцию, единственное -- надо заключить путь к файлу скриншота в двойные кавычки, чтоб было так:

Code: (clickermann) [Select]
if_picture_in (447,125, 476,154, "C:\clickermann\projects\test.bmp")
if_picture_in ($_xmax-992,$_ymax-774, $_xmax-943,$_ymax-725, "C:\clickermann\projects\test.bmp")

Выбираем любой понравившийся формат из двух имеющихся, добавляем кавычки и вставляем в свой проект на здоровье! Можно даже совместить параметры из обоих форматов, например вставить в свой скрипт такие параметры:

Code: (clickermann) [Select]
if_picture_in (447,125, $_xmax-943,$_ymax-725, "C:\clickermann\projects\test.bmp")
Примечание: поскольку строка [spoiler]
Code: [Select]
$clpbd=strconcat("if_picture_in (",$xm+11,",",$ym+11,", ",$xmm-10,",",$ymm-10,", ",$fl3,") if_picture_in ($_xmax-",$_xmax-($xm+11),",$_ymax-",$_ymax-($ym+11),", $_xmax-",$_xmax-($xmm+10),",$_ymax-",$_ymax-($ymm+10),", ",$fl3,")")
[/spoiler] очень длинная, то коль вы пользуетесь Блокнотом, следите за тем, чтоб при сохранении он НЕ разбил её на несколько строк, поскольку эта строка должна быть единой, без символов абзаца/разрыва строки/переноса каретки, иначе функция копирования в буфер может скопировать неполную строку либо вернуть ошибку (вы этого можете даже не заметить, если у вас включён игнор ошибок).

ПС. Ах да, может выдать ошибку, если скринить по краям экрана (в пределах 50 пикс). Можно кнешна допилить скрипт с проверкой условия выхождения границы экрана и дальнейшей правкой выделяемой границы, но.. лень)) Немного доделал скрипт с выше упомянутой проверкой скринования за границей моника, убрал выделение красным цветом за границами (пробовал сделать else внутри проверки, видимо тщетно, не срослось что-т в интерпретаторе), увы ошибка всё равно вылетает при скринах в пределах 50 пикселей снизу (какое-то ещё другое условие похоже надо проверить). Хотя эта незадача решается подавлением ошибок: идём в Настройки/Интерпретатор и ставим галочку "Игнорировать ошибки". Зоны за границей дисплея показаны чёрным цветом на сплайсах, толщину рамок можете легко настраивать на свой вкус и цвет.

Почему же другие элементарные задачи кликер воспринимает, а эту нет?

Вместо тысячи слов:

(оригинал см. тут)
Также может наблюдаться проблемная ситуация со сглаживанием шрифтов (по умолчанию оно включено в Винде), при этом граничные пиксели буковок могут претерпевать плавный тинт цвета (иллюстрация выше), и отдельно от системы сглаживание отключается в хромобраузерах. Прикол в том, что шрифт на пискельном уровне может сгладиться по-другому после перерисовки элемента с текстом, т. е. допустим при перетаскивании окна/ повторном его открытии/ перемещении фокуса на другое заскриненное окно может начать выглядеть немног иначе даже с тем же самым текстом, хотя визуально это изменение трудноразличимо, ситуация может усложняться наличием полупрозрачных аэро-лейеров. Так что, если делаете скрины с текстом, либо отключайте сглаживание текста, либо продолжайте грызть кактус.


« Last Edit: June 01, 2017, 06:55:35 PM by Cleoss »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
А "заняло времени" в виде рандома это че?  ;D

Вот моя переделка.

Размер снимка рассчитывается от центра курсора.
Присутствует коррекция выхода за экран.
Code: (clickermann) [Select]
$pfx="Nazvanie" // задаём каждый раз одно общее префикс-имя файлов со скринами
$svto="c:\Portable\Clickermann\projects\4.12\32\" // указываем папку сохранёнок
$colormod = 0 // цветокоррекция 0-8
$siz_x = 20
$siz_y = 20

$xm =$_xmouse-INT($siz_x/2)+1
$ym =$_ymouse-INT($siz_y/2)+1
$xmm=$_xmouse+INT($siz_x/2)
$ymm=$_ymouse+INT($siz_y/2)

IF($xm < 0)
   $xmm = $xmm + ABS($xm)
   $xm = 0
END_IF
IF($ym < 0)
   $ymm= $ymm + ABS($ym)
   $ym = 0
END_IF

IF($xmm > $_xmax)
   $xm = $xm-($xmm-$_xmax)
   $xmm= $_xmax
END_IF
IF($ymm > $_ymax)
   $ym = $ym-($ymm-$_ymax)
   $ymm= $_ymax
END_IF

$ms = $_ms
getscreen // делаем скрин
COLORMODE($colormod)
screenshotfix($xm,$ym, $xmm,$ymm, strconcat($svto,$pfx,"+.bmp"))
screenshotfix($xm,$ym, $xmm,$ymm, strconcat($svto,$pfx,".bmp"))
PXLREPLACE($xm,$ym, $xmm,$ym+1, -1, 255) // верх
PXLREPLACE($xmm-1,$ym, $xmm,$ymm, -1, 255) // право
PXLREPLACE($xm,$ymm-1, $xmm,$ymm, -1, 255) // низ
PXLREPLACE($xm,$ym, $xm+1,$ymm, -1, 255) // лево
screenshotfix(0,0, $_xmax,$_ymax, strconcat($svto,$pfx,"++.bmp"))
print("Screenshot '",$pfx,"' saved ", $_ms-$ms, " ms")
halt
« Last Edit: June 01, 2017, 05:24:00 PM by Oraven »

Cleoss

  • Активный участник
  • ***
  • Posts: 260
  • Автоматизируй это!
    • View Profile
А "заняло времени" в виде рандома это че?  ;D

Эт не time left ::) Эт для удобства просмотра лога скринования прямо из статусбара кликера при многократном снятии скринов  8)

Cleoss

  • Активный участник
  • ***
  • Posts: 260
  • Автоматизируй это!
    • View Profile
Добавил в скрипт копирование в буфер готовой к употреблению функции if_picture_in с автоматически заполненными параметрами.

Перешел на 10 винду. В 7-ке все работало. Что нужно поправить в 10?

Очевидно установить снова 7ку  ;D

Трололо-80

 &nbsp;&nbsp;&nbsp; -__-
« Last Edit: June 01, 2017, 06:52:38 PM by Cleoss »

Cleoss

  • Активный участник
  • ***
  • Posts: 260
  • Автоматизируй это!
    • View Profile
Немного допилил скриптец:
Code: [Select]
getscreen // делаем скрин
/$pfx="rsLiker2" // задаём каждый раз одно общее префикс-имя файлов со скринами
$pfx=inputbox("Plz input your desirable name for screen.bmp: ", "temp", 60)
if ($pfx="")
halt
end_if
$svto="H:\dlz\op\clickermann_last\Clickermann v4.12\projects\" // указываем папку сохранёнок
$fl1=strconcat($svto,$pfx,"++.bmp")
$fl2=strconcat($svto,$pfx,"+.bmp")
$fl3=strconcat($svto,$pfx,".bmp")
$xm=$_xmouse
$ym=$_ymouse
$xmm=$xm+100 // указываем ширину скриншота  ..
$ymm=$ym+100 // и его высоту (с учётом дальнейшей обрезки 10-пискельной цветной рамки по периметру, т. е. получим 30х30)
if (($xmm < $_xmax) & ($ymm < $_xmax))
PXLREPLACE($xm,$ym, $xmm,$ym+10, -1, 255) // выделяем толстым красным молдингом на большом скрине всего экрана ту область, которая кропнется
PXLREPLACE($xm,$ym+10, $xm+10,$ymm-10, -1, 255)
PXLREPLACE($xmm-10,$ym+10, $xmm,$ymm-10, -1, 255)
PXLREPLACE($xm,$ymm-10, $xmm,$ymm, -1, 255)
else
...
end_if
screenshotfix(0,0, $_xmax,$_ymax, $fl1) // сохраняем общий скриншот всего экрана с выделением рабочей области красной кромкой
//делаю для истории, а также для сохранения точной позиции рабочей области и окружающих элементов
screenshotfix($xm+11,$ym+11, $xmm-10,$ymm-10, $fl2) // делаем сплайс той области, на которую наведён курсор (чуть ниже и правее курсора)
screenshotfix($xm+11,$ym+11, $xmm-10,$ymm-10, $fl3) // тот же сплайс, но его уже можно тщательнее обрезать в редакторе типа Пейнта и сохр.
print("Screenz '",$pfx,"' saveddd! rnd= ", RND(100,1000))
$clpbd=strconcat($fl3, " getscreen // if_picture_in (0,0, $_xmax,$_ymax, ",$pfx,".bmp) // if_picture_in (",$xm+11,",",$ym+11,", $_xmax-",$_xmax-($xmm+10),",$_ymax-",$_ymax-($ymm+10),", ",$pfx,".bmp) // if_picture_in (",$xm+11,",",$ym+11,", ",$xmm-10,",",$ymm-10,", ",$pfx,".bmp) // ",$_xmax+1,"*",$_ymax+1," // if_picture_in ($_xmax-",$_xmax-($xm+11),",$_ymax-",$_ymax-($ym+11),", $_xmax-",$_xmax-($xmm+10),",$_ymax-",$_ymax-($ymm+10),", ",$pfx,".bmp) end_if")
toclip($clpbd)
wait(1)
//execute($fl3)
//toclip($fl3)
$nir=strconcat("nircmd.exe execmd ", $pfx,".bmp")
tfwrite("screen.bat", $nir, 1)
execute("screen.bat")
wait(3)
tfclear("screen.bat")
// automize your Paint
rclick(135,66) / selection
waitms(100)
rclick(135,28) / view tab
waitms(100)
rclick(33,75) / zoom
waitms(100)
rclick(33,75) / zoom
waitms(100)
rclick(33,75) / zoom
waitms(100)
rclick(33,75) / zoom
waitms(100)
rclick(33,75) / zoom
waitms(100)
rclick(33,75) / zoom
waitms(100)
rclick(33,75) / zoom
waitms(100)
rclick(33,75) / zoom
waitms(100)
rclick(77,38) / edit tab
waitms(100)
halt

(02/08/2017) Вместо внутренней переменной скрипта добавил поле ввода, чтоб каждый раз не лазить редактировать скрипт. Также добавил в конце execute($fl3), которое попытается открыть нужный кроплёный файл.бмп в вашем редакторе (который присвоен расширению БМП у вас в системе по умолчанию) для последующей обрезки, но если у вас Клмн не добавлен в ДЕП-список (или не может быть туда добавлен ввиду своей 64-разрядности, как в моём случае), то файл у вас НЕ откроется, а просто в конце работы скрипта (через секунду)) в буфер обмена будет скопирован путь к рисунку (путь к файлу копируется вместе с функцией ифпикин, которую надо будет удалить при вставке в графический редактор и вставить в ваш скрипт), и картинку можно будет быстро открыть через редактор (без долгого блуждания по файл-менеджеру). Кроме этого, увеличил размер кроп-зоны с 50*50 до 100*100, имхо стало удобнее целиться курсором.

ПС. К ифпикину добавлены гетскрин+эндиф, останется только после вставки в скрипт их оградить своими абзацами. И сейчас обнаружилась ещё одна досадность с тем, что при открытии инпут-бокса кликер не даёт на него фокус, т. е. придётся сперва курсором дать фокус на поле ввода или на заголовок открывшейся формы, а после этого вернуть курсор обратно на ту позицию, в месте которой надо снять скрин, хотя зачастую в других скриптах такое поведение кликера с фокусом и будет желательным (чтоб не брал на себя фокус), но не здесь. Но оказалось (после очередной тестовой итерации), что хорошая новость: если перед запуском фокус был на окне кликера, то фокус на инпуте всё же есть, то бишь перед запуском скрипта желательно кликнуть по заголовку Клмна и только потом уже наводить мышь на подлежащий скриншоттингу объект. А чтобы не было трабла с кавычками, в ифпикина вставляется только имя файла с расширением, без полного пути.

PPS. Решил не доверять открытие рисунка Кликерманну (потому как он косячит с DEP), а проделать это через батник, создаваемый прямо в скрипте и открываемый без всплывающих чёрных окон ДОСа, для этого требуется NirCMD в вашей папке Windows/Shell32. Тестовое открытие прошло успешно. Если же вам этот функционал не нужон, то закаментьте пять строк начиная с $nir. (03.08.17) Вставил в конце маленькую автоматизашку для Пейнта, но туда надо вводить координаты ваших кнопок на вашем экране (с вашим разрешением), она позволяет максимально призумить получившуюся кропку 100*100. Плюс функция быстрого импорта полученных ифпикинов теперь предлагает целых 4 варианта вместо прежних двух, например:

Code: (clickermann) [Select]
getscreen
if_picture_in (0,0, $_xmax,$_ymax, temp.bmp) // Весь экран
if_picture_in (519,478, $_xmax-661,$_ymax-382, temp.bmp) // Начало задано абсолютно, конечная точка -- относительно
if_picture_in (519,478, 598,557, temp.bmp) // 1280*960, абсолютные показатели + разрешение экрана
if_picture_in ($_xmax-760,$_ymax-481, $_xmax-661,$_ymax-382, temp.bmp) // Относительные размеры
end_if
« Last Edit: August 03, 2017, 04:51:03 PM by Cleoss »