Author Topic: взять часть буфера и поместить в указанное место в указный файл  (Read 8511 times)

0 Members and 2 Guests are viewing this topic.

Narindo

  • Зашел в гости
  • *
  • Posts: 3
    • View Profile
в кликере есть функция, которая берет часть графического буфера и сохраняет в файл:

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

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

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

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

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

quant13

  • Активный участник
  • ***
  • Posts: 174
    • View Profile

Narindo

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

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Ты что то попутал кликер с фотошопом  :o

Vint

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

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


dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
а я вот попробовал ради интереса  ;D, и получилось  8). только вот скорость подводит  :(
не совсем то что требовалось - размер скрина ограничен размерами экрана.
Code: (clickermann) [Select]
#name "screen"
$pid = 15436 //неазбываем вписывать PID кликера после каждого запуска кликера

SUB(adres,$int0)//перевод из десятичного в 16-ричное
   $str16 = ""
   FOR($a=0, $a < 8)     
      $int = int($int0/16)
      $val16 = $int0-($int*16)
      IF($val16 > 9)
         SWITCH($val16)
         CASE(10)
            $val16 = "A"
         CASE(11)
            $val16 = "B"
         CASE(12)
            $val16 = "C"
         CASE(13)
            $val16 = "D"
         CASE(14)
            $val16 = "E"
         CASE(15)
            $val16 = "F"
         DEFAULT
         END_SWITCH
      END_IF
      $str16 = STRCONCAT ($val16,$str16)     
      $int0 = $int
   END_CYC
   // print($str16)
END_SUB

SUB(SCREENin, $x1, $y1, $x2, $y2, $x3, $y3)
   GETSCREEN($x1, $y1, $x2, $y2)
   READMEM ($pid, "004E20FC", 4)  //читаем адрес начала буфера в указателе
   $startbuf = $_return1+($y3*($_xmax+1)*4)+($x3*4) //с этой ячейки и начнем
         
   print("Blue")
   FOR($y=0,$y<($y2-$y1))
      FOR($x=0,$x<($x2-$x1))         
         adres($startbuf+($y*($_xmax+1)*4)+($x*4))         
         WRITEMEM ($pid, $str16, COLORB(pxl($x1+$x,$y1+$y)), 1)
      END_CYC     
   END_CYC
   print("Green")
   FOR($y=0,$y<($y2-$y1))
      FOR($x=0,$x<($x2-$x1))         
         adres($startbuf+($y*($_xmax+1)*4)+($x*4)+1)       
         WRITEMEM ($pid, $str16, COLORG(pxl($x1+$x,$y1+$y)), 1)
      END_CYC
   END_CYC
   print("Red")
   FOR($y=0,$y<($y2-$y1))
      FOR($x=0,$x<($x2-$x1))
         adres($startbuf+($y*($_xmax+1)*4)+($x*4)+2)
         WRITEMEM ($pid, $str16, COLORR(pxl($x1+$x,$y1+$y)), 1)
      END_CYC
   END_CYC
   print("End")
//   FOR($y=0,$y<($y2-$y1)) //в этой ячейке вероятнее всего, как мне казалось, записана прозрачность, там поумолчания записано "255"
//      FOR($x=0,$x<($x2-$x1)) //но при изменении этого значения ничего не меняется
//         adres($startbuf+($y*($_xmax+1)*4)+($x*4)+3)
//         WRITEMEM ($pid, $str16, 100, 1)
//      END_CYC
//   END_CYC
   
END_SUB
//--------------------------------------------------------


GETSCREEN
SCREENin(70,75,100,105,5,40)
SCREENSHOTEX(0,0, 150,150, "Image_", 0)

halt

вот что вышло

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



на счет пару десятков мс это я канечно загнул  :D, но в секунду я думаю можно вложиться.
« Last Edit: September 21, 2015, 10:37:26 PM by dramster »

Vint

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


Narindo

  • Зашел в гости
  • *
  • Posts: 3
    • View Profile
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

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

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

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

[spoiler]
Code: [Select]
#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]
Code: [Select]
#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]
« Last Edit: September 25, 2015, 12:15:24 PM by Vint »


dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
я кстати на записи скрина в буфер тогда не остановился. и попробовал писать нужное в файл. остановился на "всовывании" нужной картинки в нужное место в файле. там немного сложновато определить куда писать, так как в бмп файле пиксели записываются в зеркальном виде начиная с нижнего левого угла. но это реализуемо. будет время и желание, продолжу.
вот мои наработки. покачто скрипт создает просто файл изображения. но создав олгаритм определения нужного места в строке, которое соответствует нужным координатам нашего вписываемого изображения, можно дописывать в файл то что надо. плюс к этому нужно дописывать пустое место пустыми пикселями.
Code: (clickermann) [Select]
#name "screen"

SUB(hex,$int0,$typ) //из десятичного в 16-ричное
   $str16 = ""
   FOR($a=0, $a < $typ)
      $int = int($int0/16)
      $val16 = $int0-($int*16)
      IF($val16 > 9)
         SWITCH($val16)
         CASE(10)
            $val16 = "A"
         CASE(11)
            $val16 = "B"
         CASE(12)
            $val16 = "C"
         CASE(13)
            $val16 = "D"
         CASE(14)
            $val16 = "E"
         CASE(15)
            $val16 = "F"
         DEFAULT
         END_SWITCH
      END_IF
      $str16 = STRCONCAT ($val16,$str16)
      $int0 = $int
   END_CYC
   // print($str16)
END_SUB

SUB(val10,$val16 ) // из 16 в 10-ное
   SWITCH($val16)
   CASE("A")
      $val10 = 10
   CASE("B"
      $val10 = 11
   CASE("C")
      $val10 = 12
   CASE("D")
      $val10 = 13
   CASE("E")
      $val10 = 14
   CASE("F")
      $val10 = 15
   DEFAULT
      $val10 = $val16
   END_SWITCH
END_SUB




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

SUB(screenin,$x1,$y1,$x2,$y2,$x3,$y3)
   
   $xmax = $x2-$x1 +1  //определяем размер
   $ymax = $y2-$y1 +1
   hex($xmax,3)
   
   $xmax16 = $str16
   hex($ymax,3)
   $ymax16 = $str16
   TFWrite("input.bmp",StrConcat("424D1A02000000000000360000002800000",$xmax16, "00000",$ymax16,"0000000100200000000000E401000000000000000000000000000000000000"))//и вписываем размер в "заголовок" файла
   
   GETSCREEN ($x1,$y1,$x2,$y2)
   FOR($y=0,$y<$ymax)//делаем скрин и записываем 16-ричный код в файл
      $str = ""
      FOR($x=$xmax-1,$x>(-1),-1)
         hex(colorb(pxl($x2-$x,$y2-$y)),2)
         $b16 = $str16
         hex(colorg(pxl($x2-$x,$y2-$y)),2)
         $g16 = $str16
         hex(colorr(pxl($x2-$x,$y2-$y)),2)
         $r16 = $str16
         $str = StrConcat($str,$b16,$g16,$r16,"00")       
      END_CYC
     
      inc($n)
      print($n)
      TFWrite("input.bmp",$str)
   END_CYC

   print("end")
   
END_SUB
print("start")
screenin(20,20,50,50,0,0)

halt

//$xmax01 = (strcut2(TFREAD ("input.bmp",1),37,37 )) //это для дальнейшей работы, определение размера начальной картинки
//$xmax02 = (strcut2(TFREAD ("input.bmp",1),38,38 ))
//$ymax01 = (strcut2(TFREAD ("input.bmp",1),45,45 ))
//$ymax02 = (strcut2(TFREAD ("input.bmp",1),46,46 ))

//val10($xmax01)
//$val1 = $val10
//val10($xmax02)
//$val2 = $val10
//$xmax0 =  int($val1)*16 + int($val2)
//val10($ymax01)
//$val1 = $val10
//val10($ymax02)
//$val2 = $val10
//$ymax0 =  int($val1)*16 + int($val2)

//print($xmax0,"x",$ymax0 )

//halt

в этоге мы получаем файл в 16-ричном виде,
Code: [Select]
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, так как в заголовке чтото непонятное нужно дописывать в изображениях с большим размером.
« Last Edit: September 25, 2015, 06:03:02 PM by dramster »

Луций

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

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
вот что вышло

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


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

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

На твоём примере отсюда у меня показало такое время:
Code: [Select]
// 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%
Code: [Select]
// 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 раза реже. И выделив вычисление части адреса отдельно получил такой результат:
Code: [Select]
// 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.
Правда пока додумался что там нужно каналы местами поменять кучу опытов провёл.
Code: [Select]
// 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 раза больше.
Code: [Select]
// 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. Ах, да, код вот
Code: (clickermann) [Select]
#name "screen_1.1.6"
// Author: dramster, Vint
// Version: 1.1.6 (10.08.2017)
// Скрипт для Clickermann v4.11 003
#include "..\..\Libs\logger.cms"

//                              Настройки
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

//не забываем вписывать PID кликера после каждого запуска кликера
$pid = 2052

// показывать окно лога. Глубина 0, 1, 2
$log = 1

//##############################################################################

// ====== Подпрограммы =========================================================
SUB(log_show) //===  показ лога  ===============================================
    IF($log > 0)
        LOGSHOW(1, $_xmax-440, 28)            // отображение окна лога  (335)
        WNDSIZE(WNDFIND("Лог", 1), 441, 260)  // изменения размеров окна лога 260/800
    END_IF
END_SUB

STRSEPARATE("A:B:C:D:E:F", ":", $arr16) //===  перевод числа в HEX. Выход $HEX =
SUB(toHEX, $DEC)
    $HEX = ""
    WHILE($DEC > 0)
        $cel = INT($DEC/16)
        $ost = $DEC - $cel*16
        IF($ost > 9)
            $ost = $arr16[$ost - 10]
        END_IF
        $HEX = STRCONCAT($ost, $HEX)
        $DEC = $cel
    END_CYC
    //LOGWRITE($HEX)
END_SUB

SUB(GREYSCALE, $x1, $y1, $x2, $y2)
    GETSCREEN($x1, $y1, $x2, $y2)
    READMEM($pid, "004E20FC", 4)  // читаем адрес начала буфера в указателе
    $startbufwr = $_return1 + ($y1*($xmax+1)*4) + ($x1*4) // с этой ячейки начнем
    //LOGWRITE($_return1,"  $startbuf = ", $startbufwr)
   
    FOR($y=0, $y < ($y2 - $y1 + 1))
        $adrDECwr = $startbufwr + ($y*($xmax+1)*4)
        FOR($x=0, $x < ($x2 - $x1 + 1))
            $c = PXL($x1+$x, $y1+$y)
            $gray_canal = INT((0.299*COLORR($c)) + (0.587*COLORG($c)) + (0.114*COLORB($c)))
            $gray = COLORGEN($gray_canal, $gray_canal, $gray_canal)
            //LOGWRITE("$gray_canal = ", $gray_canal, "   ", $gray)
            toHEX($adrDECwr + $x)
            WRITEMEM($pid, $HEX, $gray, 4)
           
            $adrDECwr = $adrDECwr + 3
        END_CYC
    END_CYC
END_SUB

SUB(SCREENin3, $x1, $y1, $x2, $y2, $x3, $y3)
    GETSCREEN($x1, $y1, $x2, $y2)
    READMEM($pid, "004E20FC", 4)  // читаем адрес начала буфера в указателе
    $startbufwr = $_return1 + ($y3*($xmax+1)*4) + ($x3*4) // с этой ячейки начнем
    //LOGWRITE($_return1,"  $startbuf = ", $startbufwr)
   
    FOR($y=0, $y < ($y2 - $y1 + 1))
        $adrDECwr = $startbufwr + ($y*($xmax+1)*4) //+ ($x*4)
        FOR($x=0, $x < ($x2 - $x1 + 1))
            $c = PXL($x1+$x, $y1+$y)
            $color_new = COLORGEN(COLORB($c), COLORG($c), COLORR($c))
            //LOGWRITE("$color_new = ", $color_new)
            toHEX($adrDECwr + $x)
            WRITEMEM($pid, $HEX, $color_new, 4)
           
            $adrDECwr = $adrDECwr + 3
        END_CYC
    END_CYC
END_SUB

SUB(SCREENin2, $x1, $y1, $x2, $y2, $x3, $y3)
    GETSCREEN($x1, $y1, $x2, $y2)
    READMEM($pid, "004E20FC", 4)  // читаем адрес начала буфера в указателе
    $startbufwr = $_return1 + ($y3*($xmax+1)*4) + ($x3*4) // с этой ячейки начнем   
    //LOGWRITE($_return1,"  $startbuf = ", $startbufwr)
   
    FOR($y=0, $y < ($y2 - $y1 + 1))
        $adrdec = $startbufwr + ($y*($xmax+1)*4) //+ ($x*4)
        FOR($x=0, $x < ($x2 - $x1 + 1))
            $c = PXL($x1+$x, $y1+$y)
           
            toHEX($adrdec + $x)
            WRITEMEM($pid, $HEX, COLORB($c), 1)
            toHEX($adrdec + $x + 1)
            WRITEMEM($pid, $HEX, COLORG($c), 1)
            toHEX($adrdec + $x + 2)
            WRITEMEM($pid, $HEX, COLORR($c), 1)
           
            $adrdec = $adrdec + 3
        END_CYC
    END_CYC
END_SUB

SUB(SCREENin1, $x1, $y1, $x2, $y2, $x3, $y3)
    GETSCREEN($x1, $y1, $x2, $y2)
    READMEM($pid, "004E20FC", 4)  // читаем адрес начала буфера в указателе
    $startbufwr = $_return1 + ($y3*($xmax+1)*4) + ($x3*4) // с этой ячейки начнем
    //LOGWRITE($_return1,"  $startbuf = ", $startbufwr)
   
    LOGWRITE("Blue")
    FOR($y=0, $y < ($y2 - $y1 + 1))
        FOR($x=0, $x < ($x2 - $x1 + 1))
            $adrdec = $startbufwr + ($y*($xmax+1)*4) + ($x*4)
            toHEX($adrdec)
            WRITEMEM($pid, $HEX, COLORB(PXL($x1+$x, $y1+$y)), 1)
        END_CYC
    END_CYC
    LOGWRITE("Green")
    FOR($y=0, $y < ($y2 - $y1 + 1))
        FOR($x=0, $x < ($x2 - $x1 + 1))
            $adrdec = $startbufwr + ($y*($xmax+1)*4) + ($x*4) + 1
            toHEX($adrdec)
            WRITEMEM($pid, $HEX, COLORG(PXL($x1+$x, $y1+$y)), 1)
        END_CYC
    END_CYC
    LOGWRITE("Red")
    FOR($y=0, $y < ($y2 - $y1 + 1))
        FOR($x=0, $x < ($x2 - $x1 + 1))
            $adrdec = $startbufwr + ($y*($xmax+1)*4) + ($x*4) + 2
            toHEX($adrdec)
            WRITEMEM($pid, $HEX, COLORR(PXL($x1+$x, $y1+$y)), 1)
        END_CYC
    END_CYC
   
    // в этой ячейке  прозрачность, по умолчания записано "255"
    //FOR($y=0, $y < ($y2 - $y1 +1))
    //    FOR($x=0, $x < ($x2 - $x1 +1))
    //        toHEX($startbufwr + ($y*($_xmax+1)*4) + ($x*4) + 3)
    //        WRITEMEM($pid, $HEX, 100, 1)
    //    END_CYC
    //END_CYC
END_SUB

SUB(SCREENin4, $x1, $y1, $x2, $y2, $x3, $y3)
    GETSCREEN($x1, $y1, $x2, $y2)
    READMEM($pid, "004E20FC", 4)  // читаем адрес начала буфера в указателе
    $startbufwr = $_return1 + ($y3*($xmax+1)*4) + ($x3*4) // с этой ячейки начнем
    $startbufrd = $_return1 + ($y1*($xmax+1)*4) + ($x1*4)
    //LOGWRITE($_return1,"  $startbuf = ", $startbufwr)
   
    FOR($y=0, $y < ($y2 - $y1 + 1))
        $adrDECrd = $startbufrd + ($y*($xmax+1)*4)
        $adrDECwr = $startbufwr + ($y*($xmax+1)*4)
        FOR($x=0, $x < ($x2 - $x1 + 1))
            toHEX($adrDECrd + $x)
            READMEM($pid, $HEX, 4)
            $color = $_return1
           
            toHEX($adrDECwr + $x)
            WRITEMEM($pid, $HEX, $color, 4)
           
            $adrDECrd = $adrDECrd + 3
            $adrDECwr = $adrDECwr + 3
        END_CYC
    END_CYC
END_SUB

SUB(test1, $x1, $y1, $x2, $y2, $x3, $y3) //===  для тестов  ====================
    GETSCREEN($x1, $y1, $x2, $y2)
    READMEM($pid, "004E20FC", 4)  //читаем адрес начала буфера в указателе
    $startbufrd = $_return1 + ($y1*($xmax+1)*4) + ($x1*4) // с этой ячейки начнем
    toHEX($startbufrd)
   
    LOGWRITE(COLORB(pxl($x1+0, $y1+0)))
    READMEM($pid, $HEX, 1)
    LOGWRITE($_return1)
    $timer1 = $_ms
    FOR($nn=0, $nn < 10000)
        READMEM($pid, $HEX, 1)
        $t = $_return1
    END_CYC
    print_timeaction("screen_test", $_ms - $timer1)
    HALT
END_SUB

SUB(test2, $x1, $y1)
    GETSCREEN($x1-1, $y1-1, $x1+1, $y1+1)
    //SCREENSHOTEX($x1-1, $y1-1, $x1+1, $y1+1, "Color_", 0)
    READMEM($pid, "004E20FC", 4)  //читаем адрес начала буфера в указателе
    $startbufrd = $_return1 + ($y1*($xmax+1)*4) + ($x1*4)
    $adrdec = $startbufrd
    toHEX($adrdec)
   
    $c = PXL($x1, $y1)
    LOGWRITE($c, "  RGB  ", COLORR($c), " ", COLORG($c), " ", COLORB($c))
    READMEM($pid, $HEX, 4)
    $read = $_return1
   
    toHEX($adrdec)
    READMEM($pid, $HEX, 1)
    $b = $_return1
   
    toHEX($adrdec + 1)
    READMEM($pid, $HEX, 1)
    $g = $_return1
   
    toHEX($adrdec + 2)
    READMEM($pid, $HEX, 1)
    $r = $_return1
   
    toHEX($adrdec + 3)
    READMEM($pid, $HEX, 1)
    $a = $_return1
   
    // 16777215  16711936   2147483648
    LOGWRITE($read, " 2RGB  ", $r, " ", $g, " ", $b, " ", $a) //
    LOGWRITE("  RGB  ", COLORR($read), " ", COLORG($read), " ", COLORB($read))
    HALT
END_SUB


// =============================================================================
//##############################################################################



WAITMS(300)
LOGCLEAR
log_show()

$xmax = $_xmax
$ymax = $_ymax

//test1(70, 75, 79, 84, 5, 40)
//test2(194, 347)
//test2(222, 552)


GETSCREEN
$timer1 = $_ms

// SCREENin  OLD  Original
// поканально, старое вычисление HEX   = 17.70 ms/pxl
// 30х30         ~16000 мс               17.77 ms/pxl
// 10х10          ~1770 мс               17.70 ms/pxl


// 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)


// 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)


// 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)


// 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)



// GREYSCALE                           =  5.25 ms/pxl
// 10х10         ~555 мс,  ~552 мс        5.52 ms/pxl
//GREYSCALE(70, 75, 79, 84)
// 20х20   400 pxl  ~2167 мс              5.42 ms/pxl
//GREYSCALE(772, 432, 791, 451)
// 100х100  10000 pxl  ~53956 мс, 52431   5.25 ms/pxl
//GREYSCALE(750, 426, 849, 525)

// PXLREPLACE  100х100   10000 pxl
// 8100 ms                                0.81 ms/pxl

// 100х100  10000 pxl  ~1400 мс, 1270     0.127 ms/pxl
// CME_GREYSCALE() AutiIt



print_timeaction("screen_", $_ms - $timer1)
SCREENSHOTEX(0,0, 150,150, "Copy_", 0)
//SCREENSHOTEX(700,400, 900,550, "Gray_", 0)

HALT
« Last Edit: August 15, 2017, 04:41:04 PM by Vint »