Author Topic: Есть ли возможность - находить картинку на экране без картинки?  (Read 4059 times)

0 Members and 1 Guest are viewing this topic.

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Ребят, прошу прощения за вопрос - на форуме наверняка есть ответ. Да и в справке наверняка что-то можно придумать. Но что-то так устал все выискивать, пробовать и тестить...  Может кто ответит? Вот есть функции в кликере:
Code: (clickermann) [Select]
$count = PXLCRC ($X1,$Y1, $X2,$Y2)
IF($count = 79389910)
   // Картинка найдена
END_IF
с помощью которых можно искать картинку на экране без самой картинки заготовленной. Но этот способ подходит, если картинку искать в четких координатах. А что можно придумать, что бы картинку можно было искать без заготовленного скрина, но не в четких координатах а в пределах этих координат?
Я не ду... Потому и не бу...

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
вроде вот http://crapware.aidf.org/forum/index.php?topic=3743.0

Только вместо PXLXOR используй PXLCRC

Нужно знать только  код первого искомого пикселя.
« Last Edit: September 17, 2019, 01:56:53 AM by dramster »

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
вроде вот http://crapware.aidf.org/forum/index.php?topic=3743.0

Только вместо PXLXOR используй PXLCRC

Нужно знать только  код первого искомого пикселя.
Ведь думал же об этом...))
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Но если цвет первого пиксля картинки на экране встречается далеко не раз, то результат удручает...

13:35:12 Нашли обычным способом за 121 ms.
13:35:18 Нашли новым способом за 6353 ms.
Я не ду... Потому и не бу...

4.У.В.@.К

  • Активный участник
  • ***
  • Posts: 117
    • View Profile
Но если цвет первого пиксля картинки на экране встречается далеко не раз, то результат удручает...

Не всё так печально, скорее всего ты начал "плясать не от того угла", вернее не от того пикселя.
Кто сказал, что искомый пиксель обязательно должен быть верхним левым пикселем искомой картинки? Нужно из всех цветов этой картинки выбрать тот цвет, который меньше всего встречается в области GETSCREEN, а хеш примерять на найденный пиксель учитывая смещение. В идеале - искомый пиксель нигде на экране не встречается, кроме как на искомой картинке. Тогда поиск будет быстрым.

На скриншотах:
Весь скриншот это область GETSCREEN. Картинку ищем только в желтой незаштрихованной области. В заштрихованной зоне картинки быть не может, она там не умещается ни по ширине, ни по высоте.

Без смещения (искомый пиксель - верхний левый на картинке):


Со смещением (искомый пиксель - посередине картинки):


Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Но если цвет первого пиксля картинки на экране встречается далеко не раз, то результат удручает...

Не всё так печально, скорее всего ты начал "плясать не от того угла", вернее не от того пикселя.
Кто сказал, что искомый пиксель обязательно должен быть верхним левым пикселем искомой картинки? Нужно из всех цветов этой картинки выбрать тот цвет, который меньше всего встречается в области GETSCREEN, а хеш примерять на найденный пиксель учитывая смещение. В идеале - искомый пиксель нигде на экране не встречается, кроме как на искомой картинке. Тогда поиск будет быстрым.

На скриншотах:
Весь скриншот это область GETSCREEN. Картинку ищем только в желтой незаштрихованной области. В заштрихованной зоне картинки быть не может, она там не умещается ни по ширине, ни по высоте.

Без смещения (искомый пиксель - верхний левый на картинке):


Со смещением (искомый пиксель - посередине картинки):


Как быть с картинкой, в которой всего два цвета? Черный - фон картинки, и белый - надпись на фоне. И до этой картинки на экране полно черных и белых пикслей...
Я не ду... Потому и не бу...

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Это самый плохой вариант для любого способа.
Но классический рулит.


4.У.В.@.К

  • Активный участник
  • ***
  • Posts: 117
    • View Profile
Как быть с картинкой, в которой всего два цвета? Черный - фон картинки, и белый - надпись на фоне. И до этой картинки на экране полно черных и белых пикслей...

Ну, "запасный выход" еще никто не отменял. :)
А если серьезно - не видя того что ищем, скорее всего никак.
Пока понятно только то, что для поиска картинки с помощью PXLCRC(), изображение на экране не подготовлено. И можно ли как то на это повлиять - неизвестно.

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
А если серьезно - не видя того что ищем, скорее всего никак.

Тут видеть особо нечего. Представь себе черный экран, на котором много разных белых надписей и тебе нужно найти одну из надписей, но сделать это без заранее заготовленной картинки.
Я не ду... Потому и не бу...

4.У.В.@.К

  • Активный участник
  • ***
  • Posts: 117
    • View Profile
Да уж представляю...
Если бы это был к примеру текст на веб-странице, то можно победить такое.
Иначе надо крепко репу чесать. Может кто что и придумает.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
А в чём смысл отказа от IF_PICTURE_IN ? (написал сначала "сакральный", потом полез смотреть определение. ммм... короче я не совсем правильно понимал значение слова и беря во внимание автора темы, такие слова применять не совсем уместно.)

Или это не от него отказ, а только от графического хранения? Не очень понятны мотивы и цели.


Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Или это не от него отказ, а только от графического хранения?
Только от графического хранения )) Меньше файлов в проекте - всегда приятней )) Ну, как бы тема-то не критичная. Просто задумался...)
Я не ду... Потому и не бу...

4.У.В.@.К

  • Активный участник
  • ***
  • Posts: 117
    • View Profile
Есть еще вариант - для предварительного поиска нужной области использовать букву.
Находим в искомой фразе наиболее уникальную (для всей области поиска) букву.
Создаем в графическом буфере картинку, из "двоичного кода" этой буквы.
Сохраняем эту картинку на диск (куда ни будь во временную папку).
Выводим координаты всех вхождений этой картинки в массив.
Примеряем заранее заготовленный хеш на области в найденных координатах.

Пример создания картинки:
Code: (clickermann) [Select]
$str = "0111110011111001111100000110011101001110100000110" // строчная буква "ы"

$x = 1
$y = 1

FOR($n = 1, $n <= STRLEN($str))
   IF($x > 7)
      INC($y)
      $x = 1
   END_IF
   IF(STRCUT($str, $n, 1) = 1)
      PXLREPLACE($x,$y,$x,$y, -1, 0)
   ELSE
      PXLREPLACE($x,$y,$x,$y, -1, 16777215)
   END_IF
   INC($x)
END_CYC

SCREENSHOTFIX(1,1,7,7, "C:\Windows\Temp\~unnamed.bmp", 0)

HALT

Генерирование картинок скриптами обсуждалось здесь.