Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Topics - dramster

Pages: [1] 2
1
Не прошло и года, как у меня все-же получилось написать длл для общения с ком портом, а именно с ардуиномикро. По сравнению с командной строкой, работает шустро и незаметно.
При написании никаких дополнительных компонентов для работы с ком не использовал. С ними оказалось намного все сложнее.
Вобщем, пару вечеров, куча статей и форумов, вот первый, и вполне рабочий вариант.
Кто в теме, или вдруг загорится этой темой, код длл делфи10:
Code: (clickermann) [Select]
library micro_com;

uses    Windows, SysUtils;

//------------------------------------------------------------------------------
// Основное тело функции, идет на экспорт, вызывается из кликера
function execute( _mas: pInteger; _size: Integer): Integer; export; stdcall;


type
  pIntArr = array[0..0] of Integer;
var
 DCB   : TDCB;
 hPort : THandle;
 port_num : integer;
 param : integer;
 byete_res: Cardinal;
 str : string;
 len : integer;
begin
   port_num := pIntArr(_mas^)[0];
   param := pIntArr(_mas^)[_size-1];

  // 1. Открываем файл
  hPort := CreateFile(PChar('COM'+IntToStr(port_num)), GENERIC_READ + GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  // 2. Контроль ошибок
  if hPort = INVALID_HANDLE_VALUE then begin
   // Обнаружена ошибка, порт открыть не удалось
   result := 1;
   exit;
  end;

  // 3. Чтение текущих настроек порта
 if GetCommState(hPort, DCB) then ;
  // 4. Настройки:
  // Скорость обмена
 DCB.BaudRate := 9600;
  // Число бит на символ
 DCB.ByteSize := 8;
  // Стоп-биты
 DCB.StopBits := 1;
  // Четность
 DCB.Parity   := 0;
  // Какая-то херь непонятная
 DCB.Flags := 20625;
  // 5. Передача настроек
 if not SetCommState(hPort, DCB) then begin{ошибка настройки порта}
   result := 2;
   exit;
 end;
  // 6. Настройка буферов порта (очередей ввода и вывода)
 if not SetupComm(hPort, 16, 16) then begin{ошибка настройки буферов}
   result := 3;
   exit;
 end;
  // 7. Сброс буферов и очередей
if PurgeComm(hPort, PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR or PURGE_RXCLEAR) then
 // 8. Запись в порт
 str := intToStr(param);
 len := Length(str);
 WriteFile(hPort, PChar(str)^, len*2, byete_res, nil);
  // 9. Закрытие порта
 CloseHandle(hPort);
 result := 5;
end;

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

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

begin

end.

Скомпилированная библиотека уверенно отправляет в нужный порт любой текст. Примерно так:
Code: (clickermann) [Select]
CALL ("micro_com.dll", $com, $val)
Нам же, для управления микрой, нужны только числа. Скетч для контроллера взял старый отсюда http://crapware.aidf.org/forum/index.php?topic=5215.msg34294#msg34294 . Немного доработал его:
Code: (clickermann) [Select]
#include <Mouse.h>
#include <Keyboard.h>
 
unsigned long par = 0;
String instring = "";
int kmfunct = 0;
int x_cor = 0;
int y_cor = 0;
int mult = 0;
int inchar = 0;

void setup() {
  Serial.begin(9600);
  Mouse.begin();
  Keyboard.begin();
 
}
 
void loop() {


while(Serial.available() > 0){ 
inchar = Serial.read();
if (isDigit(inchar)) {
   instring += (char)inchar;     
    }   
}   
  par = instring.toInt();
  instring = "";


    if (par > 0) {
     
     kmfunct =  par/16777216 ;
     switch (kmfunct) {
 
     case 1:  //Mouse.click
      Mouse.click(par - kmfunct*16777216);
      break;   
     case 2:  //  Mouse.move
      x_cor = (par - kmfunct*16777216)/256;
      y_cor = par - x_cor*256 - kmfunct*16777216;
      if (x_cor > 127) x_cor = 127 - x_cor;
      if (y_cor > 127) y_cor = 127 - y_cor;
      Mouse.move(x_cor, y_cor, 0);
      break;
     case 3: //Mouse.press
      Mouse.press(par - kmfunct*16777216);
      break;
     case 4: //Mouse.release
      Mouse.release(par - kmfunct*16777216);
      break;
     case 5:  //Mouse.dblclick
      Mouse.click(par - kmfunct*16777216);
      delay(50);
      Mouse.click(par - kmfunct*16777216);
      break;
     case 6: //wheel.down.up
      mult = par - kmfunct*16777216;
      if (mult > 127) mult = 127 - mult;
      Mouse.move(0, 0, mult);
     case 7: // Keyboard.keydown
      Keyboard.press(par - kmfunct*16777216);
      break;
     case 8: // Keyboard.keyup
      Keyboard.release(par - kmfunct*16777216);
      break;
     case 9: // Keyboard.keypress
      Keyboard.write(par - kmfunct*16777216);
      break;
     }
    }
    par = 0;
 
}


Библиотека с подпрограммами для кликермана тут:
Code: (clickermann) [Select]
$com = 5   //свой порт

//#name "Arduino_mouse&keyboard"
 
////////////////////////////////////////////////
 
// Все процедуры с мышью и клавиатурой через ардуино
 
//micro_move ($x_cor, $y_cor)
//micro_lclick ($x_cor, $y_cor)
//micro_rclick ($x_cor, $y_cor)
//micro_mclick ($x_cor, $y_cor)
//micro_ldown ($x_cor, $y_cor)
//micro_rdown ($x_cor, $y_cor)
//micro_mdown ($x_cor, $y_cor)
//micro_lup ($x_cor, $y_cor)
//micro_rup ($x_cor, $y_cor)
//micro_mup ($x_cor, $y_cor)
//micro_dblclick ($x_cor, $y_cor)
//micro_wheeldown ($mult)
//micro_wheelup ($mult)
 
// вместо $char_ASCII писать не код клавиши, а символ ASCII.
// в ардуино как-то тупо сделали клавиатурные нажатия :/
//micro_keydown ($char_ASCII)
//micro_keyup ($char_ASCII)
//micro_keypress ($char_ASCII)
 
 
 
//move
SUB(micro_move, $x_cor, $y_cor)
 
   WHILE(DIST($x_cor, $y_cor, $_xmouse, $_ymouse) > 3)
 
      $x_temp = $_xmouse
      $y_temp = $_ymouse
 
      $x_dist = $x_cor - $_xmouse
      $y_dist = $y_cor - $_ymouse
 
      IF($x_dist < 0)
         $x_dist = 127 + int(SQRT(abs($x_dist*4)))
      else
         $x_dist =  int(SQRT(abs($x_dist*4)))
      END_IF
      IF($y_dist < 0)
         $y_dist = 127 + int(SQRT(abs($y_dist*4)))
      else
         $y_dist =  int(SQRT(abs($y_dist*4)))
      END_IF
      CALL ("micro_com.dll", $com, 33554432 + $x_dist*256 + $y_dist) 
     
   END_CYC
END_SUB

//lclick
SUB(micro_lclick, $x_cor, $y_cor)
   micro_move($x_cor, $y_cor)
   CALL ("micro_com.dll", $com, 16777217)
END_SUB
 
//rclick
SUB(micro_rclick, $x_cor, $y_cor)
   micro_move($x_cor, $y_cor)
   CALL ("micro_com.dll", $com, 16777218)
END_SUB
 
//mclick
SUB(micro_mclick, $x_cor, $y_cor)
   micro_move($x_cor, $y_cor)
   CALL ("micro_com.dll", $com, 16777219)
END_SUB
 
//ldown
SUB(micro_ldown, $x_cor, $y_cor)
   micro_move($x_cor, $y_cor)
   CALL ("micro_com.dll", $com, 50331649)
END_SUB
 
//rdown
SUB(micro_rdown, $x_cor, $y_cor)
   micro_move($x_cor, $y_cor)
   CALL ("micro_com.dll", $com, 50331650)
END_SUB
 
//mdown
SUB(micro_mdown, $x_cor, $y_cor)
   micro_move($x_cor, $y_cor)
   CALL ("micro_com.dll", $com, 50331651)
END_SUB
 
//lup
SUB(micro_lup, $x_cor, $y_cor)
   micro_move($x_cor, $y_cor)
   CALL ("micro_com.dll", $com, 67108865)
END_SUB
 
//rup
SUB(micro_rup, $x_cor, $y_cor)
   micro_move($x_cor, $y_cor)
   CALL ("micro_com.dll", $com, 67108866)
END_SUB
 
//mup
SUB(micro_mup, $x_cor, $y_cor)
   micro_move($x_cor, $y_cor)
   CALL ("micro_com.dll", $com, 67108867)
END_SUB
 
//dblclick
SUB(micro_dblclick, $x_cor, $y_cor)
   micro_move($x_cor, $y_cor)
   CALL ("micro_com.dll", $com, 83886081)
END_SUB
 
//wheeldown
SUB(micro_wheeldown, $mult)
   CALL ("micro_com.dll", $com, 100663423 + $mult)
END_SUB
 
//wheelup
SUB(micro_wheelup, $mult)
   CALL ("micro_com.dll", $com, 100663296 + $mult)
END_SUB
 
//keydown
SUB(micro_keydown, $char_ASCII)
   CALL ("micro_com.dll", $com, 117440512 + code($char_ASCII))
END_SUB
 
//keyup
SUB(micro_keyup, $char_ASCII)
   CALL ("micro_com.dll", $com, 134217728 + code($char_ASCII))
END_SUB
 
//keypress
SUB(micro_keypress, $char_ASCII)
   CALL ("micro_com.dll", $com, 150994944 + code($char_ASCII))
END_SUB

Даже и не уверен, придумают ли защиту от такого аппаратного управления машиной  ;).

Подключайтесь, проверяйте. Я проверил и использовал лишь в одной защищенной древнючей игре MTA_SA. Не смотря на ее древнючесть, они уже давно  впилили защиту от кликеров. Сам контроллер не сильно и дорогой, глянул - от 350р. Я вроде еще за 280 когда-то купил.

Во вложении dll для х32 систем.


2
 Нашел я библиотеку dll для работы с ком портами https://www.kernelchip.ru/pcports/PS057.php. Ранее без проблем получалось писать dll на делфи для чтения функций из сторонних библиотек dll. Как пример вот эта тема http://crapware.aidf.org/forum/index.php?topic=4596.msg31508#msg31508 . Там я вызывал функцию как процедуру, и даже так прокатило. Были у меня и еще примеры использования функций из сторонней длл, все работало как часики.

 Но вот с этой библиотекой 'SerialGate.dll' что-то никак не вяжется. Выдает ошибку "Точка входа в процедуру 'имя ф-ции' не найдена в библиотеке DLL". То есть, якобы этой функции там нет  :(

 Там на сайте автора https://www.kernelchip.ru/pcports/PS057.php и https://www.kernelchip.ru/pcports/PS058.php и  https://www.kernelchip.ru/pcports/PS059.php есть исходники, но я в C++ полный ноль, да и в Delphi не ас.


 Если кто-то из читателей данной темы в курсе как там все работает, не пожалейте пару минут на общее благо. Гляньте по ссылкам и проверьте в чем моя ошибка. Хочу написать DLL для общения кликермана с arduino micro.

Мои попытки чтения функций из 'SerialGate.dll':
Code: (clickermann) [Select]
library cmann_plugin;

uses  SysUtils, Winapi.Windows;

function Open(port : integer; baud : integer) : boolean; stdcall; external 'SerialGate.dll'; //берем из 'SerialGate.dll' функцию 'Open'

//------------------------------------------------------------------------------
// Основное тело функции, идет на экспорт, вызывается из кликера
function execute( _mas: pInteger; _size: Integer): Integer; export; stdcall;
type
  pIntArr = array[0..0] of Integer;
var
  port_input : integer;
  res : integer;
begin
  port_input := pIntArr(_mas^)[0]; //читаем параметр порта из кликермана

  if Open(port_input, 19200) then res := 1 else res := 2; //пытаемся открыть порт и результат сего действия возвращаем кликерману.

  result := res;

end;
//------------------------------------------------------------------------------

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

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

Спасибо всем заранее  :) .

3
Прочее / snake Классический.
« on: April 25, 2020, 11:09:58 PM »
Так, для раскрытия возможностей км, хочу показать что я делал пару лет назад, но не хотел палиться целях безопасности. Код гдето есть, но это все простейшие алгоритмы.
В игре мта-са есть мини игра змейка, классическая. Когда был забанен, то даже видос записал - https://www.youtube.com/watch?v=d9epgngxkpw . Там я набрал не так уж и много, в топ попал.
Мой рекорд был это максимальное заполнение поля, видос тогда я не писал, но скрин скину с результатом. Если ктото не понял, я заполнил все поле змейкой и уперся в свой хвост, это был максимум. То что там в топе это наверняка хак при начальной разработке сервера. ...самого скрина заполненного поля не нашел, но в топе он есть. Если кто не верит, могу попробовать повторить и записать, это конечно если комуто интересно.


slayer тогда мой ник был. Можете посчитать все кубики, на выполнение ушло гдето полтора часа, но всеже км справился. Это для меня в тот момент было радости полные штаны, но похвастаться некому было, играл.... Жаль что интерес пропал. К стати все рекорды что ниже, тоже мои.

ВОт так умеет чудо прога Кликерманн

4
Общие вопросы / Работа с ftp
« on: October 27, 2019, 11:12:52 PM »
Покачто ради эксперимента, но ничего не выходит. Есть у меня ftp - ftp://log:pass@host . Как мне функциями кликермана закинуть туда файлы. Покачто мне удалось заливать через браузер, ито, перетаскиванием, и с помощью подключения этого фтп к винде как сетевой диск.
Первое что приходит в голову, копировать с локального диска на тот что подключен к ОС, который в свою очередь и есть FTP. Вылазит ошибка  :(

К стати, когда захожу в этот подключенный к ОС ФТП и смотрю в адресную строку, то вижу там C:\Users\ed\AppData\Roaming\Microsoft\Windows\Network Shortcuts\93.189.41.9 , где 93.189.41.9 ip сервера.

Естественно пробовал копировать прямо в сеть... глупо.
На крайняк уже пробовал писать батники, так они вообще кроме текта ничего не пишут в фтп.

Я уверен тут есть знающие люди по работе с ftp, подскажите где хоть почитать, или примеры тестовые.

5
Предложения / Порисуем на экране?
« on: February 12, 2019, 02:01:04 AM »
Может стоит уже внести функционал рисования прямо на рабочем столе? Примитивно - окружности, прямоугольники, ... ну и по нарастающей вплоть до Моны Лизы. ;D 

 Иногда требуется подсветить какойто обьект, обозначить его какойто фигурой, возможно наисать на весь экран плохое слово и так далее. Плюс эксперименты с графикой приходится проводить в том же паинте, а почему бы не сразу там где курсор затерялся и в реальном времени (не задумываясь что там выйдет)?

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

 К примеру играет у меня какойто бот, чтото там жмякает, чтото дергает, в логе много текста.... А было бы так- показана стрелка красная, туда не пойдем, появился желтый кружок, там кликнем и результат игры в цифрах на пол экрана ... Прям сказка... ;D




Почему то вспомнилась игра "найди различия  между двух картинок". Гдето в вк вроде видел реализацию на кмане. Так там же пришлось писать еще какойто просмотршик картинок... геморно. Кликерман сам должен все это уметь делать  ::).

6
Прочее / Защита от CheatEngine.
« on: February 11, 2019, 06:00:59 PM »
 Может ктото из вас знает как обойти защиту от запущенного читэнжина? В моем случае это кик из MTA-San Andreas.

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

7
На днях нашел у себя старый советский кубик рубика с детства  ;D, Радости было - словами не передать  ;D.

Примерно так я себе представлял свои возможности по сборке  8):


На деле это выглядело где-то так  :( :




Сломал себе мозг в итоге, и решил перенести алгоритм для сборки в кликерман. Кубик онлайн взял отсюда http://www.softholm.com/igra/kubik-rubika/3D-kubik-rubik.html (только там таймер немного тормознутый  :D).
Примерный алгоритм брал вот такой https://kak-sobrat-kubik-rubika-3x3.ru .

При написании все оказалось не так просто как я рассчитывал, но все работает, хоть и не сильно быстро.

Видео сборки - https://youtu.be/foHWvLXU1JQ - 3 мин. 50 сек.

Если кто-то знаком со сборкой более сложных кубов 4х4 или 5х5, или если у кого есть алгоритмы пошустрее - будет интересно вместе порешать  ;).

Код:
Code: (clickermann) [Select]
GETSCREEN
IF_PIXEL_IN(0,0, $_xmax,$_ymax, 16567729)
   $x_win = $_return1
   $y_win = $_return2
   print("окошко с кубиком найдено в координатах ",$_return1,"x", $_return2)
else
   print("окно не найдено")
   halt
END_IF

//выставляем по уровню
SUB(level)
   LDOWN($x_win + 35,$y_win + 326)
   waitms(50)
   LUP($x_win + 35,$y_win + 348)
   waitms(500)
   LDOWN($x_win + 369,$y_win + 574)
   waitms(50)
   LUP($x_win + 333,$y_win + 574)
END_SUB
//все видимые цвета
SUB(scan)
   GETSCREEN
   //up
   $sc[0] = pxl($x_win +395,$y_win +130)
   $sc[1] = pxl($x_win +469,$y_win +153)
   $sc[2] = pxl($x_win +566,$y_win +183)
   $sc[3] = pxl($x_win +326,$y_win +154)
   $sc[4] = pxl($x_win +400,$y_win +186)
   $sc[5] = pxl($x_win +497,$y_win +219)
   $sc[6] = pxl($x_win +239,$y_win +184)
   $sc[7] = pxl($x_win +316,$y_win +218)
   $sc[8] = pxl($x_win +410,$y_win +264)
   //front
   $sc[9] = pxl($x_win + 205,$y_win + 248)
   $sc[10] = pxl($x_win + 276,$y_win + 286)
   $sc[11] = pxl($x_win + 361,$y_win + 332)
   $sc[12] = pxl($x_win + 219,$y_win + 323)
   $sc[13] = pxl($x_win + 289,$y_win + 367)
   $sc[14] = pxl($x_win + 366,$y_win + 420)
   $sc[15] = pxl($x_win + 231,$y_win + 390)
   $sc[16] = pxl($x_win + 295,$y_win + 436)
   $sc[17] = pxl($x_win + 365,$y_win + 489)
   //right
   $sc[18] = pxl($x_win + 456,$y_win + 325)
   $sc[19] = pxl($x_win + 531,$y_win + 280)
   $sc[20] = pxl($x_win + 597,$y_win + 236)
   $sc[21] = pxl($x_win + 445,$y_win + 416)
   $sc[22] = pxl($x_win + 518,$y_win + 360)
   $sc[23] = pxl($x_win + 581,$y_win + 313)
   $sc[24] = pxl($x_win + 444,$y_win + 485)
   $sc[25] = pxl($x_win + 509,$y_win + 428)
   $sc[26] = pxl($x_win + 568,$y_win + 382)
   
   FOR($col=0,$col<27)
      SWITCH($sc[$col])
         CASE(6684723)
            $sc[$col] = 1    //ф
         CASE(16737792)
            $sc[$col] = 2    //c
         CASE(179)
            $sc[$col] = 3    //к
         CASE(18432)
            $sc[$col] = 4    //з
         CASE(15790320)
            $sc[$col] = 7    //б
         CASE(43733)
            $sc[$col] = 6    //ж
      END_SWITCH
   END_CYC
END_SUB


$wait = 500   //задержка после движений грани
//все варианты движений   граней
SUB(F1,$fb)
   IF($fb = 0)
      LDOWN($x_win + 447,$y_win + 325)
      waitms(50)
      LUP($x_win + 448,$y_win + 482)
   ELSE
      LDOWN($x_win + 448,$y_win + 482)
      waitms(50)
      LUP($x_win + 447,$y_win + 325)
   END_IF
   waitms($wait)
END_SUB

SUB(F2,$fb)
   IF($fb = 0)
      LDOWN($x_win + 536,$y_win + 273)
      waitms(50)
      LUP($x_win + 514,$y_win + 423)
   ELSE
      LDOWN($x_win + 514,$y_win + 423)
      waitms(50)
      LUP($x_win + 536,$y_win + 273)
   END_IF
   waitms($wait)
END_SUB


SUB(F3,$fb)
   IF($fb = 0)
      LDOWN($x_win + 596,$y_win + 232)
      waitms(50)
      LUP($x_win + 568,$y_win + 378)
   ELSE
      LDOWN($x_win + 568,$y_win + 378)
      waitms(50)
      LUP($x_win + 596,$y_win + 232)
   END_IF
   waitms($wait)
END_SUB


SUB(R1,$fb)
   IF($fb = 0)
      LDOWN($x_win + 374,$y_win + 495)
      waitms(50)
      LUP($x_win + 367,$y_win + 342)
   ELSE
      LDOWN($x_win + 367,$y_win + 342)
      waitms(50)
      LUP($x_win + 374,$y_win + 495)
   END_IF
   waitms($wait)
END_SUB


SUB(R2,$fb)
   IF($fb = 0)
      LDOWN($x_win + 295,$y_win + 431)
      waitms(50)
      LUP($x_win + 276,$y_win + 288)
   ELSE
      LDOWN($x_win + 276,$y_win + 288)
      waitms(50)
      LUP($x_win + 295,$y_win + 431)
   END_IF
   waitms($wait)
END_SUB

SUB(R3,$fb)
   IF($fb = 0)
      LDOWN($x_win + 237,$y_win + 387)
      waitms(50)
      LUP($x_win + 205,$y_win + 244)
   ELSE
      LDOWN($x_win + 205,$y_win + 244)
      waitms(50)
      LUP($x_win + 237,$y_win + 387)
   END_IF
   waitms($wait)
END_SUB

SUB(U1,$fb)
   IF($fb = 0)
      LDOWN($x_win + 379,$y_win + 337)
      waitms(50)
      LUP($x_win + 202,$y_win + 256)
   ELSE
      LDOWN($x_win + 202,$y_win + 256)
      waitms(50)
      LUP($x_win + 379,$y_win + 337)
   END_IF
   waitms($wait)
END_SUB

SUB(U2,$fb)
   IF($fb = 0)
      LDOWN($x_win + 594,$y_win + 307)
      waitms(50)
      LUP($x_win + 425,$y_win + 438)
   ELSE
      LDOWN($x_win + 425,$y_win + 438)
      waitms(50)
      LUP($x_win + 594,$y_win + 307)
   END_IF
   waitms($wait)
END_SUB

SUB(U3,$fb)
   IF($fb = 0)
      LDOWN($x_win + 583,$y_win + 369)
      waitms(50)
      LUP($x_win + 415,$y_win + 514)
   ELSE
      LDOWN($x_win + 415,$y_win + 514)
      waitms(50)
      LUP($x_win + 583,$y_win + 369)
   END_IF
   waitms($wait)
END_SUB

//небольшие комбинации
SUB(RURU)
   R1(1)
   U3(0)
   R1(0)
   U3(1)
END_SUB

SUB(shot)
   U1(0)
   R1(0)
   U1(1)
   R1(1)
   U1(1)
   F1(1)
   U1(0)
   F1(0)
END_SUB




//////////////

wait(1)
print("ровняем кубик")
level()
wait(1)




FOR($a=0,$a<3)
   scan()
   IF($sc[4] = 6)
      $a = 3
   ELSE
      F2(0)
   END_IF
END_CYC
FOR($a=0,$a<3)
   scan()
   IF($sc[4] = 6)
      $a = 3
   ELSE
      R2(0)
   END_IF
END_CYC

WHILE($sc[13] ! 1)
   U2(0)
   scan()
END_CYC
print("этап 1 - желтый крест на верхней грани")
FOR($kr=1,$kr<5)
   
   $temp = 0
   FOR($a=0,$a<4)
     
      IF(($sc[7]+$sc[10] = $kr+6)&($sc[7]*$sc[10] = $kr*6))
      ELSE
         IF(($sc[14]+$sc[21] = $kr+6)&($sc[14]*$sc[21] = $kr*6))
           
            R1(1)
            U3(0)
            FOR($back=0,$back<$a-1)
               R1(1)
            END_CYC
           
            FOR($back=0,$back<$temp)
               U1(1)
               U2(1)
            END_CYC
           
            F1(0)
            F1(0)
            $a = 4
           
         ELSE
            R1(0)
            IF($a = 3)
               
               U1(0)
               U2(0)
               U3(0)
               $a = -1
               inc($temp)
            END_IF
           
         END_IF
         
      END_IF
      scan()
   END_CYC
   
   scan()
   IF($sc[7] ! 6)
      F1(0)
      U1(1)
      R1(0)
      U1(0)
   END_IF
   
   U1(0)
   U2(0)
   U3(0)
   scan()
   
   
END_CYC

print("этап 2 - верхние углы на свои места")
FOR($kr=1,$kr<5)
   FOR($a=0,$a<4)
      scan()
      $kr1 = $kr+6+$kr+1
      $kr2 = $kr*6*($kr+1)
      IF($kr=4)
         $kr1 = $kr+7
         $kr2 = $kr*6
      END_IF
     
      IF(($sc[8]+$sc[11]+$sc[18]=$kr1)&($sc[8]*$sc[11]*$sc[18]=$kr2))
         
         IF($a > 0)
            RURU()
            FOR($back=0,$back<$a)
               U1(1)
               U2(1)
            END_CYC
            RURU()
         END_IF
         
         
         scan()
         
         WHILE($sc[8] ! 6)
            RURU()
            RURU()
            scan()
         END_CYC
         
         $a = 9
      ELSE
         U1(0)
         U2(0)
         IF($a = 3)
            WHILE((($sc[8]+$sc[11]+$sc[18]=$kr1)&($sc[8]*$sc[11]*$sc[18]=$kr2)) ! 1)
               U3(0)
               R1(0)
               scan()
               R1(1)
               
            END_CYC
            RURU()
            scan()
            $a = -1
         END_IF
      END_IF
      scan()
   END_CYC
   
   U1(0)
   U2(0)
   
END_CYC

print("переворачиваем кубик")
FOR($a=0,$a<2)
   R1(0)
   R2(0)
   R3(0)
END_CYC
U2(0)
U3(0)

print("этап 3 - ребра в среднем ряду")
FOR($kr=1,$kr<5)
   FOR($a=0,$a<4)
      scan()
      $kr1 = $kr+$kr+1
      $kr2 = $kr*($kr+1)
      IF($kr=4)
         $kr1 = $kr+1
         $kr2 = $kr
      END_IF
     
     
      IF(($sc[21] = $kr) & ($sc[14]+$sc[21]=$kr1)&($sc[14]*$sc[21]=$kr2))
         $a = 4
      else
         
         
         IF(($sc[7]+$sc[10]=$kr1)&($sc[7]*$sc[10]=$kr2))
            shot()
            IF($sc[21] ! $kr)
               $a = 2
            else
               $a = 4
            END_IF
           
         else
           
            U1(0)
            IF($a = 3)
               $temp = 0
               WHILE((($sc[14]+$sc[21]=$kr1)&($sc[14]*$sc[21]=$kr2)) ! 1)
                  U2(0)
                  U3(0)
                  inc($temp)
                  scan()
               END_CYC
               
               shot()
               
               FOR($back=0,$back<$temp)
                  U2(1)
                  U3(1)
               END_CYC
               $a= -1
            END_IF
         END_IF
      END_IF
     
   END_CYC
   U2(1)
   U3(1)
   
END_CYC

scan()

print("этап 4 - белый крест на верху")
WHILE(($sc[1]+$sc[3]+$sc[4]+$sc[5]+$sc[7]) ! 35)
   
   IF(($sc[1]+$sc[4]+$sc[7])=21)
      U1(0)
      WHILE(($sc[1]+$sc[3]+$sc[4]+$sc[5]+$sc[7]) ! 35)
         F1(0)
         R1(0)
         U1(0)
         R1(1)
         U1(1)
         F1(1)
         scan()
      END_CYC
   ELSE
      IF(($sc[1]+$sc[4]+$sc[5])=21)
         U1(1)
      ELSE
         IF(($sc[4]+$sc[5]+$sc[7])=21)
            U1(1)
            U1(1)
         ELSE
            IF(($sc[3]+$sc[4]+$sc[7])=21)
               U1(0)
            END_IF
         END_IF
      END_IF
      WHILE(($sc[1]+$sc[4]+$sc[7])!21)
         F1(0)
         R1(0)
         U1(0)
         R1(1)
         U1(1)
         F1(1)
         scan()
      END_CYC
     
   END_IF
   
   
END_CYC

print("этап 5 - верхние ребра на свои места")
scan()
$temp = 0
$temp2 = 0
WHILE(($sc[13] ! $sc[10]) | ($sc[19] ! $sc[22]))
   U1(0)
   U2(0)
   U3(0)
   inc($temp)
   IF($temp = 4)
      $temp = 0
      inc($temp2)
      U1(0)
   END_IF
   scan()
   
   IF($temp2 = 5)
      WHILE($sc[19] ! $sc[22])
         U1(0)
         U2(0)
         U3(0)
         inc($temp)
         IF($temp = 4)
            $temp = 0
            U1(0)
         END_IF
         scan()
         
      END_CYC
      R1(0)
      U1(0)
      R1(1)
      U1(0)
      R1(0)
      U1(0)
      U1(0)
      R1(1)
      $temp2 = 0
      scan()
   END_IF
   
   
END_CYC

U1(1)
U2(1)
U3(1)
scan()
IF(($sc[13] ! $sc[10]))
   R1(0)
   U1(0)
   R1(1)
   U1(0)
   R1(0)
   U1(0)
   U1(0)
   R1(1)
   U1(0)
END_IF


print("этап 6 - углы верхнего слоя на свои места")
scan()
$temp = 0
WHILE(($sc[8]*$sc[11]*$sc[18]) ! ($sc[4]*$sc[13]*$sc[22]) )
   U1(0)
   U2(0)
   U3(0)
   inc($temp)
   IF($temp = 4)
      $temp = 0
      U1(0)
      R1(0)
      U1(1)
      R3(0)
      U1(0)
      R1(1)
      U1(1)
      R3(1)
   END_IF
   scan()
END_CYC


U1(1)
U2(1)
U3(1)
scan()


IF(($sc[8]*$sc[11]*$sc[18]) ! ($sc[4]*$sc[13]*$sc[22]) )
   $mem = ($sc[8]*$sc[11]*$sc[18])
   U1(1)
   U2(1)
   U3(1)
   scan()
   IF($mem = ($sc[4]*$sc[13]*$sc[22]) )
      U1(1)
      U2(1)
      U3(1)
      U1(1)
      R3(0)
      U1(0)
      R1(0)
      U1(1)
      R3(1)
      U1(0)
      R1(1)
     
   else
      FOR($a=0,$a<2)
         U1(1)
         U2(1)
         U3(1)
      END_CYC
     
      U1(0)
      R1(0)
      U1(1)
      R3(0)
      U1(0)
      R1(1)
      U1(1)
      R3(1)
   END_IF
END_IF

print("этап 7 - разворачиваем углы как положено")
scan()
WHILE($sc[13] ! 3)
   U1(1)
   U2(1)
   U3(1)
   scan()
END_CYC


FOR($a=0,$a<4)
   WHILE($sc[8] ! 7)
      RURU()
      RURU()
      scan()
   END_CYC
   U1(0)
   scan()
END_CYC

print("готово")

halt

Кликерман сам определяет положение голубого окошка с кубиком на экране. Важно, чтобы его было видно целиком. А момент запуска и принцип действие видно в том же видео ролике  https://youtu.be/foHWvLXU1JQ

8
демонстрационный код:
Code: (clickermann) [Select]
STRWRITELN ("test.bat", "pause", 1) //не выполняется
EXECUTE ("test.bat")
wait(2)

STRWRITELN ("test.bat", "pause") //выполняется, скрин ниже
EXECUTE ("test.bat")
halt


в батнике:
Code: [Select]
pause
pause

получается, что к первой строке дописывается какаято ересь, и она игнорируется. в 4.13.010b вроеде еще работало правильно.

9
 Многие помнят ту тему, где обсуждали существующий колормод, где была раскрыта тайна его работы, и эта тема была удалена. Я после этого еще долго ломал голову над тем, как должна работать коррекция. В итоге, перечитав кучу инфы (впустую), потратив кучу времени на различные комбинации, расчеты и пр. - иии, ПРОФИТ  :D . Конечно работает он не так изящно и быстро как оригинальный, но зато появляется больше возможностей. Да и сам алгоритм оказался не таким уж и сложным, пару битовых операций, и готово.
 
 Написал это все на км, скорость все равно подводила  :( . А тут наконец удалось заставить работать DLL библиотеки. Переписал все это дело в делфи. Скорость вполне себе ничего вышла, мой калькулятор справляется с областью (0, 0, 1000, 100)=100кпикс за 1.5сек. При этом пишет это все сразу в память км.

 Небольшое описание:

Режимов в моем случае - 23. С каждым следующим режимом добавляется один бит на пиксель.
Режимы коррекции-
1   - 2 цвета
2   - 4 цвета
3   - 8 цветов
4   - 16 цветов
5   - 32 цвета
.... и так далее, до 23 - 8388608 цветов

как выглядят обработанные изображения:

оригинал


по нарастающей, до двенадцатого режима
                     
и так далее...

Написано строго под версию 4.13.014b. При первом вызове подпрограммы, произведется поиск адреса начала графического буфера км, занимает пару секунд. Далее работает довольно быстро.
Интересно, как поведет себя данная процедура на других ПК.

Код пока не буду выкладывать, пусть побудет у меня  :D .

Пример вызова:
Code: (clickermann) [Select]
SUB(s_cmode, $x1_cm, $y1_cm, $x2_cm, $y2_cm, $mode_cm)
   IF($adress_cm = 0)
      $pid_cm = HGETPID($_hwnd_self)
      PXLREPLACE (0, 0, $_xmax, $_ymax, -1, 0)
      PXLREPLACE (0, 0, 0, 0, -1, 1234567)
      CALL("adress_clip.dll", $pid_cm)
      $adress_cm = $_return1
      GETSCREEN
   END_IF
   CALL("c_mode.dll" ,$x1_cm, $y1_cm, $x2_cm, $y2_cm, $mode_cm, $pid_cm, $adress_cm, $_xmax)   
END_SUB
///////////////////////////////////////////////////////


$x1 = 540
$y1 = 310
$x2 = 780
$y2 = 460

GETSCREEN
//вызов
s_cmode($x1, $y1, $x2, $y2, 3)

SCREENSHOT // смотрим
   

halt

Естественно, длл-ки в одной дерриктории со скриптом. Две библиотеки во вложении. У кого фобия к неизвестным длл, проходим мимо  ;D.

Знаком с делфи всего пару дней, так что скорее всего буду совершенствовать эти библиотеки по мере моих способностей.


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

 принцип мысли - ищем первый пиксель искомой картинки и проверяем ранее проверенный PXLXOR этой картинки, если нет, то далее со следующим найденным первым пикселем.

 идея пришла, время и техники для тестов нет. вот, на своем калькуляторе испытал, результаты неплохие. если кому интересно, мог бы норм потестить, усовершенствовать и в либу всунуть.




разрешение искомой области 1366 х 768. на вин10 сложновато с его вездесущим сглаживанием.

где ищем:


что ищем (100х100 !!!):


как ищем:
Code: (clickermann) [Select]
GETSCREEN
// 3497629 цвет первого пикселя

SCANPXL($ARR, 0,0, $_xmax,$_ymax, 3497629)
print(ARRSIZE($ARR)/2, " возможных координат")


$t = $_ms
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "1.bmp", -1, 100)
   print("нашли по старинке в координатах ",$_return1," х ", $_return2)
END_IF
print("за ",$_ms - $t, " ms.")
print(" ")
waitms(500)


$t = $_ms
$size = ARRSIZE($ARR)
FOR($i=0,$i<$size,2)
   IF(PXLXOR($ARR[$i],$ARR[$i+1],$ARR[$i]+100,$ARR[$i+1]+100) = 16584102) //16584102 - ранее подсчитаная контр сумма
      print("нашли по новинке в координатах ",$ARR[$i]," х ", $ARR[$i+1])
      $i=$size
   END_IF
END_CYC
print("за ",$_ms - $t, " ms.")
print(" ")

halt

результат:
Code: (html5) [Select]
22:49:10 2 возможных координат
22:49:13 нашли по старинке в координатах 640 х 352
22:49:13 за 4251 ms.
22:49:13 
22:49:14 нашли по новинке в координатах 640 х 352
22:49:14 за 23 ms.
22:49:14 

в 180 раз быстрее!!!

естественно, что скорость будет зависеть от количества "первых пикселей" в искомой области.



11
Внимание, требуется доп. оборудование!!!

 До недавнего времени ни разу не сталкивался с защитами от кликеров. И вот этот день наступил. Мне даже интересно стало - как вся эта защита выглядит, и неужели ее никак не обойти. Первое что испробовал, это режим пс2, благо на пк такой порт еще есть, хоть и комбинированный. Мышки на пс2 не нашел, а клавиатура как раз туда и втыкнута. Клавиатурные нажатия + #ps2_keyboard работают отлично. Даже и не подозревал какая это полезная штука оказывается "режим PS/2"  .

 Но идем дальше. На ноуте, которым пользуюсь чаще, пс2 уже нет  >:( . И как тут быть? И пришла мне тут идея, а неужели нельзя аппаратно жать на нужные кнопки? К счастью для экспериментов под рукой завалялась плата "ардуино". Описание девайса тут.

 Идея заключается в том, чтобы данный контроллер жал на те кнопки, которые я ему скажу жать. Гдето в интернети встречал какието доп. модули для ардуино, но в данный момент мне это было не интересно (заказывать, ждать, ... интереснее сделать самому).

 Для начала нашел ненужную усб мышку. Как мне кажется с мышкой соединить ардуино куда проще чем с клавиатурой. С клавитурой пока не пробовал, нет у меня лишней усб клавы, да и еще не уверен что чтото с ней получится. Немного почитал, вспомнил как там программируется ардуино, этот закрученный язык си  >:( . Сразу понял, что на две кнопки мышки он нажмет. Благо там контак просто на массу замыкает, а digitalWrite какраз так и делает - либо 5в, либо "масса".

 Идем дальше, нужно как то сообщить контроллеру что я хочу нажать, и в кокой момент. Ардуина подключена к пк через усб к виртуальному ком порту, и без проблем передает сообщени и принимает их. Тут пришлось немного поламать голову. Ни как не мог разобраться как послать ту инфу, что я хочу. Идея была посылать байт информации, 256 значений хватило бы для любых прихотей. Принцип передачи так и работает, но передача идет символов ASCI. И получается, что я могу отправить только те символы, которые могу напечатать, а всякие там шифты, контралы, управляющий символ и прочее отправить уже не получится. Речь идет о передаче через командную строку, мы же не привыкли носить кучу доп. утилит и приложений (кстати они вроде как могут передавать все что захочешь). Ну да ладно, немного усложним работу, и будем отправлять число строкой, тем более что полюбому консоль в добавок после символа отправляет "переход на след. строку" и "возврат коретки" 13 и 10 если не ошибаюсь, которые в любом случае придется отсортировывать.
 
 Ну чтож, с передачей информации разобрался. Переходим к нашему любимому "кликерману". Жаль что он не может послать в ком на прямую  :( . требуется создание батника каждый раз  :( . Создаю строку - десятичный код клавиши + символ обозначающий зажатие и отпускание кнопки (U или D). Вышло как то так:
Code: (clickermann) [Select]
SUB(key, $char)
   STRWRITELN ("file.bat", STRCONCAT("Mode com",$comport," baud=9600 parity=n data=8 stop=1"), 1)
   STRWRITELN ("file.bat", STRCONCAT("echo ",$char,"> com",$comport), 0)
   EXECUTE("file.bat")
END_SUB

key(STRCONCAT($key,"D"))  // $key - десятичный код клавиши
waitms(100)
key(STRCONCAT($key,"U"))
Ардуино в свою очередь мониторит нужный порт на наличие сообщения. Как только появляются байты для считывания Serial.available(), пишет цифры в массив, а мой управляющий символ в переменную.
Code: (javascript) [Select]
  while (Serial.available() > 0) {

    int inchar = Serial.read();
    if (inchar == 'U') {
      presskey = false;
    }
    if (inchar == 'D') {
      presskey = true;
    }
    if (isDigit(inchar)) {
      instring += (char)inchar;
    }
    if (inchar == '\n') {
      val = instring.toInt();
      instring = "";
    }
  }

 А потом, имея код кнопки, выбираем на какой контакт подать "минус" digitalWrite(pin, LOW). К этому контакту заранее был подведен и припаян провод от нужной кнопки мышки.

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

 В этоге - код для "ардуино" для левой и правой кнопки мыши:
Code: (javascript) [Select]
String instring = "";
int val = 0;
boolean presskey = false;
int lmouse = 52;
int rmouse = 53;

int getPress(int key) {
  if (presskey == true) {
    digitalWrite(key, LOW);
  }
  else {
    digitalWrite(key, HIGH );
  }
}

void setup() {
  Serial.begin(9600);
  lcd.begin(16, 2);

  pinMode(lmouse, OUTPUT);
  digitalWrite(lmouse, HIGH);
  pinMode(rmouse, OUTPUT);
  digitalWrite(rmouse, HIGH);
}

void loop() {
  while (Serial.available() > 0) {

    lcd.clear();
    int inchar = Serial.read();
    if (inchar == 'U') {
      presskey = false;
    }
    if (inchar == 'D') {
      presskey = true;
    }
    if (isDigit(inchar)) {
      instring += (char)inchar;
    }
    if (inchar == '\n') {
      val = instring.toInt();
      lcd.print("key: ");
      lcd.print(val);
      lcd.setCursor(0, 1);
      lcd.print("press: ");
      lcd.print(presskey);
      instring = "";


      switch (val) {
        case 1:
          getPress(lmouse);
          break;
        case 2:
          getPress(rmouse);
          break;
      }
    }
  }
}

Код для "кликермана" - press, dbpress, down и up :
Code: (clickermann) [Select]
#name "arduino mouse"

$comport = 6

SUB(key, $char)
   STRWRITELN ("file.bat", STRCONCAT("Mode com",$comport," baud=9600 parity=n data=8 stop=1"), 1)
   STRWRITELN ("file.bat", STRCONCAT("echo ",$char,"> com",$comport), 0)
   EXECUTE("file.bat")
END_SUB

SUB(press, $keypress)
   key(STRCONCAT($keypress,"D"))
   waitms(100)
   key(STRCONCAT($keypress,"U"))
END_SUB

SUB(dbpress, $dbpresskey)
   press($dbpresskey)
   waitms(100)
   press($dbpresskey)
END_SUB

SUB(down, $keydown)
   key(STRCONCAT($keydown,"D"))
END_SUB

SUB(up, $keyup)
   key(STRCONCAT($keyup,"U"))
END_SUB
///////////////////////////////////////////////////////////////////////////////

wait(1)
move(2040,940)
waitms(100)
dbpress(1)

wait(1)
press(2)

wait(1)
move(2010,930)
waitms(100)
down(1)
waitms(500)
move(2010,880)

wait(1)
up(1)

halt

И небольшое видео демонстрирующее работу: https://www.youtube.com/watch?v=NO2GOfSAqJE



 Идея , я думаю, очень даже интересная. Если у кого то есть мысли по поводу работы с клавиатурой, прошу в тему. Если есть какието замечания в проделанной мной работе, не стесняйтесь, комментируйте  :D.







12
есть поле, на котором 15 красных точек. разбросаны рандомно. на поле появляется 16-я точка, зеленая, также в рандомном месте.



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

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


13
  задачка такова. есть у меня точка в 3д пространстве (пусть будет А), координаты хуz этой точки известны. точку А можно перемещать в любом направлении, при перемещении ее координаты также известны. также существует точка Б, эта точка недвижима, стоит на месте, координаты не известны. также имеем расстояние от точки А до Б, естественно оно изменяется в зависимости от местонахождения точки А. как вы уже поняли, нужно найти координаты точки Б.
  насколько я понял, имея начальные координаты точки А и начальное расстояние от точки А до точки Б, и сравнив эти данные с обновленными (смещаем в рандомном направлении точку А), скорее всего можно определить координаты точки Б. возможно я и заблуждаюсь. если кто знает варианты расчетов, делитесь, буду рад любой помощи.

14
как мы видим из справки, инструкция не работает в оконном режиме. может кто подскажет реализацию данной процедуры через  POSTMESSAGE ?
возможно кто нибудь знает  еще варианты?

15
Предложения / коррекция яркость/контраст
« on: February 17, 2016, 01:53:01 AM »
 по сути это продолжение из темы http://crapware.aidf.org/forum/index.php?topic=2390.msg14982#msg14982 . но я там размечтался насчет мегафункционала по обработке изображения  :D. да, всё это будет лишним, и врядли ктото будет пользоваться всякими сепиями, чернобелым и тп.
но всеже есть процедура коррекции, которая значительно бы помогла в множестве ситуаций, и это какраз таки контраст. сильно не вникал как он там должен работать, прочитал пару статей, в редакторах както это всё сложно, и по сути нам ведь не нужно чтобы картинка стала красивее, нам нужно как можно точнее выделить нужные нам цвета в изображении.
немного поэкспериментировал, остановился на примитивном изменении контраста и яркости. меняя 2 параметра $mid и $k можно как увеличивать\уменьшать контраст, так и увеличивать\уменьшать яркость. $mid - это та середина яркости, от которой скрипт будет повышать яркость пикселей которые светлее этого самого $mid. и понижать яркость тех пикселей, которые темнее $mid. его значение от 0 до 255. $k - это то значение , на которое будет повышаться или уменьшаться (при отрицательном значении) яркость.
Code: (clickermann) [Select]
$x1=903
$y1=956
$x2=968
$y2=1003


$mid=147
$k=40
//=========================
print("start")
GETSCREEN($x1,$y1,$x2,$y2)
SCREENSHOTEX($x1,$y1,$x2,$y2)
FOR($y=$y1,$y<$y2+1)
   FOR($x=$x1,$x<$x2+1)
      $c= pxl($x,$y)
      IF(((colorr($c)+colorg($c)+colorb($c))/3) > $mid)
         $outr=colorr($c)+$k
         $outg=colorg($c)+$k
         $outb=colorb($c)+$k
         IF($outr < $mid)
            $outr=$mid
         END_IF
         IF($outg < $mid)
            $outg=$mid
         END_IF
         IF($outb < $mid)
            $outb=$mid
         END_IF
      else
         $outr=colorr($c)-$k
         $outg=colorg($c)-$k
         $outb=colorb($c)-$k
         IF($outr > $mid)
            $outr=$mid
         END_IF
         IF($outg > $mid)
            $outg=$mid
         END_IF
         IF($outb > $mid)
            $outb=$mid
         END_IF
      END_IF
      IF($outr < 0)
         $outr=0
      END_IF
      IF($outg < 0)
         $outg=0
      END_IF
      IF($outb < 0)
         $outb=0
      END_IF
      IF($outr > 255)
         $outr=255
      END_IF
      IF($outg > 255)
         $outg=255
      END_IF
      IF($outb > 255)
         $outb=255
      END_IF
      PXLREPLACE($x,$y,$x,$y,$c,COLORGEN($outr,$outg,$outb))
   END_CYC
END_CYC
print("fin")

SCREENSHOTEX($x1,$y1,$x2,$y2)
halt
как это работает, примеры:

исходное изображение

 [spoiler=немного больше яркости $mid=0 $k=40][/spoiler]
 [spoiler=немного меньше яркости $mid=255 $k=50 (или $mid=0 $k=-50)][/spoiler]
 [spoiler=немного больше контраста $mid=147 $k=25][/spoiler]
 [spoiler=немного меньше контраста $mid=147 $k=-25][/spoiler]

так для чего же это всё нужно? покажу пару примеров.
пример Vint'a:


$mid=160 $k=255
$mid=170 $k=255

примеры с распознаванием чисел, не охота было искать где это применять, но вспоминаю, что часто отказывался от распознавания, в силу того, что колормид не мог отделить сами цифры от фона. но, как пример, покажу на капче, где кокраз таки при колормод 8, встречались иногда прострелы в контурах цифр.
капча
колормод 8
$mid=170 $k=255
$mid=190 $k=255

ну и применение без разделения на 2 цвета также должно помоч в некоторых ситуациях. например в игре "мастер гитары 2" (если ктото встречался с этой игрой), до того как ввели цвета грифов, оранжевая дорожка по цвету почти совпадала с движущейся фишкой. а когда всунули динамические изменения цветов грифа, никакой колормод не мог справится. я уверен, что данная процедура помогла бы в этой ситуации.

некоторые скажут - "так написал же скрипт, всунь в подпрограмму и пользуйся". но хотелось бы чтоб эта коррекция работала также быстро как и существующий колормод. изменение поочереди каждого пикселя это оооочень долго.


что думаете? поможет на деле чтото этоковое, или это снова я размечтался  :D ?

по сути, правильно чередуя колормод яркость и контраст, можно выделить любой искомый цвет или диапазон цветов в картинке.


Pages: [1] 2