Author Topic: Найти неизвестную картинку  (Read 2687 times)

0 Members and 1 Guest are viewing this topic.

Kas

  • Зашел в гости
  • *
  • Posts: 14
    • View Profile
Найти неизвестную картинку
« on: August 01, 2019, 12:02:29 AM »
Есть статичный фон, на котором в рандомных местах появляются рандомные картинки, на которые необходимо кликать

Можно ли это как-то реализовать, не имея конкретной картинки или пикселя?

iggi

  • Освоившийся
  • **
  • Posts: 22
    • View Profile
Re: Найти неизвестную картинку
« Reply #1 on: August 01, 2019, 01:57:10 AM »
Можно попробовать отлавливать появление картинок по изменению контрольной группы пикселей. Экран поделить на несколько секторов и последовательно проверять в каждом секторе не изменинился ли crc группы пикселей в этом секторе. Для ускорения процесса нужно считать не все пиксели сектора, а лишь пиксели небольшого участка.

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Найти неизвестную картинку
« Reply #2 on: August 01, 2019, 08:56:10 AM »
Есть статичный фон, на котором в рандомных местах появляются рандомные картинки, на которые необходимо кликать

Можно ли это как-то реализовать, не имея конкретной картинки или пикселя?
А можно поподробнее про фон? Это область одного цвета, область с какимито картинками, или область с переливающимися цветами?
В общем, если это один цвет или хотябы приблизительно один цвет, то можно просто использовать колормод 7. И искать на экране семь цветов кроме восьмого, того что является цветом фона. Если чтото находит - клик.

Kas

  • Зашел в гости
  • *
  • Posts: 14
    • View Profile
Re: Найти неизвестную картинку
« Reply #3 on: August 01, 2019, 09:53:18 AM »
Есть статичный фон, на котором в рандомных местах появляются рандомные картинки, на которые необходимо кликать

Можно ли это как-то реализовать, не имея конкретной картинки или пикселя?
А можно поподробнее про фон? Это область одного цвета, область с какимито картинками, или область с переливающимися цветами?
В общем, если это один цвет или хотябы приблизительно один цвет, то можно просто использовать колормод 7. И искать на экране семь цветов кроме восьмого, того что является цветом фона. Если чтото находит - клик.

Фон состоит из 2 разных цветов

А как, собственно, заставить кликер искать все цвета, кроме определённых? ;D Я просто слабо во всем этом шарю, где про это почитать можно?


dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Найти неизвестную картинку
« Reply #4 on: August 02, 2019, 01:03:15 AM »
Было когда-то предложение внедрения такой функции http://crapware.aidf.org/forum/index.php?topic=2390.msg14945#msg14945

Попробовал написать DLL с данным функционалом, немного потестил, вроде работает.

Код делфи dll
Code: (clickermann) [Select]
library if_not_pixel;

uses Windows, System.Types, System.IOUtils;
//------------------------------------------------------------------------------
// Основное тело функции, идет на экспорт, вызывается из кликера
function execute( _mas: pInteger; _size: Integer): Integer; export; stdcall;
type
  pIntArr = array[0..0] of Integer;
var
   file_arr: TArray<System.Byte>;
   a, b, c, pixel, res :Integer;

begin
  res := 16777216;  // если не найдет других цветов
  file_arr := TFile.ReadAllBytes('screen.bmp'); // помещаем файл в массив
  b  := file_arr[10]; //начало пикс данных

  for a:= 0 to _size-1 do   //цикл по входным цветам
  begin
         pixel := pIntArr(_mas^)[a];

         While(b < Length(file_arr)) do  // цикл сравнения пикселей в файле с входными
         begin

          if (file_arr[b+2]+file_arr[b+1]*256+file_arr[b]*65536) <> pixel then  //если не равен
          begin

           for c:= 0 to _size-1 do  //то сравниваем его с всеми входными
            begin
             if (file_arr[b+2]+file_arr[b+1]*256+file_arr[b]*65536) = pIntArr(_mas^)[c]
             then break
            end;
            if c = _size then res := file_arr[b+2]+file_arr[b+1]*256+file_arr[b]*65536 //если ни с каким из входящих не совпало

          end;
          // то выход
          if res < 16777216 then break ;
          inc(b, 4)
         end;
         //то выход
         if res < 16777216 then break ;
  end;

  result := res;
end;

//------------------------------------------------------------------------------

// список экспорта
exports execute;

begin
  // тело пусто
end.

На выходе получаем цвет не совпавший с отправленными в длл цветами. Если таких нет, то в ответ "16777216". Определять координату этого пикселя в длл не стал, много мороки.

Далее, если найден такой пиксель, ищем его стандартным ифпиксельин-ом.

Пример использования в кликермане:
Code: (clickermann) [Select]
$x1 = 100   //область сканирования
$y1 = 100
$x2 = 300
$y2 = 300



GETSCREEN($x1,$y1, $x2,$y2)

SCREENSHOTFIX($x1,$y1, $x2,$y2, "screen.bmp") //имя файла обязательно такое

CALL("if_not_pixel.dll", 16777215, 0, 255) // ищем в файле все цвета не совпадающие с белым, черным и красным. Можно добавить нужные цвета (неограниченно)
//print($_return1) //можно глянуть что там за он

IF($_return1 < 16777216) //если нашли несовпадение
   //ищем этот пиксель кликерманом
   
   IF_PIXEL_IN($x1,$y1, $x2,$y2, $_return1)
     
      //действие
      LCLICK($_return1, $_return2)
      WAITMS(100)
     
   END_IF
   
END_IF

halt

Работает давольно быстро, скорость не мерял. Скомпилированный "if_not_pixel.dll" для х32 битной версии кликермана во вложении... чето с ноута не хочет вложения работать :-\. Файл на ядиске https://yadi.sk/d/GCwF_xHK1Z0BZQ
« Last Edit: August 02, 2019, 01:05:12 AM by dramster »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Найти неизвестную картинку
« Reply #5 on: August 09, 2019, 05:21:29 PM »
Так ищем один цвет. А можно ли возвращать все несовпадающие? Или $_return1 под это не заточен и нужно в файл выгружать?


dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Найти неизвестную картинку
« Reply #6 on: August 09, 2019, 09:18:36 PM »
Так ищем один цвет. А можно ли возвращать все несовпадающие? Или $_return1 под это не заточен и нужно в файл выгружать?
Да, $_return1 ограничен 4-мя байтами. Можно в файл, либо вызывать длл с параметром индекса массива file_arr найденного не совпавшего цвета, и собирать массив цветов уже в кликере в цикле.

Подумал, тоже не вариант. У нас длл возвращаяет цвет в 3 байта, остается 1, это всего 256 индексов только можно будет принять из длл, мало  :(

Хотя... длл нашел, кликер нашел координаты, эти координаты отправляем опять в длл, с них и начнет поиск. Такчто все возможно.
« Last Edit: August 09, 2019, 09:26:10 PM by dramster »