Автор Тема: взять часть буфера и поместить в указанное место в указный файл  (Прочитано 4468 раз)

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

Narindo

  • Зашел в гости
  • *
  • Сообщений: 3
    • Просмотр профиля
в кликере есть функция, которая берет часть графического буфера и сохраняет в файл:

SCREENSHOTEX(x1, y1, x2, y2, ["pref"], [format]) - сохраняет графический буфер анализа на диск

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

пример:
SCREENSHOTEXIN(x1, y1, x2, y2, x3, y3 , ["file"], [format]) , где
x1, y1, x2, y2 - четыре координаты, описывающие сохраняемую область буфера
х3, у3 это координаты в в сохраняемом файле "file", куда должен встать верхний левый угол "вырезанного" фрагмента из буфера. (вырезанный фрагмент может просто "накладываться" сверху перезаписывая, то что оказалось на том месте, куда он сохраняется)

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

возможно ли сделать такую функцию? если нет то подскажите как мне решить эту задачу: взять часть буфера и поместить в указанное место в указный файл
« Последнее редактирование: Сентябрь 25, 2015, 11:41:47 am от Narindo »

quant13

  • Активный участник
  • ***
  • Сообщений: 174
    • Просмотр профиля

Narindo

  • Зашел в гости
  • *
  • Сообщений: 3
    • Просмотр профиля
 я же вроде подробно писал задачу для чего нужна эта новая функция...
FSCapture - не подойдет. с ней можно быстро наделать скриншотов, а вот склеить их в один файл она не поможет.
мне же нужно:
1. сделать скрин экрана и распознать координаты места (кликером это осилю)
2. далее определяется положения карты на скрине и вырезается кусок со скрина - чисто одной карты (кликером это осилю)
3. производится анализ и расчет верхнего левого угла ( маленького, только что отснятого кусочка) карты, где он должен быть на большой карте (кликером это осилю)
4. нужно произвести "вклеивание" маленького кусочка карты на большой в заданное место. а вот тут-то функционал кликера не позволяет это сделать.
и если будет функция наподобие той что я описал выше, то я смогу решить свою проблему

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3685
  • Котэ
    • Просмотр профиля
Ты что то попутал кликер с фотошопом  :o

Vint

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3817
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • Просмотр профиля
Ты хочешь чтобы ввели отдельную функцию под твою одноразовую задачу.
Я уверен, что даже умей ты написать подобное на любом языке ты бы не стал этого делать и поберёг своё время. Склеил бы бы всё в фотошопе и делов.

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


dramster

  • Герой форума
  • *****
  • Сообщений: 1131
    • Просмотр профиля
а я вот попробовал ради интереса  ;D, и получилось  8). только вот скорость подводит  :(
не совсем то что требовалось - размер скрина ограничен размерами экрана.
Код: Clickermann
  1. #name "screen"
  2. $pid = 15436 //неазбываем вписывать PID кликера после каждого запуска кликера
  3.  
  4. SUB(adres,$int0)//перевод из десятичного в 16-ричное
  5.   $str16 = ""
  6.   FOR($a=0, $a < 8)      
  7.      $int = int($int0/16)
  8.      $val16 = $int0-($int*16)
  9.      IF($val16 > 9)
  10.         SWITCH($val16)
  11.         CASE(10)
  12.            $val16 = "A"
  13.         CASE(11)
  14.            $val16 = "B"
  15.         CASE(12)
  16.            $val16 = "C"
  17.         CASE(13)
  18.            $val16 = "D"
  19.         CASE(14)
  20.            $val16 = "E"
  21.         CASE(15)
  22.            $val16 = "F"
  23.         DEFAULT
  24.         END_SWITCH
  25.      END_IF
  26.      $str16 = STRCONCAT ($val16,$str16)      
  27.      $int0 = $int
  28.   END_CYC
  29.   // print($str16)
  30. END_SUB
  31.  
  32. SUB(SCREENin, $x1, $y1, $x2, $y2, $x3, $y3)
  33.   GETSCREEN($x1, $y1, $x2, $y2)
  34.   READMEM ($pid, "004E20FC", 4)  //читаем адрес начала буфера в указателе
  35.   $startbuf = $_return1+($y3*($_xmax+1)*4)+($x3*4) //с этой ячейки и начнем
  36.  
  37.   print("Blue")
  38.   FOR($y=0,$y<($y2-$y1))
  39.      FOR($x=0,$x<($x2-$x1))        
  40.         adres($startbuf+($y*($_xmax+1)*4)+($x*4))        
  41.         WRITEMEM ($pid, $str16, COLORB(pxl($x1+$x,$y1+$y)), 1)
  42.      END_CYC      
  43.   END_CYC
  44.   print("Green")
  45.   FOR($y=0,$y<($y2-$y1))
  46.      FOR($x=0,$x<($x2-$x1))        
  47.         adres($startbuf+($y*($_xmax+1)*4)+($x*4)+1)        
  48.         WRITEMEM ($pid, $str16, COLORG(pxl($x1+$x,$y1+$y)), 1)
  49.      END_CYC
  50.   END_CYC
  51.   print("Red")
  52.   FOR($y=0,$y<($y2-$y1))
  53.      FOR($x=0,$x<($x2-$x1))
  54.         adres($startbuf+($y*($_xmax+1)*4)+($x*4)+2)
  55.         WRITEMEM ($pid, $str16, COLORR(pxl($x1+$x,$y1+$y)), 1)
  56.      END_CYC
  57.   END_CYC
  58.   print("End")
  59. //   FOR($y=0,$y<($y2-$y1)) //в этой ячейке вероятнее всего, как мне казалось, записана прозрачность, там поумолчания записано "255"
  60. //      FOR($x=0,$x<($x2-$x1)) //но при изменении этого значения ничего не меняется
  61. //         adres($startbuf+($y*($_xmax+1)*4)+($x*4)+3)
  62. //         WRITEMEM ($pid, $str16, 100, 1)
  63. //      END_CYC
  64. //   END_CYC
  65.  
  66. END_SUB
  67. //--------------------------------------------------------
  68.  
  69.  
  70. GETSCREEN
  71. SCREENin(70,75,100,105,5,40)
  72. SCREENSHOTEX(0,0, 150,150, "Image_", 0)
  73.  
  74. halt

вот что вышло

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



на счет пару десятков мс это я канечно загнул  :D, но в секунду я думаю можно вложиться.
« Последнее редактирование: Сентябрь 21, 2015, 10:37:26 pm от dramster »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3817
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • Просмотр профиля
Прикольно. Но задача, мне кажется, была другая. Он хотел делая GETSCREEN впечатывать часть БОЛЬШОЙ карты, которая занимает не один экран. Ну я так понял.
т.е. 1-экран (рабочая область) = 1 элементу пазла. Вся картина состоит из множества пазлов.
Так что нужно создавать файл сразу всего размера в графическом редакторе и уже в его процесс переносить часть по GETSCREEN, как-то видимо привязавшись.
Ну и скорость конечно  :D ;D
« Последнее редактирование: Сентябрь 22, 2015, 07:50:23 am от Vint »


Narindo

  • Зашел в гости
  • *
  • Сообщений: 3
    • Просмотр профиля
dramster , работу проделал большую, но не в том направлении. ))

Толи я не так свои мысли выразил. Толи вы меня не понимаете...

Давайте зайдем с другой стороны. Задача:
есть файл 40-60.bmp размером 10 на 10 пикселов.
есть файл 50-60.bmp размером 10 на 10 пикселов.
есть файл 40-70.bmp размером 10 на 10 пикселов.
есть файл 50-70.bmp размером 10 на 10 пикселов.
есть файл map.bmp размером 100 на 100 пикселов.

нужно взять содержимое файла 40-60.bmp и поместить его в файл map.bmp. Причем так чтобы верхний левый угол содержимого файла 40-60.bmp оказался на координатах х=40 у=60 в файле map.bmp.
и так со всеми 4-мя картинками:
содержимое файла 50-60.bmp и поместить его в файл map.bmp. Причем так чтобы верхний левый угол содержимого файла 50-60.bmp оказался на координатах х=50 у=60 в файле map.bmp.
содержимое файла 40-70.bmp и поместить его в файл map.bmp. Причем так чтобы верхний левый угол содержимого файла 40-70.bmp оказался на координатах х=40 у=70 в файле map.bmp.
содержимое файла 50-70.bmp и поместить его в файл map.bmp. Причем так чтобы верхний левый угол содержимого файла 50-70.bmp оказался на координатах х=50 у=70 в файле map.bmp.


Пайнт, фотошоп и любой другой ручной способ не предлагать. Задача будет на много маштабнее чем 4 картинки и тут нужно автоматизировать процесс.

на сколько я понимаю функционал кликера тут не поможет. Подскажите тогда другую программу, которая может это сделать.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3817
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • Просмотр профиля
Ну значит я всё правильно понял.

http://autoit-script.ru/index.php?topic=14931.msg93814#msg93814
http://autoit-script.ru/index.php?topic=2485.0

Ну и собрать всё в кучу.

[spoiler]#include <GDIPlus.au3>
#Include <GDIP.au3>

_GDIPlus_Startup()
$hBitmap  = _GDIPlus_BitmapCreateFromScan0 ( 200, 200 )
For $i = 1 To 100
    _GDIPlus_BitmapSetPixel ( $hBitmap, $i, 10, 0xFF0007ff  )
Next
_GDIPlus_ImageSaveToFile($hBitmap, 'test.png') ;save bitmap to disk
_GDIPlus_Shutdown()
[/spoiler]

[spoiler]#Include <GDIPlus.au3>
#Include <WinAPI.au3>

_GDIPlus_Startup()
$hBitmap = _WinAPI_CreateSolidBitmap(0, 0xFFFFFF, 200, 200)
$hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
_WinAPI_DeleteObject($hBitmap)
$hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage)
$hBrush = _GDIPlus_BrushCreateSolid(0xFFFF0000)
_GDIPlus_GraphicsFillEllipse($hGraphic, 100, 50, 3, 3, $hBrush)
_GDIPlus_ImageSaveToFile($hImage, @ScriptDir & '\1.gif')
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_BrushDispose($hBrush)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_ShutDown()
[/spoiler]
« Последнее редактирование: Сентябрь 25, 2015, 12:15:24 pm от Vint »


dramster

  • Герой форума
  • *****
  • Сообщений: 1131
    • Просмотр профиля
я кстати на записи скрина в буфер тогда не остановился. и попробовал писать нужное в файл. остановился на "всовывании" нужной картинки в нужное место в файле. там немного сложновато определить куда писать, так как в бмп файле пиксели записываются в зеркальном виде начиная с нижнего левого угла. но это реализуемо. будет время и желание, продолжу.
вот мои наработки. покачто скрипт создает просто файл изображения. но создав олгаритм определения нужного места в строке, которое соответствует нужным координатам нашего вписываемого изображения, можно дописывать в файл то что надо. плюс к этому нужно дописывать пустое место пустыми пикселями.
Код: Clickermann
  1. #name "screen"
  2.  
  3. SUB(hex,$int0,$typ) //из десятичного в 16-ричное
  4.   $str16 = ""
  5.   FOR($a=0, $a < $typ)
  6.      $int = int($int0/16)
  7.      $val16 = $int0-($int*16)
  8.      IF($val16 > 9)
  9.         SWITCH($val16)
  10.         CASE(10)
  11.            $val16 = "A"
  12.         CASE(11)
  13.            $val16 = "B"
  14.         CASE(12)
  15.            $val16 = "C"
  16.         CASE(13)
  17.            $val16 = "D"
  18.         CASE(14)
  19.            $val16 = "E"
  20.         CASE(15)
  21.            $val16 = "F"
  22.         DEFAULT
  23.         END_SWITCH
  24.      END_IF
  25.      $str16 = STRCONCAT ($val16,$str16)
  26.      $int0 = $int
  27.   END_CYC
  28.   // print($str16)
  29. END_SUB
  30.  
  31. SUB(val10,$val16 ) // из 16 в 10-ное
  32.   SWITCH($val16)
  33.   CASE("A")
  34.      $val10 = 10
  35.   CASE("B"
  36.      $val10 = 11
  37.   CASE("C")
  38.      $val10 = 12
  39.   CASE("D")
  40.      $val10 = 13
  41.   CASE("E")
  42.      $val10 = 14
  43.   CASE("F")
  44.      $val10 = 15
  45.   DEFAULT
  46.      $val10 = $val16
  47.   END_SWITCH
  48. END_SUB
  49.  
  50.  
  51.  
  52.  
  53. //--------------------------------------------------------
  54.  
  55. SUB(screenin,$x1,$y1,$x2,$y2,$x3,$y3)
  56.  
  57.   $xmax = $x2-$x1 +1  //определяем размер
  58.   $ymax = $y2-$y1 +1
  59.   hex($xmax,3)
  60.  
  61.   $xmax16 = $str16
  62.   hex($ymax,3)
  63.   $ymax16 = $str16
  64.   TFWrite("input.bmp",StrConcat("424D1A02000000000000360000002800000",$xmax16, "00000",$ymax16,"0000000100200000000000E401000000000000000000000000000000000000"))//и вписываем размер в "заголовок" файла
  65.  
  66.   GETSCREEN ($x1,$y1,$x2,$y2)
  67.   FOR($y=0,$y<$ymax)//делаем скрин и записываем 16-ричный код в файл
  68.      $str = ""
  69.      FOR($x=$xmax-1,$x>(-1),-1)
  70.         hex(colorb(pxl($x2-$x,$y2-$y)),2)
  71.         $b16 = $str16
  72.         hex(colorg(pxl($x2-$x,$y2-$y)),2)
  73.         $g16 = $str16
  74.         hex(colorr(pxl($x2-$x,$y2-$y)),2)
  75.         $r16 = $str16
  76.         $str = StrConcat($str,$b16,$g16,$r16,"00")        
  77.      END_CYC
  78.  
  79.      inc($n)
  80.      print($n)
  81.      TFWrite("input.bmp",$str)
  82.   END_CYC
  83.  
  84.   print("end")
  85.  
  86. END_SUB
  87. print("start")
  88. screenin(20,20,50,50,0,0)
  89.  
  90. halt
  91.  
  92. //$xmax01 = (strcut2(TFREAD ("input.bmp",1),37,37 )) //это для дальнейшей работы, определение размера начальной картинки
  93. //$xmax02 = (strcut2(TFREAD ("input.bmp",1),38,38 ))
  94. //$ymax01 = (strcut2(TFREAD ("input.bmp",1),45,45 ))
  95. //$ymax02 = (strcut2(TFREAD ("input.bmp",1),46,46 ))
  96.  
  97. //val10($xmax01)
  98. //$val1 = $val10
  99. //val10($xmax02)
  100. //$val2 = $val10
  101. //$xmax0 =  int($val1)*16 + int($val2)
  102. //val10($ymax01)
  103. //$val1 = $val10
  104. //val10($ymax02)
  105. //$val2 = $val10
  106. //$ymax0 =  int($val1)*16 + int($val2)
  107.  
  108. //print($xmax0,"x",$ymax0 )
  109.  
  110. //halt

в этоге мы получаем файл в 16-ричном виде,
424D1A0200000000000036000000280000001F0000001F0000000100200000000000E401000000000000000000000000000000000000
A7430300A7430300A7430300A7430300A9430200A9430200A9430200A9430200A9430200A9430200A9430200A9430200AA440300AA440300A74B1100A9724F00B9A69B00CDCDCD00D5D5D500DFDFDF00E5E5E500E5E5E500E1E1E100DCDCDC00DDDDDD00DEDEDE00D3D3D300C0C0C000A2958D009A694B00A64D1700
A7430300A7430300A7430300A7430300A9430200A9430200A9430200A9430200A9430200A9430200A9430200A9430200A94302009F623B00B6AEA800D4D4D400D7D7D700DBDBDB00DCDCDC00DBDBDB00DADADA00D6D6D600D1D1D100C9C9C900CCCCCC00DFDFDF00D9D9D900C2C2C200BFBFBF00C9C9C900ADABA900
A7430300A7430300A7430300A7430300A9430200A9430200A9430200A9430200A9430200A9430200A9430200A9430200A3806A00CACACA00D0D0D000CBCBCB00CBCBCB00D0D0D000D7D7D700DADADA00DBDBDB00DADADA00D4D4D400CBCBCB00D2D2D200E4E4E400CDCDCD00B2B2B200C4C4C400C8C8C800B9B9B900
A7430300A7430300A7430300A7430300A7430300A7430300A7430300A7430300A7430300A7430300A7430300A2725300C5C5C500C4C4C400C1C1C100C7C7C700CCCCCC00D0D0D000D7D7D700DCDCDC00DDDDDD00DCDCDC00D4D4D400C8C8C800D3D3D300DEDEDE00C1C1C100C2C2C200CACACA00B5B5B500ACACAC00
A7430300A7430300A7430300A7430300A7430300A7430300A7430300A7430300A7430300A7430300A7430300B5AEAA00BDBDBD00BDBDBD00C1C1C100C4C4C400C8C8C800CECECE00D5D5D500DCDCDC00DDDDDD00DADADA00D2D2D200C7C7C700CDCDCD00CDCDCD00C1C1C100C2C2C200B4B4B400AFAFAF00A8A8A800
A6420200A6420200A6420200A6420200A7430300A7430300A7430300A7430300A7430300A7430300A7430300B4ADA800B7B7B700BABABA00BDBDBD00C0C0C000C4C4C400C9C9C900CFCFCF00D6D6D600D7D7D700D5D5D500CDCDCD00C4C4C400C5C5C500C0C0C000BDBDBD00B6B6B600AEAEAE00A2A2A20094949400
A6420200A6420200A6420200A6420200A7430300A7430300A7430300A7430300A7430300A7430300A7430300AF8F7A00BBBBBB00B9B9B900B9B9B900BEBEBE00C0C0C000C4C4C400C7C7C700CCCCCC00CECECE00CCCCCC00C7C7C700C3C3C300C0C0C000BABABA00B0B0B000A3A3A300949494008E8E8E0091919100
7B340600963C03008F3903008D3903008234020081340200A2410300A7430300A7430300A7430300A7430300A84E1400A0908500CACACA00C4C4C400B8B8B800BABABA00BEBEBE00C0C0C000C1C1C100C1C1C100C0C0C000B8B8B800AFAFAF00A3A3A30098989800838383006D6D6D00696969007F81810093929200
D8D8D90057463B00451E0400371C0B0063636300A5A5A30063493800723105009C3F0300A7430300A7430300A7430300A24408007B492900A7A19E00C7C7C700B9B9B900ADADAD00A5A5A500A4A4A400A4A4A40097979700898989007D7D7B0071717100656565005D5E5E0069696A00828283009A9A9B00ADABAE00
CFCFD000C2C2C200989898008B8B8B007070700099999900D2D2D200C5C4C10066514300703108009B3E0300A7430300A7430300A743030095430E00724A2F008F868000A1A1A100A6A6A5009F9F9E0085858500787877007A7A79007A7B7C007F7F810088898A009D9D9F00ABABAD00AFAEAE00B1AFB000B6B7B700
C8C8CC00ABACAC00ADACAC00B8B8B8008B8B8B006B6B6B007E7E7E00999A9B00D4D4D400B7B7B7006B513F006B310C008D390300A3410300A7430300A7430300A342040091410E008D61460094939200858589008B8A8D008E8E92009190950097979A00A1A1A400AAAAAC00A8ADB000AFB9BC00B7C8CB00C8D8DB00
C0BFC000B8B8B800BABABA00AFAFAF00CDCDCD00E9E9E900AAAAAA007473730079797B0095959600F5F6F500A3A2A2005D2C0D00913C07008F4415008F593800906B58008E7A71008C8482008A8A8E008C8C92008B8F94008B9196008C969C009AA8AD00B1BFC300C7D1D400D1D1D200D3C1BE00DBACA400D57F7200
BBBBBB008E8E8E009A9A9A00B5B5B500B5B5B500C0C0C000EBEBEB00F5F5F500949494006161620063605E007A6960008E7C7600A09C9E009F9FA6009A9DA10092979B0090979D00919DA10096A7AC00A3B0B400ADAEAF00B9A9AB00C6B0B000C8A39E00C8877E00C9625300BB2A1600B40B0000AB080000A4090000
BCBCBF009F9F9F009898980090909000989899009493950091919300989A9A0098969B009C9BA100A4A6AA00A4A9AD00A6AFB200A8B2B700A9B6BC00AEBDC200AFB8BA00B3A7A800C1A2A000C4908E00BB6F6A00B4463C00A9251600A10A0000A1060000A1060000A20E0000A61B0A00A8211200AC251300B1281400
BBBBBC009D9D9D009D9D9D009D9D9F008E8E9200928F95008A9293007AA39100929FA300A2AFB400B3C3C800C0CECF00C1C2C100B9A2A000BA878000B36D6B00A74C4A009E2C2400980E00008B0000008B0000008F000000930500009F1B0A00AB2B1C00AE2C1C00B12E1C00B3301B00B52F1C00B8301D00BA311F00
BBBBBC009D9D9D009F9F9F00B2B2B30096979A0095999D00ACBDBD00B4C3BF00B5ABAC00AD868300A8605D00A2474500962D2C008D130E00840000007A0000007C000000850000008A050000920F0000971000009C110000A2120000AE281600B6372600B6362500B8382600BB372700BF3B2700C23C2900C43E2A00
BCBCBD00A0A0A100A1A1A100B3B3B300A4A8AC00A28F8E0096393800962528008E1A1400880B0000800000007C0000007D0000007F00000081070000870D00008E0F0000900F0000940F00009A0F00009E100000A2110000A8140100B4311F00BC423200BF423100C3443100C6463200C8483400CB493500CD4B3600
BFBFBF00A6A6A400A5A5A500AFAFAF00B2B8BB009D898A007C00000082010000890E0600891107008812080087110700860F0400850B0100870C00008D0D0000920E0000950F00009A100000A0110000A5150000A7110000AC180500BF413000C6524100C9514000CD533F00D0554000D2574300D4584400D65A4500
BFBFC100A9A9A700A9A9A900ACACAC00BABCBD00A4A2A500820E0500901B120092251D008E1E15008C1B12008B170E0089140C00891206008D0D0000910D0000950F00009A0F0000A0110000A6130000A9140000A90F0000B31F0A00C8503E00CE604E00D15E4C00D5604D00D7624E00D9645000DB655000DE665100
C2C2C300ACAAAB00AAAAAA00B0B0B000C0C1C100B0B6BA0087241F00911C1200972E270093261E0091231B008E1F17008F1F16008F1508008F0B0000950E00009B0F0000A0110000A6130000A9140000AD150000AF100000BB271000D1604E00D66D5B00D96B5800DB6D5A00DE6E5B00E0705D00E3715D00E5735E00
C6C4C700B1AFB000B2B3B200B9B9B900C3C3C300B6BFC4008E3E3900911B11009C383100972F2800952B25009429210096281D0091100400920D0000990F0000A0110000A4130000A8140000AD150000B2160000B5100000C4321C00D9715F00DD796900DF776600E2796700E67B6800E67C6900E87D6A00EA7F6B00
C9CBC900B9BBB900B9B9B900BCBCBC00C6C6C700B9C3C70099565200911A1100A3443D009C3732009A362F009D382F009B261A00900B0000980F00009F100000A5140000A9150000AC150000B3160000B7180000BC110000CD412800E1827300E3867600E5847300E9867500EA877500EC897700EE8A7800F08B7900
CCCDCF00BEC0BE00BDBDBD00BFBFBF00C6C6C600BAC4C70097666500911A1200A8504800A1423D00A1423B00A642380095170A00930A00009D100000A4120000A9150000AC150000B2160000B9180000BE190000C2140000D6523D00E8938500EA928300EB928100EE938300EF958400F1968500F3978600F5988700
CDCFCF00C3C4C200C2C2C200C4C4C400C6C6C600BEC6C8009C7F80008F1E1700AD585100A54C4700AB514900A63C3200920B0000990F0000A1120000A8140000AB150000B0160000B7180000BE1B0000C41A0000C7170000DD655000EDA19400EE9D8F00EF9D8D00F19E8E00F3A09000F5A19000F7A29100F8A39200
D0D1D100C7C7C700C6C6C600C7C7C700C9C9C900C2C7CA00A99A9A008D261D00AF5B5500AC595100B25D54009D291B00930900009D110000A5130000AA150000AE160000B5180000BB190000C31B0000C7180000CD1D0000E5786600F1ADA200F1A79900F3A79900F5A89A00F7A99A00F9AB9B00F9AC9C00FBAD9E00
D3D3D300CBCBCB00C9C9C900CBCBCB00CBCBCB00CACDCF00B2AEAF0091302A00B15A5500B4675F00B55F560097160800980A0000A1120000A7140000AC150000B2160000B7180000BE1A0000C41C0000C9170000D2270A00EA8E7D00F4B6AC00F4B0A400F6B0A300F8B1A400F9B3A500FBB4A500FCB6A700FEB7A700
D5D8D900CFCFCF00CCCCCC00CDCDCD00CECECE00D0D3D400BCB8BB00963A3400B15C5500BE7A7200AC4C4200950900009E0F0000A5130000A9140000B0160000B8190000C31B0000CB1E0000D31F0000DA170000E63D1D00F7AA9900FCC3B700FDBCAE00FDBDAF00FEBFB000FEC1B100FFC2B100FFC3B300FFC5B300
D5D6D700D0D0D000CFCFCF00D1D1D100D2D2D200D6D7D800BBBBBC00953C3400B45F5900C4807A009F2A1D0099070000A6120000AE150000B6180000C21B0000CA1E0000D2200000DB220000E2220000E81B0000F4593700FDBFB300FFCBBF00FFC5B900FFC7B900FFC9BA00FFCBBB00FFCCBC00FFCCBC00FFCEBD00
E1E1E200CFCFCF00C8C8C800CECECE00D2D2D200DBDBDB00BBC0C1008F3E3900B9655D00BF7269009C100400A50F0000AD150000B5170000BE1A0000C61C0000CD1E0000D4210000DB230000E3220000EB1F0000F6725600FECEC400FFCEC500FFCDC100FFCEC100FFD0C200FFD1C300FFD3C400FFD4C400FFD5C500
FFFFFF00F8F8F800E5E5E500D9D9D900D3D3D300D3D3D300C0C8C900914F4A00BB605700B45144009C060000A8130000AF150000B8180000C01B0000C71D0000D0200000D7210000DE230000E81E0000EF270100FA917B00FFDBD400FFD5CB00FFD4C900FFD5C900FFD6CA00FFD7CA00FFD9CB00FFDACC00FFDBCC00
DCDFDF00F4F4F400FFFFFF00FFFFFF00FBFAFA00EAEAEA00C5CED2009C716D00AA423800A62B1E009F080000AB160000B2160000BA1A0000C21C0000CB1E0000D31F0000DA220000E3240000EC1F0000F3371100FEB2A200FFE3DC00FFDAD100FFDAD000FFDBD000FFDCD100FFDDD100FFDFD200FFE0D300FFE1D400

 это пока не картинка, нужно конвертировать изHEX в ASCII. в этом нам помогает notepad. конвертируем и получаем картинку

на создание картинки такого размера 31х31 уходит 3-4сек.




покачто данный код ограничен размерами скрина 255х255, так как в заголовке чтото непонятное нужно дописывать в изображениях с большим размером.
« Последнее редактирование: Сентябрь 25, 2015, 06:03:02 pm от dramster »

Луций

  • Активный участник
  • ***
  • Сообщений: 248
  • чат в телеге: https://t.me/klickermannchat
    • Просмотр профиля
    • Пишу скрипты на заказ:
хренасе у автоита форум о0

Vint

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3817
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • Просмотр профиля
вот что вышло

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


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

Решил перенести перевод в GREYSCALE как здесь http://crapware.aidf.org/forum/index.php?topic=2390.msg14982#msg14982
на AutoIt. Там всё таки скорость побольше.
Для начала поразбирался с твоим простым переносом в памяти. Было два образца 10х10 и 30х30 pxl.
Зависимость скорости линейна.

На твоём примере отсюда у меня показало такое время:
// SCREENin  OLD  Original
// поканально, старое вычисление HEX   = 17.70 ms/pxl
// 30х30         ~16000 мс               17.77 ms/pxl
// 10х10          ~1770 мс               17.70 ms/pxl
У меня , слава богу, не 30 сек получилось. Будем плясать от моей скорости.


Переделав перевод в HEX, добился ускорения на 17%
// SCREENin1  OLD
// поканально, новое вычисление HEX    = 14.70 ms/pxl    -17%
// 30х30         ~13500 мс, ~13300 мс    14.77 ms/pxl
//SCREENin1(70, 75, 99, 104, 5, 40)
// 10х10         ~1515 мс,  ~1470 мс     14.70 ms/pxl
//SCREENin1(70, 75, 79, 84, 5, 40)


Так как данные идут последовательно по пикселам, а не по каналам, решил обходить попиксельно обрабатывая на 1 пикселе сразу все каналы.
В результате этого, чтение цвета  (PXL) вызывается в 3 раза реже. И выделив вычисление части адреса отдельно получил такой результат:
// SCREENin2
// один PXL, часть адреса на строку    = 13.70 ms/pxl    -6.8%
// 30х30         ~12508 мс, ~12345 мс    13.72 ms/pxl
//SCREENin2(70, 75, 99, 104, 5, 40)
// 10х10         ~1370 мс,  ~1354 мс     13.70 ms/pxl
//SCREENin2(70, 75, 79, 84, 5, 40)
ещё -6,8%


На следующий день пришла в голову мысль: нафига мы пишем по 1 байту если в пикселе их 4. Что если писать сразу 4. Во столько же раз сократится вычисление адреса при записи и перевод адреса в HEX.
Правда пока додумался что там нужно каналы местами поменять кучу опытов провёл.
// SCREENin3
// попиксельно, Пишем по 4 байта       =  5.14 ms/pxl    -62.5% !!!
// 30х30         ~4648 мс, ~4620 мс       5.14 ms/pxl
//SCREENin3(70, 75, 99, 104, 5, 40)
// 10х10         ~524 мс,  ~518 мс        5.18 ms/pxl
//SCREENin3(70, 75, 79, 84, 5, 40)
Оу, ещё -62.5%


Проба читать тоже из памяти, а не через PXL не увенчалась успехом. Почти в 2 раза медленней преведущего варианта. Ну это и ожидаемо, адресов вычисляем в 2 раза больше.
// SCREENin4  BAD по 2 расчёта HEX адреса
// прямое копирование по 4 байта       =  9.48 ms/pxl    +84%  :((
// 30х30         ~8535 мс                 9.48 ms/pxl
//SCREENin4(70, 75, 99, 104, 5, 40)
// 10х10         ~521 мс,  ~506 мс        5.06 ms/pxl
//SCREENin3(70, 75, 79, 84, 5, 40)

Плавно переходим сюда:
http://crapware.aidf.org/forum/index.php?topic=2390.msg14982#msg14982

P.S. Ах, да, код вот
Код: Clickermann
  1. #name "screen_1.1.6"
  2. // Author: dramster, Vint
  3. // Version: 1.1.6 (10.08.2017)
  4. // Скрипт для Clickermann v4.11 003
  5. #include "..\..\Libs\logger.cms"
  6.  
  7. //                              Настройки
  8. //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  9.  
  10. //не забываем вписывать PID кликера после каждого запуска кликера
  11. $pid = 2052
  12.  
  13. // показывать окно лога. Глубина 0, 1, 2
  14. $log = 1
  15.  
  16. //##############################################################################
  17.  
  18. // ====== Подпрограммы =========================================================
  19. SUB(log_show) //===  показ лога  ===============================================
  20.    IF($log > 0)
  21.        LOGSHOW(1, $_xmax-440, 28)            // отображение окна лога  (335)
  22.        WNDSIZE(WNDFIND("Лог", 1), 441, 260)  // изменения размеров окна лога 260/800
  23.    END_IF
  24. END_SUB
  25.  
  26. STRSEPARATE("A:B:C:D:E:F", ":", $arr16) //===  перевод числа в HEX. Выход $HEX =
  27. SUB(toHEX, $DEC)
  28.    $HEX = ""
  29.    WHILE($DEC > 0)
  30.        $cel = INT($DEC/16)
  31.        $ost = $DEC - $cel*16
  32.        IF($ost > 9)
  33.            $ost = $arr16[$ost - 10]
  34.        END_IF
  35.        $HEX = STRCONCAT($ost, $HEX)
  36.        $DEC = $cel
  37.    END_CYC
  38.    //LOGWRITE($HEX)
  39. END_SUB
  40.  
  41. SUB(GREYSCALE, $x1, $y1, $x2, $y2)
  42.    GETSCREEN($x1, $y1, $x2, $y2)
  43.    READMEM($pid, "004E20FC", 4)  // читаем адрес начала буфера в указателе
  44.    $startbufwr = $_return1 + ($y1*($xmax+1)*4) + ($x1*4) // с этой ячейки начнем
  45.    //LOGWRITE($_return1,"  $startbuf = ", $startbufwr)
  46.  
  47.    FOR($y=0, $y < ($y2 - $y1 + 1))
  48.        $adrDECwr = $startbufwr + ($y*($xmax+1)*4)
  49.        FOR($x=0, $x < ($x2 - $x1 + 1))
  50.            $c = PXL($x1+$x, $y1+$y)
  51.            $gray_canal = INT((0.299*COLORR($c)) + (0.587*COLORG($c)) + (0.114*COLORB($c)))
  52.            $gray = COLORGEN($gray_canal, $gray_canal, $gray_canal)
  53.            //LOGWRITE("$gray_canal = ", $gray_canal, "   ", $gray)
  54.            toHEX($adrDECwr + $x)
  55.            WRITEMEM($pid, $HEX, $gray, 4)
  56.  
  57.            $adrDECwr = $adrDECwr + 3
  58.        END_CYC
  59.    END_CYC
  60. END_SUB
  61.  
  62. SUB(SCREENin3, $x1, $y1, $x2, $y2, $x3, $y3)
  63.    GETSCREEN($x1, $y1, $x2, $y2)
  64.    READMEM($pid, "004E20FC", 4)  // читаем адрес начала буфера в указателе
  65.    $startbufwr = $_return1 + ($y3*($xmax+1)*4) + ($x3*4) // с этой ячейки начнем
  66.    //LOGWRITE($_return1,"  $startbuf = ", $startbufwr)
  67.  
  68.    FOR($y=0, $y < ($y2 - $y1 + 1))
  69.        $adrDECwr = $startbufwr + ($y*($xmax+1)*4) //+ ($x*4)
  70.        FOR($x=0, $x < ($x2 - $x1 + 1))
  71.            $c = PXL($x1+$x, $y1+$y)
  72.            $color_new = COLORGEN(COLORB($c), COLORG($c), COLORR($c))
  73.            //LOGWRITE("$color_new = ", $color_new)
  74.            toHEX($adrDECwr + $x)
  75.            WRITEMEM($pid, $HEX, $color_new, 4)
  76.  
  77.            $adrDECwr = $adrDECwr + 3
  78.        END_CYC
  79.    END_CYC
  80. END_SUB
  81.  
  82. SUB(SCREENin2, $x1, $y1, $x2, $y2, $x3, $y3)
  83.    GETSCREEN($x1, $y1, $x2, $y2)
  84.    READMEM($pid, "004E20FC", 4)  // читаем адрес начала буфера в указателе
  85.    $startbufwr = $_return1 + ($y3*($xmax+1)*4) + ($x3*4) // с этой ячейки начнем    
  86.    //LOGWRITE($_return1,"  $startbuf = ", $startbufwr)
  87.  
  88.    FOR($y=0, $y < ($y2 - $y1 + 1))
  89.        $adrdec = $startbufwr + ($y*($xmax+1)*4) //+ ($x*4)
  90.        FOR($x=0, $x < ($x2 - $x1 + 1))
  91.            $c = PXL($x1+$x, $y1+$y)
  92.  
  93.            toHEX($adrdec + $x)
  94.            WRITEMEM($pid, $HEX, COLORB($c), 1)
  95.            toHEX($adrdec + $x + 1)
  96.            WRITEMEM($pid, $HEX, COLORG($c), 1)
  97.            toHEX($adrdec + $x + 2)
  98.            WRITEMEM($pid, $HEX, COLORR($c), 1)
  99.  
  100.            $adrdec = $adrdec + 3
  101.        END_CYC
  102.    END_CYC
  103. END_SUB
  104.  
  105. SUB(SCREENin1, $x1, $y1, $x2, $y2, $x3, $y3)
  106.    GETSCREEN($x1, $y1, $x2, $y2)
  107.    READMEM($pid, "004E20FC", 4)  // читаем адрес начала буфера в указателе
  108.    $startbufwr = $_return1 + ($y3*($xmax+1)*4) + ($x3*4) // с этой ячейки начнем
  109.    //LOGWRITE($_return1,"  $startbuf = ", $startbufwr)
  110.  
  111.    LOGWRITE("Blue")
  112.    FOR($y=0, $y < ($y2 - $y1 + 1))
  113.        FOR($x=0, $x < ($x2 - $x1 + 1))
  114.            $adrdec = $startbufwr + ($y*($xmax+1)*4) + ($x*4)
  115.            toHEX($adrdec)
  116.            WRITEMEM($pid, $HEX, COLORB(PXL($x1+$x, $y1+$y)), 1)
  117.        END_CYC
  118.    END_CYC
  119.    LOGWRITE("Green")
  120.    FOR($y=0, $y < ($y2 - $y1 + 1))
  121.        FOR($x=0, $x < ($x2 - $x1 + 1))
  122.            $adrdec = $startbufwr + ($y*($xmax+1)*4) + ($x*4) + 1
  123.            toHEX($adrdec)
  124.            WRITEMEM($pid, $HEX, COLORG(PXL($x1+$x, $y1+$y)), 1)
  125.        END_CYC
  126.    END_CYC
  127.    LOGWRITE("Red")
  128.    FOR($y=0, $y < ($y2 - $y1 + 1))
  129.        FOR($x=0, $x < ($x2 - $x1 + 1))
  130.            $adrdec = $startbufwr + ($y*($xmax+1)*4) + ($x*4) + 2
  131.            toHEX($adrdec)
  132.            WRITEMEM($pid, $HEX, COLORR(PXL($x1+$x, $y1+$y)), 1)
  133.        END_CYC
  134.    END_CYC
  135.  
  136.    // в этой ячейке  прозрачность, по умолчания записано "255"
  137.    //FOR($y=0, $y < ($y2 - $y1 +1))
  138.    //    FOR($x=0, $x < ($x2 - $x1 +1))
  139.    //        toHEX($startbufwr + ($y*($_xmax+1)*4) + ($x*4) + 3)
  140.    //        WRITEMEM($pid, $HEX, 100, 1)
  141.    //    END_CYC
  142.    //END_CYC
  143. END_SUB
  144.  
  145. SUB(SCREENin4, $x1, $y1, $x2, $y2, $x3, $y3)
  146.    GETSCREEN($x1, $y1, $x2, $y2)
  147.    READMEM($pid, "004E20FC", 4)  // читаем адрес начала буфера в указателе
  148.    $startbufwr = $_return1 + ($y3*($xmax+1)*4) + ($x3*4) // с этой ячейки начнем
  149.    $startbufrd = $_return1 + ($y1*($xmax+1)*4) + ($x1*4)
  150.    //LOGWRITE($_return1,"  $startbuf = ", $startbufwr)
  151.  
  152.    FOR($y=0, $y < ($y2 - $y1 + 1))
  153.        $adrDECrd = $startbufrd + ($y*($xmax+1)*4)
  154.        $adrDECwr = $startbufwr + ($y*($xmax+1)*4)
  155.        FOR($x=0, $x < ($x2 - $x1 + 1))
  156.            toHEX($adrDECrd + $x)
  157.            READMEM($pid, $HEX, 4)
  158.            $color = $_return1
  159.  
  160.            toHEX($adrDECwr + $x)
  161.            WRITEMEM($pid, $HEX, $color, 4)
  162.  
  163.            $adrDECrd = $adrDECrd + 3
  164.            $adrDECwr = $adrDECwr + 3
  165.        END_CYC
  166.    END_CYC
  167. END_SUB
  168.  
  169. SUB(test1, $x1, $y1, $x2, $y2, $x3, $y3) //===  для тестов  ====================
  170.    GETSCREEN($x1, $y1, $x2, $y2)
  171.    READMEM($pid, "004E20FC", 4)  //читаем адрес начала буфера в указателе
  172.    $startbufrd = $_return1 + ($y1*($xmax+1)*4) + ($x1*4) // с этой ячейки начнем
  173.    toHEX($startbufrd)
  174.  
  175.    LOGWRITE(COLORB(pxl($x1+0, $y1+0)))
  176.    READMEM($pid, $HEX, 1)
  177.    LOGWRITE($_return1)
  178.    $timer1 = $_ms
  179.    FOR($nn=0, $nn < 10000)
  180.        READMEM($pid, $HEX, 1)
  181.        $t = $_return1
  182.    END_CYC
  183.    print_timeaction("screen_test", $_ms - $timer1)
  184.    HALT
  185. END_SUB
  186.  
  187. SUB(test2, $x1, $y1)
  188.    GETSCREEN($x1-1, $y1-1, $x1+1, $y1+1)
  189.    //SCREENSHOTEX($x1-1, $y1-1, $x1+1, $y1+1, "Color_", 0)
  190.    READMEM($pid, "004E20FC", 4)  //читаем адрес начала буфера в указателе
  191.    $startbufrd = $_return1 + ($y1*($xmax+1)*4) + ($x1*4)
  192.    $adrdec = $startbufrd
  193.    toHEX($adrdec)
  194.  
  195.    $c = PXL($x1, $y1)
  196.    LOGWRITE($c, "  RGB  ", COLORR($c), " ", COLORG($c), " ", COLORB($c))
  197.    READMEM($pid, $HEX, 4)
  198.    $read = $_return1
  199.  
  200.    toHEX($adrdec)
  201.    READMEM($pid, $HEX, 1)
  202.    $b = $_return1
  203.  
  204.    toHEX($adrdec + 1)
  205.    READMEM($pid, $HEX, 1)
  206.    $g = $_return1
  207.  
  208.    toHEX($adrdec + 2)
  209.    READMEM($pid, $HEX, 1)
  210.    $r = $_return1
  211.  
  212.    toHEX($adrdec + 3)
  213.    READMEM($pid, $HEX, 1)
  214.    $a = $_return1
  215.  
  216.    // 16777215  16711936   2147483648
  217.    LOGWRITE($read, " 2RGB  ", $r, " ", $g, " ", $b, " ", $a) //
  218.    LOGWRITE("  RGB  ", COLORR($read), " ", COLORG($read), " ", COLORB($read))
  219.    HALT
  220. END_SUB
  221.  
  222.  
  223. // =============================================================================
  224. //##############################################################################
  225.  
  226.  
  227.  
  228. WAITMS(300)
  229. LOGCLEAR
  230. log_show()
  231.  
  232. $xmax = $_xmax
  233. $ymax = $_ymax
  234.  
  235. //test1(70, 75, 79, 84, 5, 40)
  236. //test2(194, 347)
  237. //test2(222, 552)
  238.  
  239.  
  240. GETSCREEN
  241. $timer1 = $_ms
  242.  
  243. // SCREENin  OLD  Original
  244. // поканально, старое вычисление HEX   = 17.70 ms/pxl
  245. // 30х30         ~16000 мс               17.77 ms/pxl
  246. // 10х10          ~1770 мс               17.70 ms/pxl
  247.  
  248.  
  249. // SCREENin1  OLD
  250. // поканально, новое вычисление HEX    = 14.70 ms/pxl    -17%
  251. // 30х30         ~13500 мс, ~13300 мс    14.77 ms/pxl
  252. //SCREENin1(70, 75, 99, 104, 5, 40)
  253. // 10х10         ~1515 мс,  ~1470 мс     14.70 ms/pxl
  254. //SCREENin1(70, 75, 79, 84, 5, 40)
  255.  
  256.  
  257. // SCREENin2
  258. // один PXL, часть адреса на строку    = 13.70 ms/pxl    -6.8%
  259. // 30х30         ~12508 мс, ~12345 мс    13.72 ms/pxl
  260. //SCREENin2(70, 75, 99, 104, 5, 40)
  261. // 10х10         ~1370 мс,  ~1354 мс     13.70 ms/pxl
  262. //SCREENin2(70, 75, 79, 84, 5, 40)
  263.  
  264.  
  265. // SCREENin3
  266. // попиксельно, Пишем по 4 байта       =  5.14 ms/pxl    -62.5% !!!
  267. // 30х30         ~4648 мс, ~4620 мс       5.14 ms/pxl
  268. //SCREENin3(70, 75, 99, 104, 5, 40)
  269. // 10х10         ~524 мс,  ~518 мс        5.18 ms/pxl
  270. //SCREENin3(70, 75, 79, 84, 5, 40)
  271.  
  272.  
  273. // SCREENin4  BAD по 2 расчёта HEX адреса
  274. // прямое копирование по 4 байта       =  9.48 ms/pxl    +84%  :((
  275. // 30х30         ~8535 мс                 9.48 ms/pxl
  276. //SCREENin4(70, 75, 99, 104, 5, 40)
  277. // 10х10         ~521 мс,  ~506 мс        5.06 ms/pxl
  278. //SCREENin3(70, 75, 79, 84, 5, 40)
  279.  
  280.  
  281.  
  282. // GREYSCALE                           =  5.25 ms/pxl
  283. // 10х10         ~555 мс,  ~552 мс        5.52 ms/pxl
  284. //GREYSCALE(70, 75, 79, 84)
  285. // 20х20   400 pxl  ~2167 мс              5.42 ms/pxl
  286. //GREYSCALE(772, 432, 791, 451)
  287. // 100х100  10000 pxl  ~53956 мс, 52431   5.25 ms/pxl
  288. //GREYSCALE(750, 426, 849, 525)
  289.  
  290. // PXLREPLACE  100х100   10000 pxl
  291. // 8100 ms                                0.81 ms/pxl
  292.  
  293. // 100х100  10000 pxl  ~1400 мс, 1270     0.127 ms/pxl
  294. // CME_GREYSCALE() AutiIt
  295.  
  296.  
  297.  
  298. print_timeaction("screen_", $_ms - $timer1)
  299. SCREENSHOTEX(0,0, 150,150, "Copy_", 0)
  300. //SCREENSHOTEX(700,400, 900,550, "Gray_", 0)
  301.  
  302. HALT
  303.  
« Последнее редактирование: Август 15, 2017, 04:41:04 pm от Vint »