Jump to content
Sign in to follow this  
wakillon

ImageSplitter v1.0.0.7 Update of 26 March 2014 (Multi Images Split allowed)

Recommended Posts

wakillon

ImageSplitter v1.0.0.7

20140326182230.jpg

 

ImageSplitter split an image into pieces that can be used

- for collage art.

- for website optimisation (speed up the preview of images)

- for printing purposes (big poster)

- for create a puzzle.

 

Load an image by menu or by drag&drop (jpg, gif, png and bmp are supported)

Choose a format and select Columns and Rows numbers you want.

Once Split Image processing is finished a folder with all splitted image parts will be opened.

Parts of image are from left to right and from top to bottom.

Button was made online with chimply.com the easy and free buttons generator !

ChangeLog version 1.0.0.7 :

DPI Resolution can be preserved as original or changed.

Multi files Split is now possible ( Only by Menu - Open - Multi files Split)

previous downloads : 189

ImageSplitter v1.0.0.7.au3 is available in the Download Section

 

Hope you like it !  ;)

Edited by wakillon
  • Like 4

AutoIt 3.3.14.2 X86 - SciTE 3.6.0WIN 8.1 X64 - Other Example Scripts

Share this post


Link to post
Share on other sites
UEZ

Might be a good idea to name the files like <filename>_yyxx.jpg whereas yy is the row and xx the column because it it easier to assemble later the image together.

Br,

UEZ


Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites
wakillon

Might be a good idea to name the files like <filename>_yyxx.jpg whereas yy is the row and xx the column because it it easier to assemble later the image together.

Br,

UEZ

Hi UEZ !

Did you see the name of the directories created for stored the splitted images ?  :)


AutoIt 3.3.14.2 X86 - SciTE 3.6.0WIN 8.1 X64 - Other Example Scripts

Share this post


Link to post
Share on other sites
UEZ

Yes, but it would be much easier to parse the file names only:

from (4x4)

C:\Tmp\SplittedImages\100_dollar_bill-JPG-Row4-Col4-00
100_dollar_bill_0001.jpg
100_dollar_bill_0002.jpg
100_dollar_bill_0003.jpg
100_dollar_bill_0004.jpg
100_dollar_bill_0005.jpg
100_dollar_bill_0006.jpg
100_dollar_bill_0007.jpg
100_dollar_bill_0008.jpg
100_dollar_bill_0009.jpg
100_dollar_bill_0010.jpg
100_dollar_bill_0011.jpg
100_dollar_bill_0012.jpg
100_dollar_bill_0013.jpg
100_dollar_bill_0014.jpg
100_dollar_bill_0015.jpg
100_dollar_bill_0016.jpg

to (4x4):

100_dollar_bill_0000.jpg
100_dollar_bill_0001.jpg
100_dollar_bill_0002.jpg
100_dollar_bill_0003.jpg
100_dollar_bill_0100.jpg
100_dollar_bill_0101.jpg
100_dollar_bill_0102.jpg
100_dollar_bill_0103.jpg
100_dollar_bill_0200.jpg
100_dollar_bill_0201.jpg
100_dollar_bill_0202.jpg
100_dollar_bill_0203.jpg
100_dollar_bill_0300.jpg
100_dollar_bill_0301.jpg
100_dollar_bill_0302.jpg
100_dollar_bill_0303.jpg

but you decide. ;)

Br,

UEZ

Edited by UEZ

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites
wakillon

Hum...do you mean like coordinates ? 

edit : for easily re place them ?

Edited by wakillon

AutoIt 3.3.14.2 X86 - SciTE 3.6.0WIN 8.1 X64 - Other Example Scripts

Share this post


Link to post
Share on other sites
UEZ

Yes, like a 2d array.

You can do something like

For y = 0 to YY
      For x = 0 to XX
        Copy image to main gfx handle at position x, y, w/XX, h/YY
     Next
Next

more easily.

Br,

UEZ

Edited by UEZ
  • Like 1

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites
wakillon

Ok, i will add this feature.

In fact i have done a Gui - Puzzle where you can drag&drop from external to gui controls and from controls to controls !

So, i did not want to give them a name too "easy" for replace them !  :D

But i will find another way for this puzzle game to be a bit hard to do !  ;)

Thanks.


AutoIt 3.3.14.2 X86 - SciTE 3.6.0WIN 8.1 X64 - Other Example Scripts

Share this post


Link to post
Share on other sites
Danyfirex

Really Usefull I think UEZ's idea is good.  really Fast 551 parts  about 10 seconds. Thanks nice share.

Saludos

Share this post


Link to post
Share on other sites
wakillon

Really Usefull I think UEZ's idea is good.  really Fast 551 parts  about 10 seconds. Thanks nice share.

Saludos

 

Yes fast but a bit gourmand in cpu.

Thanks for your feedback ! 

  • Like 1

AutoIt 3.3.14.2 X86 - SciTE 3.6.0WIN 8.1 X64 - Other Example Scripts

Share this post


Link to post
Share on other sites
wakillon

Updated

As suggested by UEZ, coordinates are in images name ( ex gromit-X002-Y006.jpg ) 

and corrected a bug when entering a number starting by 1.

:)


AutoIt 3.3.14.2 X86 - SciTE 3.6.0WIN 8.1 X64 - Other Example Scripts

Share this post


Link to post
Share on other sites
wakillon

Great Idea, and script, thanks for sharing.

I have a suggestion if I may.

Ability to remove/replace sections one by one, and create new image from that.

 

Hum...can you precise your idea ? 

Are you talking about a kind of puzzle bkground ?  :huh2:


AutoIt 3.3.14.2 X86 - SciTE 3.6.0WIN 8.1 X64 - Other Example Scripts

Share this post


Link to post
Share on other sites
JohnOne

There used to be a TV game show in UK, part of it was to guess the person in a picture.

The picture started off with one segment, and one was added each time, the contender chose the square to be added.

Something like that.


AutoIt Absolute Beginners    Require a serial    Pause Script    Video Tutorials by Morthawt   ipify 

Monkey's are, like, natures humans.

Share this post


Link to post
Share on other sites
wakillon

There used to be a TV game show in UK, part of it was to guess the person in a picture.

The picture started off with one segment, and one was added each time, the contender chose the square to be added.

Something like that.

 

Something like that ?

#Region    ;************ Includes ************
#Include <File.au3>
#include <WindowsConstants.au3>
#Include <GUIConstantsEx.au3>
#Include <GDIPlus.au3>
#EndRegion ;************ Includes ************

HotKeySet ( '{ESC}', '_Exit' )
Opt ( 'GUIOnEventMode', 1 )
Opt ( 'MustDeclareVars', 1 )
_GDIPlus_Startup ()

Global $iPicNumber = 10^2
Global $sPicturePath = @TempDir & '\person2.jpg'
Global $iPicCtrlWidth = 60, $iPicCtrlHeight = 60
Global $hGui, $iMargin = 0, $aSplit
Global $sCurrentPicPath, $iPicCtrlExStyle = $WS_EX_STATICEDGE
Global $idPicCtrl[$iPicNumber], $aPicPath[$iPicNumber] ; used for save pic paths set to Pic

If Not FileExists ( $sPicturePath ) Then _Person2Jpg ( "person2.jpg", @TempDir )
$aSplit = _ImageSplitter ( $sPicturePath, Sqrt ( $iPicNumber ), Sqrt ( $iPicNumber ), 'jpg' )
_Gui ()

While 1
    Sleep ( 50 )
WEnd

Func _Base64Decode ( $input_string ) ; by trancexx
    Local $struct = DllStructCreate ( 'int' )
    Local $a_Call = DllCall ( 'Crypt32.dll', 'int', 'CryptStringToBinary', 'str', $input_string, 'int', 0, 'int', 1, 'ptr', 0, 'ptr', DllStructGetPtr ( $struct, 1 ), 'ptr', 0, 'ptr', 0 )
    If @error Or Not $a_Call[0] Then Return SetError ( 1, 0, '' )
    Local $a = DllStructCreate ( 'byte[' & DllStructGetData ( $struct, 1) & ']' )
    $a_Call = DllCall ( 'Crypt32.dll', 'int', 'CryptStringToBinary', 'str', $input_string, 'int', 0, 'int', 1, 'ptr', DllStructGetPtr ( $a ), 'ptr', DllStructGetPtr ( $struct, 1 ), 'ptr', 0, 'ptr', 0 )
    If @error Or Not $a_Call[0] Then Return SetError ( 2, 0, '' )
    Return DllStructGetData ( $a, 1 )
EndFunc ;==> _Base64Decode ()

Func _Exit ()
    _GDIPlus_Shutdown ()
    Exit
EndFunc ;==> _Exit ()

Func _FileGetNameWithoutExtByFullPath ( $sFullPath )
    Local $aPathSplit = StringSplit ( $sFullPath, '\' )
    If Not @error Then Return StringLeft ( $aPathSplit[UBound($aPathSplit)-1], _
        StringInStr ( $aPathSplit[UBound($aPathSplit)-1], '.', 0, -1 ) - 1 )
EndFunc ;==> _FileGetNameWithoutExtByFullPath ()

Func _GdipSetInterpolationMode ( $hGraphics, $iInterpolationMode ) ; for compatibility with AutoIt 3.3.8.1
    Local $aResult = DllCall ( $ghGDIPDll, 'int', 'GdipSetInterpolationMode', 'handle', $hGraphics, 'int', $iInterpolationMode )
    If @error Then Return SetError ( @error, @extended, False )
    If $aResult[0] Then Return SetError ( 10, $aResult[0], False )
    Return True
EndFunc ;==> _GdipSetInterpolationMode ()

Func _Gui ()
    Local $iGuiWidth = Sqrt ( $iPicNumber ) *( $iPicCtrlWidth + $iMargin ) + $iMargin
    Local $iGuiHeight = Sqrt ( $iPicNumber ) *( $iPicCtrlHeight + $iMargin ) + $iMargin
    $hGui = GUICreate ( 'Guess the person in the picture', $iGuiWidth, $iGuiHeight, -1, -1, -1, $WS_EX_ACCEPTFILES + $WS_EX_TOPMOST )
    GUISetOnEvent ( $GUI_EVENT_CLOSE, '_GuiEvents', $hGui )
    GUISetOnEvent ( $GUI_EVENT_PRIMARYDOWN, '_GuiEvents', $hGui )
    Local $x = 0, $y = 0
    Local $aList = _FileListToArray ( $aSplit[3], '*.jpg', 1 ) ; based 1
    For $i = 0 To UBound ( $idPicCtrl ) -1
        $idPicCtrl[$i] = GUICtrlCreatePic ( '', $iMargin+$x, $iMargin+$y, $iPicCtrlWidth, $iPicCtrlHeight, -1, $iPicCtrlExStyle )
        $aPicPath[$i] = $aSplit[3] & '\' & $aList[$i+1]
        $x += $iPicCtrlWidth + $iMargin
        If $x + $iPicCtrlWidth + $iMargin > $iGuiWidth Then
            $y += $iPicCtrlHeight + $iMargin
            $x = 0
        EndIf
    Next
    GUISetState ()
EndFunc ;==> _Gui ()

Func _GUICtrlSetImageEx ( $icontrolID, $sImagePath )
    Local $aCtrlPos = ControlGetPos ( $hGui, '', $icontrolID )
    If @error Then Return SetError ( 3, 0, 0 )
    GUICtrlSetImage ( $icontrolID, $sImagePath )
    ControlMove ( $hGui, '', $icontrolID, $aCtrlPos[0], $aCtrlPos[1], $aCtrlPos[2], $aCtrlPos[3] ) ; reset control pos.
EndFunc ;==> _GUICtrlSetImageEx ()

Func _GuiEvents ()
    Switch @GUI_CtrlId ; @GUI_CtrlId : Last click GUI Control identifier
        Case $GUI_EVENT_CLOSE
            _Exit ()
        Case $GUI_EVENT_PRIMARYDOWN
            Local $idCtrl = _GuiGetCtrlId ()
            If $idCtrl Then
                $sCurrentPicPath = $aPicPath[$idCtrl - $idPicCtrl[0]]
                _GUICtrlSetImageEx ( $idCtrl, $sCurrentPicPath )
            EndIf
    EndSwitch
EndFunc ;==> _GuiEvents ()

Func _GuiGetCtrlId ()
    Local $aInfos = GUIGetCursorInfo ( $hGui )
    If Not @error Then Return $aInfos[4]
EndFunc ;==> _GuiGetCtrlId ()

Func _ImageGeneratePathByCoordinates ( $sBaseDir, $sPrefix, $x, $y, $sExt='jpg' )
    If Not FileExists ( $sBaseDir ) Then DirCreate ( $sBaseDir )
    Return $sBaseDir & '\' & $sPrefix & '-X' & StringFormat ( '%03i', $x ) & '-Y' & StringFormat ( '%03i', $y ) & '.' & $sExt
EndFunc ;==> _ImageGeneratePathByCoordinates ()

Func _ImageGetDimension ( $sPicPath )
    If Not FileExists ( $sPicPath ) Then Return SetError ( -1 )
    Local $hImage = _GDIPlus_ImageLoadFromFile ( $sPicPath )
    Local $aRet[2]
    $aRet[0] = _GDIPlus_ImageGetWidth ( $hImage )
    $aRet[1] = _GDIPlus_ImageGetHeight ( $hImage )
    _GDIPlus_ImageDispose ( $hImage )
    If $aRet[0] And $aRet[1] Then Return $aRet
EndFunc ;==> _ImageGetDimension ()

Func _ImageSplitter ( $sPicPath, $iColumns, $iRows, $sType='jpg' )
    If Not FileExists ( $sPicPath ) Then Return SetError ( -1 )
    Local $aDim = _ImageGetDimension ( $sPicPath )
    Local $hImage2 = _GDIPlus_ImageLoadFromFile ( $sPicPath )
    Local $CLSID = _GDIPlus_EncodersGetCLSID ( $sType )
    Local $w = Int ( $aDim[0] / $iColumns )
    Local $h = Int ( $aDim[1] / $iRows )
    Local $hBitmap = _WinAPI_CreateBitmap ( $w, $h, 1, 32 )
    Local $hImage1 = _GDIPlus_BitmapCreateFromHBITMAP ( $hBitmap )
    Local $hGraphic = _GDIPlus_ImageGetGraphicsContext ( $hImage1 )
    _GdipSetInterpolationMode ( $hGraphic, 7 )
    _GDIPlus_GraphicsSetSmoothingMode ( $hGraphic, 2 )
    Local $sPrefix = _FileGetNameWithoutExtByFullPath ( $sPicPath )
    Local $sOutputDir, $iSuffix
    Do ; create a directory based on image name and with infos on settings.
        $sOutputDir = @TempDir & '\SplittedImages\' & $sPrefix & '-' & $sType & '-Row' & $iRows & '-Col' & $iColumns & '-' & StringFormat ( '%02i', $iSuffix )
        $iSuffix += 1
    Until Not FileExists ( $sOutputDir )
    Local $sTmpFile, $k
    For $i = 1 To $iRows ; split from left to right and from top to bottom.
        For $j = 1 To $iColumns
            $k+=1
            $sTmpFile = _ImageGeneratePathByCoordinates ( $sOutputDir, $sPrefix, $i, $j, StringLower ( $sType ) )
            _GDIPlus_GraphicsDrawImageRectRect ( $hGraphic, $hImage2, $w*( $j -1 ), $h*( $i -1 ), $w, $h, 0, 0, $w, $h )
            _GDIPlus_ImageSaveToFileEx ( $hImage1, $sTmpFile, $CLSID )
        Next
    Next
    _WinAPI_DeleteObject ( $hBitmap )
    _GDIPlus_ImageDispose ( $hImage1 )
    _GDIPlus_GraphicsDispose ( $hGraphic )
    _GDIPlus_ImageDispose ( $hImage2 )
    Local $aRet[4]
    $aRet[0] = $iRows*$iColumns ; pics number
    $aRet[1] = $w               ; pics width
    $aRet[2] = $h               ; pics height
    $aRet[3] = $sOutputDir      ; directory
    Sleep ( 500 )
    Return $aRet
EndFunc ;==> _ImageSplitter ()

Func _Person2Jpg ( $sFileName, $sOutputDirPath, $iOverWrite=0 )
    Local $sFileBin = "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"
    $sFileBin &= "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"
    $sFileBin &= "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"
    $sFileBin &= "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"
    $sFileBin &= "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"
    $sFileBin &= "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"
    $sFileBin &= "qRIEVBImfwqfPPtUb5yeRVIR4ZHaoO2atJCo4A6VKFzg5wKeB1GeDXOjcYoxxjnFSIhHXvShcjgc08YHToO1NagN2ntjFIUOO1SAALk8nNBG7oTjNAEG0A8jj2qJ1BYKMep+lWZGCrkcsegqBlI5PU9cUIZBJGGJwKqSQ5GDitHlhg9KhkiB49aTVwMeWEjPGQPSqjBozuUfUVtSxEKcDiqU0HPHFAipkOmQf/rUmTg0jo6NuTnPUetLuEgyvbqKQC5yPWkJ9qD09Dnigkjr1qgEyVIYHDDkGuw0q/F7aB2++OGHvXHHmrukXps70Bj+7k4NYVoc0fM0pT5ZHWOgExk5Bxj2qN2zkZ4p7HKDnNV3OFPPPpXGkdjZDKSO9RByGHcUkjcY7ZpF/nVpGbY5m/u5JqrPJjPNPZipOBiqspLZ7VdiJMydSmJfbk1mjk1PduXuHPvioAcY967YK0TlerAdelPxgZIpBxTjk8ntTEM7U4c/lScjNOUZU02AqnBzTpBhvYimgUrHgCkAE8YFNPBHvS5wTRIANopAOI+UDHIpBwead35oIG0GhAPR+3pTj8x6ciolPOe1KThvehoB5O4DHFSR5AzUKnJ4qWHLblzUtaDOtit0fS0mXO1xn6MKwdR+abIxzzXQ6OHk0Xn7gNc/fLuaQjoDWa0Lex3/AIDmJhCnoO/pXeygvEccH+ded/D7LocnABFejMcjAHFaRREiGPO3BPQVMhwKgPMoAPBqwOvHWt4mbHE7eR0NP35GajycH0pAw654q0iSYNnGTzSMfypoP5U4sCOOgoA8e3c9eKMc+wpmeOtOLADmudI3Jgcc55xSGYL1OT/Kqkk2R1xVdp8nGTTSsBea49aYbj361nGfPOelRGc54NAGobj5s8Z7U7zgRz0rKE9PE4HSkBpFkPNNIz7iqgmyOtTJMCDjrTQXHMucjvVSSPA5/M1bLg0yRdwBxmlYZlywY4A5NUpYmj+dBz3962JF9arSRg84pMRnq4kXcvHqKXPHNLNAyv5kY+YdR601W80ZAww6igQE96a3PSndfrSEfN0o3A6jS7wXdipb/WJ8rVNJ3xxXO6Vc/ZbsbidknB+tb8hOMflXHOHLI64S5olWR+SOtAOKilYmSlzkUkArfXpVa4ISFmx2q0kZJxiqGrt5dqy9CaqOrsTLa5zrHcxPqaSgc8U4rtPSu45B0aFm2gZJqQqEOM02J9nI4apPvDe33jSAhbqRSxnjHahh70xBg5NMZMenFNbqp9aUEk0SDnAqQEIxSZ3MM+vWpCMpUYHzD2oAc/DcdqQn5j706QZGexpkqbSB2pgIxOPoacp3YpmafGAWH1oAlUfOAacmd5APNLINrqelIOHyakZ3PhZ0k0m5gkAIHINcvevieVB03cGtzw3MI7S4VwQzLkGsC55ndvVqzW7L6HfeAg0MLFlwrng16EzALyeCK5fwhaKnh6NWHztzXSpHkgsOAMVUCJCxLnk1IeuB0pVFShcAYrdGbGAZHpURBU4FWMfL9KjYc9PzrRMljM4B560obHuDTDzxS5xTEf/Z"
    $sFileBin = Binary ( _Base64Decode ( $sFileBin ) )
    If Not FileExists ( $sOutputDirPath ) Then DirCreate ( $sOutputDirPath )
    If StringRight ( $sOutputDirPath, 1 ) <> '\' Then $sOutputDirPath &= '\'
    Local $sFilePath = $sOutputDirPath & $sFileName
    If FileExists ( $sFilePath ) Then
        If $iOverWrite = 1 Then
            If Not Filedelete ( $sFilePath ) Then Return SetError ( 2, 0, $sFileBin )
        Else
            Return SetError ( 0, 0, $sFileBin )
        EndIf
    EndIf
    Local $hFile = FileOpen ( $sFilePath, 16+2 )
    If $hFile = -1 Then Return SetError ( 3, 0, $sFileBin )
    FileWrite ( $hFile, $sFileBin )
    FileClose ( $hFile )
    Return SetError ( 0, 0, $sFileBin )
EndFunc ;==> _Person2Jpg ()

Edit : photo included.

Edited by wakillon
  • Like 1

AutoIt 3.3.14.2 X86 - SciTE 3.6.0WIN 8.1 X64 - Other Example Scripts

Share this post


Link to post
Share on other sites
JohnOne

Yes.

Sorry for late reply, I was busy making my own, which is a very simple version of your's above.

Your ImageSplitter came in very handy for getting needed gui and label sizes. :).

I think there are many puzzles you could create with your code, even just mixing the split images up would be a good one.


AutoIt Absolute Beginners    Require a serial    Pause Script    Video Tutorials by Morthawt   ipify 

Monkey's are, like, natures humans.

Share this post


Link to post
Share on other sites
wakillon

Did you find who is hidden ?

Here is another version adapted to most picture dimension :

#Region    ;************ Includes ************
#Include <File.au3>
#include <WindowsConstants.au3>
#Include <GUIConstantsEx.au3>
#Include <GDIPlus.au3>
#EndRegion ;************ Includes ************

HotKeySet ( '{ESC}', '_Exit' )
Opt ( 'GUIOnEventMode', 1 )
Opt ( 'MustDeclareVars', 1 )
_GDIPlus_Startup ()

Global $iPicNumber = 15^2
Global $sPicturePath = @TempDir & '\person7.jpg'
Global $iPicCtrlWidth, $iPicCtrlHeight
Global $hGui, $iMargin = 0, $aSplit
Global $sCurrentPicPath, $iPicCtrlExStyle = $WS_EX_STATICEDGE
Global $idPicCtrl[$iPicNumber], $aPicPath[$iPicNumber] ; used for save pic paths set to Pic

If Not FileExists ( $sPicturePath ) Then _Person7Jpg ( 'person7.jpg', @TempDir )

Global $aPicDim = _ImageGetDimension ( $sPicturePath )

#Region ------ Split Management ------------------------------
If $aPicDim[0] >= $aPicDim[1] Then
    $iPicCtrlWidth = 50
    $iPicCtrlHeight = Int ( $iPicCtrlWidth*( $aPicDim[1]/$aPicDim[0] ) )
Else
    $iPicCtrlHeight = 50
    $iPicCtrlWidth = Int ( $iPicCtrlHeight*( $aPicDim[0]/$aPicDim[1] ) )
EndIf
$aSplit = _ImageSplitter ( $sPicturePath, Sqrt ( $iPicNumber ), Sqrt ( $iPicNumber ), 'jpg' )
#EndRegion --- Split Management ------------------------------

_Gui ()

While 1
    Sleep ( 250 )
WEnd

Func _Base64Decode ( $input_string ) ; by trancexx
    Local $struct = DllStructCreate ( 'int' )
    Local $a_Call = DllCall ( 'Crypt32.dll', 'int', 'CryptStringToBinary', 'str', $input_string, 'int', 0, 'int', 1, 'ptr', 0, 'ptr', DllStructGetPtr ( $struct, 1 ), 'ptr', 0, 'ptr', 0 )
    If @error Or Not $a_Call[0] Then Return SetError ( 1, 0, '' )
    Local $a = DllStructCreate ( 'byte[' & DllStructGetData ( $struct, 1) & ']' )
    $a_Call = DllCall ( 'Crypt32.dll', 'int', 'CryptStringToBinary', 'str', $input_string, 'int', 0, 'int', 1, 'ptr', DllStructGetPtr ( $a ), 'ptr', DllStructGetPtr ( $struct, 1 ), 'ptr', 0, 'ptr', 0 )
    If @error Or Not $a_Call[0] Then Return SetError ( 2, 0, '' )
    Return DllStructGetData ( $a, 1 )
EndFunc ;==> _Base64Decode ()

Func _Exit ()
    _GDIPlus_Shutdown ()
    Exit
EndFunc ;==> _Exit ()

Func _FileGetNameWithoutExtByFullPath ( $sFullPath )
    Local $aPathSplit = StringSplit ( $sFullPath, '\' )
    If Not @error Then Return StringLeft ( $aPathSplit[UBound($aPathSplit)-1], _
        StringInStr ( $aPathSplit[UBound($aPathSplit)-1], '.', 0, -1 ) - 1 )
EndFunc ;==> _FileGetNameWithoutExtByFullPath ()

Func _GdipSetInterpolationMode ( $hGraphics, $iInterpolationMode ) ; for compatibility with AutoIt 3.3.8.1
    Local $aResult = DllCall ( $ghGDIPDll, 'int', 'GdipSetInterpolationMode', 'handle', $hGraphics, 'int', $iInterpolationMode )
    If @error Then Return SetError ( @error, @extended, False )
    If $aResult[0] Then Return SetError ( 10, $aResult[0], False )
    Return True
EndFunc ;==> _GdipSetInterpolationMode ()

Func _Gui ()
    Local $iGuiWidth = Sqrt ( $iPicNumber ) *( $iPicCtrlWidth + $iMargin ) + $iMargin
    Local $iGuiHeight = Sqrt ( $iPicNumber ) *( $iPicCtrlHeight + $iMargin ) + $iMargin
    $hGui = GUICreate ( 'Guess the person in the picture', $iGuiWidth, $iGuiHeight, -1, -1, -1, $WS_EX_ACCEPTFILES + $WS_EX_TOPMOST )
    GUISetOnEvent ( $GUI_EVENT_CLOSE, '_GuiEvents', $hGui )
    GUISetOnEvent ( $GUI_EVENT_PRIMARYDOWN, '_GuiEvents', $hGui )
    Local $x = 0, $y = 0
    Local $aList = _FileListToArray ( $aSplit[3], '*.jpg', 1 ) ; based 1
    For $i = 0 To UBound ( $idPicCtrl ) -1
        GUICtrlCreateLabel ( StringFormat ( '%03i', $i+1 ), $iMargin+$x, $iMargin+$y, $iPicCtrlWidth, $iPicCtrlHeight, BitOR ( 0x01, 0x0200 ) ) ; $SS_CENTER, $SS_CENTERIMAGE   
        GUICtrlSetBkColor ( -1, 0x000000 )
        GUICtrlSetFont ( -1, 11, 600 )
        GUICtrlSetState ( -1, $GUI_DISABLE )
        $idPicCtrl[$i] = GUICtrlCreatePic ( '', $iMargin+$x, $iMargin+$y, $iPicCtrlWidth, $iPicCtrlHeight, -1, BitOR ( 0x0100, $iPicCtrlExStyle ) ) ; $GUI_SS_DEFAULT_PIC
        $aPicPath[$i] = $aSplit[3] & '\' & $aList[$i+1]
        $x += $iPicCtrlWidth + $iMargin
        If $x + $iPicCtrlWidth + $iMargin > $iGuiWidth Then
            $y += $iPicCtrlHeight + $iMargin
            $x = 0
        EndIf
    Next
    GUISetState ()
EndFunc ;==> _Gui ()

Func _GUICtrlSetImageEx ( $icontrolID, $sImagePath )
    Local $aCtrlPos = ControlGetPos ( $hGui, '', $icontrolID )
    If @error Then Return SetError ( 3, 0, 0 )
    GUICtrlSetImage ( $icontrolID, $sImagePath )
    ControlMove ( $hGui, '', $icontrolID, $aCtrlPos[0], $aCtrlPos[1], $aCtrlPos[2], $aCtrlPos[3] ) ; reset control pos.
EndFunc ;==> _GUICtrlSetImageEx ()

Func _GuiEvents ()
    Switch @GUI_CtrlId ; @GUI_CtrlId : Last click GUI Control identifier
        Case $GUI_EVENT_CLOSE
            _Exit ()
        Case $GUI_EVENT_PRIMARYDOWN
            Local $idCtrl = _GuiGetCtrlId ()
            If $idCtrl Then
                $sCurrentPicPath = $aPicPath[( $idCtrl - $idPicCtrl[0] )/2]
                If Not $sCurrentPicPath Then Return
                _GUICtrlSetImageEx ( $idCtrl, $sCurrentPicPath )
                Local $iExStyle = _WinAPI_GetWindowLong ( GUICtrlGetHandle ( $idCtrl ), 0xFFFFFFEC ) ; $GWL_EXSTYLE
                GUICtrlSetStyle ( $idCtrl, -1, BitXOR ( $iExStyle, $iPicCtrlExStyle ) ) ; remove $WS_EX_STATICEDGE exstyle for remove ctrl frame.
                $aPicPath[( $idCtrl - $idPicCtrl[0] )/2] = ''
            EndIf
    EndSwitch
EndFunc ;==> _GuiEvents ()

Func _GuiGetCtrlId ()
    Local $aInfos = GUIGetCursorInfo ( $hGui )
    If Not @error Then Return $aInfos[4]
EndFunc ;==> _GuiGetCtrlId ()

Func _ImageGeneratePathByCoordinates ( $sBaseDir, $sPrefix, $x, $y, $sExt='jpg' )
    If Not FileExists ( $sBaseDir ) Then DirCreate ( $sBaseDir )
    Return $sBaseDir & '\' & $sPrefix & '-X' & StringFormat ( '%03i', $x ) & '-Y' & StringFormat ( '%03i', $y ) & '.' & $sExt
EndFunc ;==> _ImageGeneratePathByCoordinates ()

Func _ImageGetDimension ( $sPicPath )
    If Not FileExists ( $sPicPath ) Then Return SetError ( -1 )
    Local $hImage = _GDIPlus_ImageLoadFromFile ( $sPicPath )
    Local $aRet[2]
    $aRet[0] = _GDIPlus_ImageGetWidth ( $hImage )
    $aRet[1] = _GDIPlus_ImageGetHeight ( $hImage )
    _GDIPlus_ImageDispose ( $hImage )
    If $aRet[0] And $aRet[1] Then Return $aRet
EndFunc ;==> _ImageGetDimension ()

Func _ImageSplitter ( $sPicPath, $iColumns, $iRows, $sType='jpg' )
    If Not FileExists ( $sPicPath ) Then Return SetError ( -1 )
    Local $aDim = _ImageGetDimension ( $sPicPath )
    Local $hImage2 = _GDIPlus_ImageLoadFromFile ( $sPicPath )
    Local $CLSID = _GDIPlus_EncodersGetCLSID ( $sType )
    Local $w = Int ( $aDim[0] / $iColumns )
    Local $h = Int ( $aDim[1] / $iRows )
    Local $hBitmap = _WinAPI_CreateBitmap ( $w, $h, 1, 32 )
    Local $hImage1 = _GDIPlus_BitmapCreateFromHBITMAP ( $hBitmap )
    Local $hGraphic = _GDIPlus_ImageGetGraphicsContext ( $hImage1 )
    _GdipSetInterpolationMode ( $hGraphic, 7 )
    _GDIPlus_GraphicsSetSmoothingMode ( $hGraphic, 2 )
    Local $sPrefix = _FileGetNameWithoutExtByFullPath ( $sPicPath )
    Local $sOutputDir, $iSuffix
    Do ; create a directory based on image name and with infos on settings.
        $sOutputDir = @TempDir & '\SplittedImages\' & $sPrefix & '-' & $sType & '-Row' & $iRows & '-Col' & $iColumns & '-' & StringFormat ( '%02i', $iSuffix )
        $iSuffix += 1
    Until Not FileExists ( $sOutputDir )
    Local $sTmpFile, $k
    For $i = 1 To $iRows ; split from left to right and from top to bottom.
        For $j = 1 To $iColumns
            $k+=1
            $sTmpFile = _ImageGeneratePathByCoordinates ( $sOutputDir, $sPrefix, $i, $j, StringLower ( $sType ) )
            _GDIPlus_GraphicsDrawImageRectRect ( $hGraphic, $hImage2, $w*( $j -1 ), $h*( $i -1 ), $w, $h, 0, 0, $w, $h )
            _GDIPlus_ImageSaveToFileEx ( $hImage1, $sTmpFile, $CLSID )
        Next
    Next
    _WinAPI_DeleteObject ( $hBitmap )
    _GDIPlus_ImageDispose ( $hImage1 )
    _GDIPlus_GraphicsDispose ( $hGraphic )
    _GDIPlus_ImageDispose ( $hImage2 )
    Local $aRet[4]
    $aRet[0] = $iRows*$iColumns ; pics number
    $aRet[1] = $w               ; pics width
    $aRet[2] = $h               ; pics height
    $aRet[3] = $sOutputDir      ; directory
    Sleep ( 500 )
    Return $aRet
EndFunc ;==> _ImageSplitter ()

Func _Person7Jpg ( $sFileName, $sOutputDirPath, $iOverWrite=0 )
    Local $sFileBin = "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"
    $sFileBin &= "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"
    $sFileBin &= "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"
    $sFileBin &= "mvQhpXDgSz4BsF/kcbwNdOTB6/J1XSeg9Cj4YjyDrqv4FVofVPIyjSV9j4CWnpMU8plKS37GTGouBotYJYKmP7gaZXRc5ahZkBt7GMcaCT/kUzdkOxhp830VN3wbyEhD/uFb7+yXP7CzFw1VI1a/ogomKM5E6op4mlehqsRZ2aR40Z+fgPILvob1Psel5EtBCbQirc8EPkzhN/BjhaeYr0oxO9IWOh3bfYprT9EPIfEb2F3L7HG/6Yvip7HDcsVO3TL503c5IOvrodOeWTMt0sLopUOBePgb+h59Ce9OaI604C00q/bF5v051iEtbL9nFBnJDftMh8Wj50obhDbkalio1ozXZVSNeSmPguepIolaS72NmcHab9Q1ONQxrgfTGvYpcvPBhCvJwg9tKOH+F3NHVWDO3Pg9hxzvowq5V4L2oasph09els/sXyKYQ7yYaMPBpg10foZsWU4x2cPY3JzBhz0dEbUQ3gvsdqT/ANfEQ4LSaEmFMWsYEvQ3LSFRQXTl9CCFxw+BOEKMMazWZLgOYS7lv0Z7nx0FTh36Uo9X+BIzRKWH4fFnRJc5+i1eB7d4IOOiFhaPG7GZfv8ADWo3wheUVKzgwcIv4ZKVP8EqsWdik3GUUcnBOQp8H2w5G2Rdo6NLlCs06n6JRp/2NfUj1CV8AS2VfZ4IUdaOLqJAWq4Ym/JqMXPgWXFBrfDJdyayh7VD9CGYb5HT7JI2IRYJUbDqT0c6p0S6sZhqhNEzUxmBTTL+yzkq8CusFqDxi2tQ8DnEcaPRCex7FhIWT0N8IdJVteDRtj6Ez4PxBYfbo5hw8PYrwTNV/RnFfWnEf0OSKc/uK9f7D2oxpt79OVWvQtxtMfSfyfuNuOiEI4BKrg4dkxKhb24NV4X9ZKUrkIk4EzG8ErrGxILyxWIQbRsRfwHOfYHu4SPYb8ifFGMbp3QXWlrHryWfAdFTc2PyeBlj8jIfCF2k5Mxr2bcnC8TsTGimyofUia2/ogdKVahVWT2UyoY4rGsUny64mMRnLOSg2uhpyGP0Nyz0GsW32aVoX1O+SAM0sZs6NZRX7FAmpBm/cOjCZ2cRF6xI1esyli8jt3BZ8aXA/oa81i8n0MbEY0QZRdW9H9z4QgrMZMSlz5ESwdDEplYTnoX4Mi0icCf6kv0MKlRY5jnAmm/R8q5FF2PsTa53yP8A0RX/AESmoTs32Bap+2kG4X8AzVGIHpktNXkcU2MykXjkWw3nRa+hRKo0ZEQy5GNEfg9tGcFo1M5FR4OXvwJM4/R1j6GOP5EyoUybmjZ8n0Riz2h14Md1QV0m/pFbvPZPG/2StAwE3yMpWmOn2C2DjzTFH6pDhwTkF3ieHAvQz4GnZnX2KDjti7kEcC6NC4yPK+ENWnsCZo3NccBK3A0LRzJtRnMp1qi+GQypezy98lut6XY9MjJTkSbueWKdtDe4aUkmxkE+aPImjKaRTh8RRdTyI8ELxnlS9i5cBNLXki5BejDLHZclpqXI4MmXlHGV+hoTxnomzEhq5PoQ2mg2STXsVSoTSjG8Cxlvp0TCFNHgJRz4XvDwvw0P6g+nkXYdUcIqeZXoQ1oU0+FiQOn1aPo5f0Lfp9lNaa7HQlJ7Ej0saSS/7K2HTrOyt/4PBrEGEuIzaF/sd2zoj4staJ+jRdzBbyIhyLfeBzWbBtZFQpXIhKnr2J9zK05OZP8AR8Qbg+QQ+ViOYuxStCvq4F7wDTwDOQZxUNvv9I9Dhdh+w3JGOfgSEqDJu9iWaMTKZkMUsGkTT6PIPwd4f1OeYxtBpNH1pHS55QlryzwCfZzqhjXlJeUzyqjvO39CiqN6E7fg4CRt+EK/B3hlko8QU1wxxqoRxexpEdQwmNyIZvwProxrPDFcBGsv1Ra1PSCxJ/4lFZVaSvoRqkPRg1NwSvYocHysK9y+SwnsImy+CmtX0QiSQS3pje5pp0K9AlwysumPFuS/QCfBwppeiJORFpFBR530ZPZjDv0PB4cgC6bR5dC9i6R/ZVdPR2hjW8cEzfY5JYzr/gQUpeTbZaDePI6In1yfYhj/AAYzqNIaGlg6b4ZGpb5H/J90eulj9phb/wCgd8VS9CBBsS+FX2e8CloinkgW2eTkrUIItZNlut7Fc3Su4ZrxBU3iEJPlMTu0tCPNMeqz7hYLVBuukcHgTNEv6K/6I94FSfPAnASXwCo1Z0cuvPjCeGx9v4FNaFJyGDFRc0Y+zCHqRnIcb2akvJ3D0oNeTjnAjORhG9Fy/wAibGC7ovRRvItGmP0Dt6+xQTBW5T0J+hckpPsYklDj1S6Eov0IX9/w0SF/Z0JvYllpF7TG5Z4BJcEq7L06FzOGcqzPOjLXQuD4wNcjLn6HJzvpDZVJG5/Qi0SI0wcBx6KexHlNzF8ClbyLp0GhlclUpz38eeclNPdccE4nInBycBb0cTWI0jKF6G6p+EcsZTfYmNvvsqcjTEMuaUSadQbZjQhy348DhwRU+BNwRvMTI6ijMNqofPhM4TngTljyiJaEXp5MjZILHPiiG24ifb4pGryeq/STuiuVENH9ASZf3Cm8RLjnsSUQrzS10WmD454HlI6kU+TgdPJY44PVjhpCbROIbzWLULlNjKXYSpj/APgD7wR2q3/Rck0aELZsVdB+VkbHibK/jKY1ELg1pIZV0PWpxk2BtoRMSH3yaKNeRFy2Kqb/AAfK8eBWOxL2U1FwM5S0pzhjwJMQ+RtCK5yJf/lDSz8CTnsWLBrPhVFByNmUsRXaVw5KV8ITgRzpjleDHGuRY+yC+xqocvoZjtQ+NW05TlVE5GVHyxtELchbj0R1hb/Bo24OEXJGeWiUMhE5HWgm4aEpo1YgqnHBN6JXhpzvYlgzSOELnOcaYZJTkhJMmR/LHw6XFOB5pnnhnITwadsWhGwwkuELiz0NNKvPB0K635E63vHR5HAt64H4hfOluLtiUgpngb8liGvAkx4J4aHLEiD0zB1MG+09GVN8H5WKTTTwdNpjWuGZ8J0NscLT3iHVOAvYTcGSw9WLyyqCqBo7GJ8JDahEH8i8QvE5P4If8h0gdvwMZ0V8n2S4fwUwlnDBdHP4YCRToahGRiuD0n/I955YqXAjt6Gob4HCQ1rkSatL3IyHPJayCD7Xfsj+kGr2WcDJTkXtD6GOOSxxwXhywIRZ+UPhM0vgTnQ0bFjXsSGCJOm1vBHgOXw0M6b6FyRlfZRxoStHwcAPoDNf/R+DfQpaI1h9mrmkIw9iYuTVnmacSgsmC/6dyLox1TeeRUsXPxEfXDml0xsc47IavYnIcig3dRxTGuw02O3UhKtVYh4PnPg4ZGpJDUhzpnAXkTrNYJw0JlUnkyqxMSWixyVuKISxXGNHEck9sPZhDdUaOnEPav8Akn4QR4f4W9K0XrhjtVobgY9L/BJst+ErfhkrXEkcyXRf6aJiNQlnYm2xPFibbXAuHunBrg00ci6OWiP9iFaNY0LGNmk4NpjLp0FE4H4QmE9PsVMbZ4Ks6Opj2Fwh1wK3kSqCTgsBzFkNxCo2untFb6FdHGfI2yp3RhvYhYJeEIow7Ps/jDSYe7E/DG5yQvI6JJYzgaXwHLjSOUTaNA+lR1HsrFKoqesaraPvSrFFxrFctPc04RvhDdbr4GiA5Z2czI8X0Jpjr8hP4L62GnyJd9DC4lE3eDgcRZgzp5BzqYySSXIkSs9BFr005Grex8kaNPUJj5OXeRD0evoTovHRoh4icfkmFsjSpNkpmqx7Hx4GmcskxsuRvD1ZwIQwkTpmdMZ9DexL70aLsuexZwhY6iWujsuL0Ub6OR9jA0pdj+Eq5GX6J57FnWCWK5whOl+AYJL0Lo5HDROII/oLVyLRI5NfA9LWPDp5PI6StlTkNUd4yrBs3yK9bRtHotpYK8CCmnkWBJNOMxHQxWYJm+TKrBMtq9n2pxhvHCg8YIQxss0VsyIm34Lfv9ILRKhmJ8jbyTwHwF767Fg5UaJ6VLpx9DSnHIzTXg1QXBCg++jhCfo6Jr2+D0J1"
    $sFileBin &= "vo7mif8AIuhkVQz8PscbS6zn4UnKH/RFdg20jaK4PW6zxF9jLwgn3nMCWvY2uPoTsx6O4NdmngycHv8AY4QxDB1ml/wzWe30dPfhY0E/5HODhozuPkanWPWIdPKvJY8+zsPk71s3iDf8nLhyoURAKHP6T5EyL8unsfsaIrogg8fBpHDYSdkOBBI3gXFGk6P0RP8A6NdGlOYKWxNdmghnq4SXwq/QhZTDgJiVrRsKo6d0k5Eihs/UE+UjuODfJDPArmr8D8FiLnAthYdiQx93+ELlNMZ+vRj2N+xYaHsLQvi/sY4+kW0zplkPg0KnSiT6vxxw6Zk+9FJpuh+Blfw1g8C48kUqZwU9OFnI8LJ4vJxlrHfZVsX0INREXh7I4cEfXBqkuWM10zuaICPsbSzC2BI20lKI03g0TSwuPoa/ouN96Q/6B38AQXlmJlOPB3FnspL/AEK0qNsTrgL2o1TX/Sm/sbLTR5x6ceeMZPHBefBfDR3h8jmDSoyr0GFChf8ACIJideluimITLUOb2eFyJ+C52EjEYux0wHz1X6FvhCdK3y+BRrA1mpUba7GIzN4n6HWE64aB+li/+krT0ZwYLpXpAMcXAlyf2jMU232Kvwswqii0VrofiE6CUVweQcc7I+Rrr6F9SKO6J6HliX2bXaNeB3kwN1b8GsdHAOw2Deze8OljZTAYhOiqDrYLoYm32Ez1p74G3cEpr/oSq4/gQnP9CGt05Uo6yusGlH1wco0KYaRWl46OE6M+CODrMRkL+jGMCWlB4DM4DTdNlBr6NVFpOiIuPZMmUhNpjiGIdvkbxMDk5DpJRvcqhZ0DZNJ8jPJfAVL6E1shl0rB3oPxn4Jkx6JtjfMXJdPBkwUzoa1V/hfgRB13Dkdnmh2A44xyaiOMV9DuDjo4NzfIxJeGc0w0V8Dlgl5jmcMWQRJo1PkNa1it/Qg2T0p2cVEsEzBVMHa2sKqnIouTbHHkfliNqimkEW21EN22Ps7Uo7IxwuU2xuxejWl0LsuGHYaOIaX6KJrEo/nR4saPQjHKM8lnPAgw02uxjHMYh3Dk8CFhPTfJRRO/o2B5aws1RGld0XUYdo+Z0NRwfxSOcinRP6+Au1E9kfBCRpfCkqOcPEJcAti8jhkYxETiqTG/J/CjxWTT7CD1pt/0NEsbP+hPSP2OXKijy9DLJ1cDXzXgXCGsHx0ctZ+In/g4+GxLukXIUWjVUXwLhhL0OCZQImCulEPuZ5IaYeTgVKxu7hskmdgSOi2a+yUtMORbGNWCD4+AaAjY/wAGKcwilMCRIVtE4RTaXQo0lsVPPI44mNGt5O/YJnBBClp9F/8AZDgmyzUVAknbGVM/RzLoSvB4zobkqbpQ8o3/AOEpJTvGOcvIgXgJkbag4CZ50K2n9cEaR/R2KKlw79C0Z9CrXJ3i1yKbo9mCgkErBd5wfCejbyjGrr/ItZhh4noS1o9ImHYtLBKTgow3HyYrSZCpzg+pjm94OFh2J/Iv2LX/AAL1WeUKVFwFcc0Y1RpoZYZ2Mkmk8fAwGHjRWyRgHGjgP8MiKhc7IQyERnEniL8BXRZm4NPaFKBsSHXyqQ1yYkJ4nBJRmLgd6oU4KpzSGrRWp2eez3BpSDn9kcOjRzydBDD0chilCXtCXCRtsxlWiRIuNH9gZvumSyMcocrH9lX0P3PsK6cjHZ5yUm8IexC3yKuuUhu6PhL5Xon8FNFyoN5cx0MIzRtJ/GyNZeB+W/BRWoJK++hptCDeqc5+C9+ehLSwQoiRjEebwXwfDIJiVPsXQpiOgnrkhCStQyhJ9lSba+juP+zQ7WyrE2MfBfWErh/GNxoskVkBPkjiVvgRupC+TW5NY2zO8saSOb+whQ7G1ToZW1tmFyZEwxTh/wCC2/8AgJSsXR8oJT0UGqxnn/RD1Yd5ycV8o0O254JwaZpIPcE7cHgHFciKYdReenW6IOIQ7Q90ZiC2pkePPhGvls/Qs8Mcahq1Uvoc4I6EuJJg1xDe+AwqCeLSxWOy4JHJpDlhDI0Zd0WJXk1yEK1X7GH67JiuFtN4o2/F/FhtEx8ELFhVGhPkRRIqUH+rEkh8wwsVCZjOUJyv8E0goPlyxcFcR4d/B5swTwRJz0NOCH3SPpGJQNEYfuEylcYlkEsfvRVXJwGov6C1vR3I6G87FvRfpNDdV4hRuusgLwTN+Bz4VshJ5yOnXDNPQ9GLpyglZ0+Z/i+jEmNHETOxpBRcEkYoc68jZ/ZTJ9DZy6ujWLpyWo4obcL48mB5UYQ1fRLSBnopz0PCeRpZQTyyA2JEZwKtThECcbzkr2fzBHlflFyGmvm6OU/9MM7JByQPWo2NqsXFfoW+RbEhCR/ngkT3sYw3zG35JC+juRZ/RCOh0+zSXTQTP4INUVU2JHxn2K0fAzgfYuBUvsn2UFNRAtqR+SCM8nRltYxrBs+GPq2PSaP1DX7lheWajnsV1azoTguSk54LTkX9CFxyb+GcnPaOgUF0V+RiXfI3AXok4aTOAMFJbyD/APTE6FCaHidMZL2qEjFkXS9i8E7wRyxknGJkzJ8EiKiDwLhE6YJdmPunK17EvDRcknyPp7mr6LVSX0mVW6npCy9CbShInpUaLDG18O2eUEp2oTVFcF3SULaaC6dnFtiMT7HbCwTf/qm2KdxUJxTwuRNPzgrR/DMun5GIOG9fo4CCIY3xce/E/sf4ofr7PYhbgP4jgtM6E8Y/8E6HZ484LqbR3TIcEZeIPeRqpJwUTgs419MaTHj+iPHCQldgy6n4POFG3U/Rn/EUtX8DbVB8jR+xNU19tiVvDFLEw5ng5Va/DZr8FEy69/BV5l5E8iZuVPYpI0Q88MN17Ib0W5IvOSbKZ1rc+x1R5ob+LD/Ff+EuBcipSSHIXJ/gdDi+OnyvAL41yh8jOS+DmK1Eqcv43YYbHxcn0d/i/wAzgvh8/p4O/gujmK/5C0dDgcfz/wAxMGX6b+Q5H//aAAwDAQACAAMAAAAQaypYjGy8uGEnt9FajPlzeD+r+5QbPM8E9tgxw3oH9ICE3P8ANLvQ0JiXH5OmsL6mecyBO+uiVu6vCUys5ExdA2h4mcs+bhSX2snteKciudUURTuomqWwMB8TgvK7gr9B4RIxTonQuS9/qyrbY03zpbDK/NuWuRdTbmi0G4hf7CeFAxJQdd5hfytLRcbNSb0nUO3iHDOR0zN588PdiJjM22PF54VTqgAwOD6Q2xnqJigTXrxtQtj0vnJhj3M2hNxtJLRox8X/AIouih/o3qklMVmnFuKr73Y9oaFZlj9JgVw4TEANejkx8XKblt7oTSSBAuq5mOXMMN6L39JaLGNRt0uAJDVMkau/6k7SFNAylDDZSO+E8uqMi8HzXXbBZjdwDMNL12GwMGsv60hjK3XQtAsFNl94Vxkfd6dE4DFOWXzarNwMH9fGGzDzRbxvL9NYA/yrCDoJXWAHlnbG2bQsEx8o894eDu1y2s4nMYfJQw+PYblGP3Sa9AoXpkWwlFZY2nxXT9rbhS27UCVzRFZLHnsQhVRU6XNyzK+Gidlf69EXItEkidrYbVsF4x7EKOUGSdGGOREIfGS02rPOyczwsLkBlwxTn1qvqmRiJkFj7zd7MK6H+DzvvMujO9F+EIbGAz3iELWifYpH5g1+nYRuR0+B8IEACB74AH51yL98Pz/4Nx6Hx/8AfD//xAAeEQEBAQADAQEBAQEAAAAAAAABABEQITFBUWEgcf/aAAgBAwEBPxAq8BPOMtjWZLNlcNcELLLRA2J5Gw93yPLYeCqSZYR+w7h7hh28t/JW3btyPazOCRAjgzLS18Yfs/i3LY8oYcDy1hyGNfOAju94DqSwgkjFqS6Sfs6lEaW/loiPsNJO4xb1b3DD3dJRJuxEOlmyiF0fLyYBJhrdizZMu19mW98fkd8bkoNnB2ztIcjDqeoxdEIlbA14O/ll7f3tfGS7lCzwl6ujlmkFj7BtvgldLfunRxJnT1Yz2OeXZ1dF1bzDTG6CNYYSR1s7"
    $sFileBin &= "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"
    $sFileBin &= "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"
    $sFileBin &= "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"
    $sFileBin &= "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"
    $sFileBin &= "JjjFkss+xhT5Fv8AU6P/ABen8Tlj/wBpw/iLQFFod/8AE0NMTdt4i3+E5fLjz+yP+9hr+qdP9RvSJb35P+cEuEBbnkz/ABQ6/BqYoy4IEjfjH/66dnt9htux0qzWM3LCAQ3IBZNtDn8Gav7bDRrP/DeH8/8AgOH8mCnTA1+0QisNY6EwmCt/tAsQWnpACo8Z2/hib7Cbd5EoX8Jx/gj2FJS6CI1Cr/M9z/2/8f8A/9k="
    $sFileBin = Binary ( _Base64Decode ( $sFileBin ) )
    If Not FileExists ( $sOutputDirPath ) Then DirCreate ( $sOutputDirPath )
    If StringRight ( $sOutputDirPath, 1 ) <> '\' Then $sOutputDirPath &= '\'
    Local $sFilePath = $sOutputDirPath & $sFileName
    If FileExists ( $sFilePath ) Then
        If $iOverWrite = 1 Then
            If Not Filedelete ( $sFilePath ) Then Return SetError ( 2, 0, $sFileBin )
        Else
            Return SetError ( 0, 0, $sFileBin )
        EndIf
    EndIf
    Local $hFile = FileOpen ( $sFilePath, 16+2 )
    If $hFile = -1 Then Return SetError ( 3, 0, $sFileBin )
    FileWrite ( $hFile, $sFileBin )
    FileClose ( $hFile )
    Return SetError ( 0, 0, $sFileBin )
EndFunc ;==> _Person7Jpg ()

Another person to find !  ;)

Edited by wakillon
  • Like 1

AutoIt 3.3.14.2 X86 - SciTE 3.6.0WIN 8.1 X64 - Other Example Scripts

Share this post


Link to post
Share on other sites
wakillon

I think it's better suited for the amount of squares that is indicated on your OP screenshot.

 

Sorry i do not understand what you mean... :huh2:


AutoIt 3.3.14.2 X86 - SciTE 3.6.0WIN 8.1 X64 - Other Example Scripts

Share this post


Link to post
Share on other sites
wakillon

Just 16 squares.

 

Ok, at the top of the script change "Global $iPicNumber = 15^2" by "Global $iPicNumber = 4^2"

But it's too easy  :P

And for the Puzzle game i'm already working on it !

Can i see your version ?  :)


AutoIt 3.3.14.2 X86 - SciTE 3.6.0WIN 8.1 X64 - Other Example Scripts

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Similar Content

    • Xandy
      By Xandy
      MapIt is a tile world editor.  MapIt was built around the concept of reversing Dragon Warrior map images.  MapIt can take image input and produce a tile and world array.
      MapIt features Unity style dragable labels that adjust property values.

      MapParser is a C++ project that scans images for unique tiles.  MapParser is very fast.  Due to hard drive failure, many bugs were restored b/c I had to rewind many years.  Frustrated with the design, I wrote a new version from the ground up.  This New Version:  AutoIt Front-end, command line controls, and shared with the world; so that I can't lose it again.
      You can toggle the C++ MapParser off to see the difference in speeds between the MapParser CPP verse AutoIt function.  Function is named Scan_Tiles() in AutoIt.  You can also chose to download without MapParser.exe.
      At the moment Scanning a image resets the arrays, but you can add tiles after scanning.
      Images can be added as tiles without scan image at all.  Then configure settings to give your world parameters and manually fill the world data with tile indexes.
      Using the settings you can change tile size after a scan.  Example: you wanted to replace a map with different sized tiles.
      Changing and replacing tile / world data is easy.  B/c tile world editor.

      Hotkeys, I use CTRL+R in image above to signal replace tile action and I use "G" to Get the tile under mouse.
      Hotkeys are not saved to disk and thus are set to default between sessions.
      I might draw the world to pre-rendered surfaces and use them as multi-layer someday.  I do that in my AutoIt, DragonWarrior Remake but I could spend forever unsure what features are important for this.  The DW_Remake has a method of replacing a tile with a tile on two layers.  So you could replace a tree on the first layer with a grass, and a tree in the second layer.  This is all getting very confusing.
      I attempted to write the good code.  If something could be better, please advise.
      Fifth release.  Enjoy.
      For download, videos, and example of created world file data; please visit the MapIt webpage: http://songersoft.com/programming/mapit/mapit_about.phtml
      Special thanks: @AdmiralAlkex, @Melba23, @MrCreatoR
      Main AutoIt source file: Will not run without other Includes and SDL DLLs.
      Last Update: 5/26/2018 3:45 PM EST
      REMOVED CODE BLOCK:  I was informed the this page loaded very slowly, one solution so far has been to remove the 2k lines in the code block.
      When I recieve more feedback from the User I may reduce image size or remove images.
      Next Version Added: $eSETTING_TILE_LAST_PATH I have the weekend, I want to write world layers with aBoard surfaces.  
    • lenclstr746
      By lenclstr746
      HELLO GUYS
      I'm a work on a background see and click bot project 
      I can complete it if your help me
      (using imagesearch , gdi+ and  fastfind)
    • dadalt95
      By dadalt95
      I would like to know if it's possible to pass an image recognition (captcha) system.
       
      What are the ways to achieve this?
      Just the references or links is enough for me by now.
       
      Thanks by now!
       
      Thanks!
    • Bilgus
      By Bilgus
      Draw Path Points allows you to make line paths for drawing with gdi
      You can even load an image and trace the outline
      Save and load functionality undo and redo zoom and scale; Don't Forget Rotate!
      ;Draw Path Points BILGUS 2018 ;Includes #include <File.au3> #include <GDIPlus.au3> #include <GUIConstants.au3> #include <GuiEdit.au3> #include <GuiListView.au3> #include <GuiTab.au3> #include <Misc.au3> If OnAutoItExitRegister("_Exit") <> 0 Then _GDIPlus_Startup() ;initialize GDI+ ConsoleWrite("GDI+ Started" & @CRLF) EndIf Opt("MouseCoordMode", 2) ;Relative coords to the client area of the active window Opt("PixelCoordMode", 2) ;Relative coords to the client area of the active window Global $g_iXScale = 8 Global $g_iYScale = $g_iXScale Global $g_sFileSave = @ScriptDir & "\DrawPath.txt" ;Default Global $g_bClosePath = False Global $g_bShowImage = False Global $g_sImagefile = "" Global $g_iUndo_Max = 50 Global $g_asUndo_Files[1] = [""] Global $g_asRedo_Files[1] = [""] Global $g_aPath_Points[1][2] = [[0, 0]] Global $g_aPath_Rot_Points Global $g_hForm1 = GUICreate("Draw Path Points", 615, 437, 192, 124) Global $g_hSelSquare = GUICtrlCreateLabel("", 0, 0, 0, 0, $SS_BLACKFRAME, $WS_EX_TOPMOST) GUICtrlSetState(-1, $GUI_HIDE) ;------------------------------------------------------------------------------- Global Enum $eC1_delete, $eC1_del_all, $eC1_update, $eC1_shift_dn, $eC1_shift_up, _ $eC1_closepath, $eC1_showimg, $eC1_lock, $eC1_undo, $eC1_redo, $aCtl1_LAST Global $g_ahCtl1[$aCtl1_LAST] Control_Create_Group1() ;------------------------------------------------------------------------------- Global Enum $eC2_zin, $eC2_zout, $eC2_dgroup, $eC2_decx, $eC2_incx, $eC2_decy, _ $eC2_incy, $eC2_edit_rot, $eC2_rot, $eC2_ud_rot, $eC2_rev, $eC2_toall, $aCtl2_LAST Global $g_ahCtl2[$aCtl2_LAST] Control_Create_Group2() ;------------------------------------------------------------------------------- Global $g_hBtn_load = GUICtrlCreateButton("Load", 5, 1, 35, 20) Global $g_hBtn_save = GUICtrlCreateButton("Save", 40, 1, 35, 20) Global $g_hBtn_arr_disp = GUICtrlCreateButton("Array", 75, 1, 35, 20) Global $g_hEdit_encoded = GUICtrlCreateEdit("", 115, 2, 50, 18, $ES_READONLY + $ES_AUTOHSCROLL, $WS_EX_STATICEDGE + $WS_EX_TRANSPARENT) Global $g_hList1 = GUICtrlCreateListView("#|x|y", 5, 24, 161, 201, $LVS_SHOWSELALWAYS Or $LVS_SINGLESEL) Global $g_hList1_LVN = GUICtrlCreateDummy() ;listview notifications Global $g_hImage1 = GUICtrlCreatePic("", 200, 16, 400, 400, -1, $WS_EX_LAYERED) Global $g_hTab1 = GUICtrlCreateTab(1, 225, 20, 500, $TCS_VERTICAL) GUICtrlCreateTabItem(" ") GUICtrlSetState(-1, $GUI_SHOW) ; will be display first GUICtrlCreateTabItem(" ") GUICtrlCreateTabItem("") ; end tabitem definition For $i = 0 To UBound($g_ahCtl2) - 1 GUICtrlSetState($g_ahCtl2[$i], $GUI_HIDE) Next GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") List_Update() List_Index() GUISetState(@SW_SHOW) State_Save($g_aPath_Points) Points_Update($g_aPath_Points) Global $g_nMsg = 0 While 1 $g_nMsg = GUIGetMsg() If $g_nMsg > 0 And $g_nMsg <> $g_ahCtl2[$eC2_ud_rot] And $g_nMsg <> $g_ahCtl2[$eC2_edit_rot] And GUICtrlRead($g_ahCtl2[$eC2_edit_rot]) <> 0 Then ;ConsoleWrite("Cancel_Rotate? " & $g_nMsg & @CRLF) If MsgBox($MB_ICONQUESTION + $MB_OKCANCEL + $MB_DEFBUTTON2, "Save?", "Save Rotated Points?", 10) == $IDOK Then _GUICtrlEdit_SetText($g_ahCtl2[$eC2_edit_rot], "0") $g_aPath_Points = $g_aPath_Rot_Points State_Save($g_aPath_Points) List_Update(List_Index()) Else _GUICtrlEdit_SetText($g_ahCtl2[$eC2_edit_rot], "0") Points_Update($g_aPath_Points, $g_bClosePath, $g_bShowImage, List_Index()) ;, True) EndIf EndIf Switch $g_nMsg Case $GUI_EVENT_CLOSE Exit Case $g_hTab1 Tab1_Select() Case $g_hSelSquare ;ConsoleWrite("SelSquare" & @CRLF) SelSquare_Drag() Case $g_hList1 ;ConsoleWrite("List1 " & $g_nMsg & @CRLF) Local $iIndex = List_Index() If $iIndex <> -1 Then Points_Update($g_aPath_Points, $g_bClosePath, $g_bShowImage, $iIndex) _GUICtrlListView_SetItemSelected($g_hList1, $iIndex, True, True) EndIf Case $g_hList1_LVN Point_Selected($g_aPath_Points, $g_hImage1, List_Index()) Case $g_hList1_LVN Case $g_hImage1 Image1_Clicked() Case $g_hBtn_save Btn_save_Clicked() Case $g_hBtn_load Btn_load_Clicked() Case $g_hBtn_arr_disp _ArrayDisplay($g_aPath_Points) ;------------------------------------------------------------------- Case $g_ahCtl1[$eC1_shift_up] $iIndex = List_Index() Point_Swap($iIndex, -1) Points_Update($g_aPath_Points, $g_bClosePath, $g_bShowImage) Case $g_ahCtl1[$eC1_shift_dn] $iIndex = List_Index() Point_Swap($iIndex, 1) Points_Update($g_aPath_Points, $g_bClosePath, $g_bShowImage) Case $g_ahCtl1[$eC1_del_all] $g_aPath_Points = 0 Global $g_aPath_Points[1][2] = [[0, 0]] List_Update() Points_Update($g_aPath_Points, $g_bClosePath, $g_bShowImage) Case $g_ahCtl1[$eC1_delete] $iIndex = List_Index() Point_Delete($iIndex) _GUICtrlListView_ClickItem($g_hList1, $iIndex) Points_Update($g_aPath_Points, $g_bClosePath, $g_bShowImage) Case $g_ahCtl1[$eC1_redo] $g_aPath_Points = State_Restore($g_aPath_Points, False) List_Update() Points_Update($g_aPath_Points, $g_bClosePath, $g_bShowImage) Case $g_ahCtl1[$eC1_undo] $g_aPath_Points = State_Restore($g_aPath_Points, True) List_Update() Points_Update($g_aPath_Points, $g_bClosePath, $g_bShowImage) Case $g_ahCtl1[$eC1_update] List_Update(List_Index()) Points_Update($g_aPath_Points, $g_bClosePath, $g_bShowImage) Ascii_Points($g_aPath_Points) _GUICtrlEdit_SetSel($g_hEdit_encoded, 0, -1) Case $g_ahCtl1[$eC1_closepath] $g_bClosePath = Control_IsChecked($g_ahCtl1[$eC1_closepath]) List_Update(List_Index()) Points_Update($g_aPath_Points, $g_bClosePath, $g_bShowImage) If $g_bClosePath Then GUICtrlSetState($g_ahCtl2[$eC2_rev], $GUI_DISABLE) Else GUICtrlSetState($g_ahCtl2[$eC2_rev], $GUI_ENABLE) EndIf Case $g_ahCtl1[$eC1_showimg] If Not $g_bShowImage Then $g_sImagefile = FileOpenDialog("Select an image", SplitDir($g_sImagefile), "All Files(*.*)", 0, SplitFileName($g_sImagefile), $g_hForm1) EndIf $g_bShowImage = Control_IsChecked($g_ahCtl1[$eC1_showimg]) List_Update(List_Index()) Points_Update($g_aPath_Points, $g_bClosePath, $g_bShowImage) ;------------------------------------------------------------------- Case $g_ahCtl2[$eC2_zin] If Control_IsChecked($g_ahCtl2[$eC2_toall]) Then Points_Scale(1, 1) Else $g_iXScale += 1 $g_iYScale += 1 Points_Update($g_aPath_Points, $g_bClosePath, $g_bShowImage) EndIf _GUICtrlListView_ClickItem($g_hList1, List_Index()) Case $g_ahCtl2[$eC2_zout] If Control_IsChecked($g_ahCtl2[$eC2_toall]) Then Points_Scale(-1, -1) Else $g_iXScale -= 1 $g_iYScale -= 1 Points_Update($g_aPath_Points, $g_bClosePath, $g_bShowImage) EndIf _GUICtrlListView_ClickItem($g_hList1, List_Index()) Case $g_ahCtl2[$eC2_rev] $iIndex = List_Index() $g_aPath_Points = Points_Reverse($g_aPath_Points) Points_Update($g_aPath_Points, $g_bClosePath, $g_bShowImage, $iIndex) ;, True) List_Update($iIndex) Case $g_ahCtl2[$eC2_edit_rot] ;ConsoleWrite("Rotate" & @CRLF) $iIndex = List_Index() Local $iDegrees = GUICtrlRead($g_ahCtl2[$eC2_edit_rot]) $g_aPath_Rot_Points = Points_Rotate($g_aPath_Points, $iDegrees) Points_Update($g_aPath_Rot_Points, $g_bClosePath, $g_bShowImage, $iIndex) ;, True) Case $g_ahCtl2[$eC2_incx] Point_Adjust(1, 0, Control_IsChecked($g_ahCtl2[$eC2_toall])) Case $g_ahCtl2[$eC2_decx] Point_Adjust(-1, 0, Control_IsChecked($g_ahCtl2[$eC2_toall])) Case $g_ahCtl2[$eC2_incy] Point_Adjust(0, 1, Control_IsChecked($g_ahCtl2[$eC2_toall])) Case $g_ahCtl2[$eC2_decy] Point_Adjust(0, -1, Control_IsChecked($g_ahCtl2[$eC2_toall])) EndSwitch WEnd ;---------------------------------------------------------------------------------------------------- Func _Exit() _GDIPlus_Shutdown() ConsoleWrite("GDI+ Stopped" & @CRLF) State_Destroy() EndFunc ;==>_Exit Func Ascii_Points($aPts) ;encodes points into an ascii string Local Const $iChrOffset = 33 Local Const $iMaxOffset = 126 - $iChrOffset If Not IsArray($aPts) Then Return Local $sAscEnc = StringFormat("%03i%05i", $iChrOffset, UBound($aPts) * 2 + 8) If _ArrayMin($aPts) >= 0 And (_ArrayMax($aPts) - _ArrayMin($aPts)) <= $iMaxOffset Then For $i = 0 To UBound($aPts) - 1 $sAscEnc = $sAscEnc & Chr($aPts[$i][0] + $iChrOffset) & Chr($aPts[$i][1] + $iChrOffset) Next EndIf _GUICtrlEdit_SetText($g_hEdit_encoded, $sAscEnc) EndFunc ;==>Ascii_Points Func Btn_load_Clicked() ConsoleWrite("Load: " & SplitDir($g_sFileSave) & @CRLF) $g_sFileSave = FileOpenDialog("Select a save file", SplitDir($g_sFileSave), "All Files(*.*)", 0, SplitFileName($g_sFileSave), $g_hForm1) _FileReadToArray($g_sFileSave, $g_aPath_Points, 0, ",") If @error Then Dim $g_aPath_Points[1][2] = [[0, 0]] Else State_Destroy() State_Save($g_aPath_Points) EndIf List_Update() Points_Update($g_aPath_Points, $g_bClosePath, $g_bShowImage) EndFunc ;==>Btn_load_Clicked Func Btn_save_Clicked() List_Update(List_Index()) $g_sFileSave = FileOpenDialog("Select a save file", SplitDir($g_sFileSave), "All Files(*.*)", 0, SplitFileName($g_sFileSave), $g_hForm1) _FileWriteFromArray($g_sFileSave, $g_aPath_Points, 0, Default, ",") EndFunc ;==>Btn_save_Clicked Func Control_Create_Group1() Local $iX = 30 Local $iY = 225 $g_ahCtl1[$eC1_delete] = GUICtrlCreateButton("Delete", $iX + 0, $iY + 0, 50, 20) $g_ahCtl1[$eC1_shift_dn] = GUICtrlCreateButton("+", $iX + 70, $iY + 0, 20, 20) $g_ahCtl1[$eC1_shift_up] = GUICtrlCreateButton("-", $iX + 95, $iY + 0, 20, 20) $g_ahCtl1[$eC1_del_all] = GUICtrlCreateButton("Delete All", $iX + 0, $iY + 25, 50, 20) $g_ahCtl1[$eC1_update] = GUICtrlCreateButton("Update", $iX + 70, $iY + 25, 50, 20) $g_ahCtl1[$eC1_undo] = GUICtrlCreateButton("Undo", $iX + 0, $iY + 50, 50, 20) $g_ahCtl1[$eC1_redo] = GUICtrlCreateButton("Redo", $iX + 70, $iY + 50, 50, 20) GUICtrlSetState($g_ahCtl1[$eC1_undo], $GUI_DISABLE) GUICtrlSetState($g_ahCtl1[$eC1_redo], $GUI_DISABLE) $g_ahCtl1[$eC1_closepath] = GUICtrlCreateCheckbox("Complete", $iX + 0, $iY + 70, 65, 25) $g_ahCtl1[$eC1_showimg] = GUICtrlCreateCheckbox("Image", $iX + 0, $iY + 90, 65, 25) $g_ahCtl1[$eC1_lock] = GUICtrlCreateCheckbox("Locked", $iX + 0, $iY + 110, 65, 25) EndFunc ;==>Control_Create_Group1 Func Control_Create_Group2() Local $iX = 30 Local $iY = 225 $g_ahCtl2[$eC2_rev] = GUICtrlCreateButton("Reverse", $iX + 0, $iY + 0, 50, 20) $g_ahCtl2[$eC2_edit_rot] = GUICtrlCreateInput("0", $iX + 0, $iY + 25, 40, 20) $g_ahCtl2[$eC2_ud_rot] = GUICtrlCreateUpdown(-1) GUICtrlSetLimit($eC2_ud_rot, 360, -360) $g_ahCtl2[$eC2_rot] = GUICtrlCreateButton("", $iX + 40, $iY + 25, 10, 20) $g_ahCtl2[$eC2_dgroup] = GUICtrlCreateGroup("Coords", 5 + $iX + 70, $iY + 0, 55, 70) $g_ahCtl2[$eC2_decy] = GUICtrlCreateButton("-", 24 + $iX + 70, 16 + $iY + 0, 17, 17) $g_ahCtl2[$eC2_incy] = GUICtrlCreateButton("+", 24 + $iX + 70, 48 + $iY + 0, 17, 17) $g_ahCtl2[$eC2_decx] = GUICtrlCreateButton("-", 8 + $iX + 70, 32 + $iY + 0, 17, 17) $g_ahCtl2[$eC2_incx] = GUICtrlCreateButton("+", 40 + $iX + 70, 32 + $iY + 0, 17, 17) GUICtrlCreateGroup("", -99, -99, 1, 1) $g_ahCtl2[$eC2_zout] = GUICtrlCreateButton("Zoom -", $iX + 0, $iY + 75, 50, 20) $g_ahCtl2[$eC2_zin] = GUICtrlCreateButton("Zoom +", $iX + 75, $iY + 75, 50, 20) $g_ahCtl2[$eC2_toall] = GUICtrlCreateCheckbox("Apply to all", $iX + 0, $iY + 100, 80, 25) EndFunc ;==>Control_Create_Group2 Func Control_IsChecked($IdCtrl) Return (BitAND(GUICtrlRead($IdCtrl), $GUI_CHECKED) = $GUI_CHECKED) EndFunc ;==>Control_IsChecked Func GDI_Draw_ArrayPoints(ByRef $aPts, $hImage, $g_bClosePath, $iX, $iY, $sFileName, $iSelected = -1) Local $hWnd = GUICtrlGetHandle($hImage) If UBound($aPts) > 1 Then Local $aPoints = GDI_Points($aPts, $iX, $iY) Else Local $aPoints[1][2] = [[0, 0]] EndIf Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hWnd) ;create a graphics object from a window handle _GDIPlus_GraphicsClear($hGraphics, 0xFFFFFFFF) If FileExists($sFileName) Then Local $hBitmap = _GDIPlus_BitmapCreateFromFile($sFileName) Local Const $iWidth = ScaleX(_GDIPlus_ImageGetWidth($hBitmap)) Local Const $iHeight = ScaleY(_GDIPlus_ImageGetHeight($hBitmap)) Local $hBitmap_Scaled = _GDIPlus_ImageResize($hBitmap, $iWidth, $iHeight) ;resize image _GDIPlus_BitmapDispose($hBitmap) ;Done with initial bitmap _GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap_Scaled, 0, 0) _GDIPlus_BitmapDispose($hBitmap_Scaled) EndIf Local $hPen = _GDIPlus_PenCreate(0xFFFF0000, ScaleX(1)) Local $hEndCap = _GDIPlus_ArrowCapCreate(1, 1) _GDIPlus_PenSetCustomEndCap($hPen, $hEndCap) If $g_bClosePath Then _GDIPlus_GraphicsDrawPolygon($hGraphics, $aPoints, $hPen) Local $iX0, $iY0, $iX1, $iY1 For $i = 1 To $aPoints[0][0] If Not $g_bClosePath And $i < $aPoints[0][0] Then $iX0 = $aPoints[$i][0] $iY0 = $aPoints[$i][1] $iX1 = $aPoints[$i + 1][0] $iY1 = $aPoints[$i + 1][1] _GDIPlus_GraphicsDrawLine($hGraphics, $iX0, $iY0, $iX1, $iY1, $hPen) EndIf Next _GDIPlus_ArrowCapDispose($hEndCap) _GDIPlus_PenDispose($hPen) _GDIPlus_GraphicsDispose($hGraphics) Point_Selected($aPts, $hImage, $iSelected) EndFunc ;==>GDI_Draw_ArrayPoints Func GDI_Line_hPath_From_Points($aPts, $iXorig, $iYorig) ;Returns hpath object be sure to delete it when finished Local $hPath = _GDIPlus_PathCreate() ;Create new path object Local $aPoints = GDI_Points($aPts, $iXorig, $iYorig) Local $iX0, $iY0, $iX1, $iY1 If IsArray($aPoints) Then For $i = 1 To $aPoints[0][0] - 1 $iX0 = $aPoints[$i][0] $iY0 = $aPoints[$i][1] $iX1 = $aPoints[$i + 1][0] $iY1 = $aPoints[$i + 1][1] _GDIPlus_PathAddLine($hPath, $iX0, $iY0, $iX1, $iY1) Next EndIf Return $hPath ;_GDIPlus_PathDispose($hPath) EndFunc ;==>GDI_Line_hPath_From_Points Func GDI_Points($aPts, $iXo, $iYO) Local $aGDIPts If IsArray($aPts) And UBound($aPts) > 1 Then Local $aGDIPts[UBound($aPts) + 1][2] $aGDIPts[0][0] = UBound($aPts) For $i = 1 To $aGDIPts[0][0] ;Build points list $aGDIPts[$i][0] = ScaleX($aPts[$i - 1][0]) + $iXo $aGDIPts[$i][1] = ScaleY($aPts[$i - 1][1]) + $iYO Next Else Local $aGDIPts[1][2] = [[0, 0]] EndIf Return $aGDIPts EndFunc ;==>GDI_Points Func Image1_Clicked() If Not Control_IsChecked($g_ahCtl1[$eC1_lock]) Then Local $aCPos = ControlGetPos(GUICtrlGetHandle($g_hImage1), "", 0) Local $aPos = MouseGetPos() If IsArray($aPos) And IsArray($aCPos) Then Local $iXn = Int(($aPos[0] - $aCPos[0] + ScaleX(1) / 2) / ScaleX(1)) Local $iYn = Int(($aPos[1] - $aCPos[1] + ScaleY(1) / 2) / ScaleY(1)) Point_Add(List_Index(), $iXn, $iYn) EndIf Points_Update($g_aPath_Points, $g_bClosePath, $g_bShowImage) Else ToolTip("Locked") Sleep(500) ToolTip("") EndIf EndFunc ;==>Image1_Clicked Func List_Index() Static Local $hWndList1 = GUICtrlGetHandle($g_hList1) Local $iIndex = _GUICtrlListView_GetSelectionMark($hWndList1) If _GUICtrlListView_GetItemSelected($g_hList1, $iIndex) Then Return $iIndex Return -1 EndFunc ;==>List_Index Func List_Update($iIndex = -1) Static $hWnd_List1 = GUICtrlGetHandle($g_hList1) _GUICtrlListView_BeginUpdate($g_hList1) _GUICtrlListView_DeleteAllItems($hWnd_List1) For $i = 0 To UBound($g_aPath_Points) - 1 GUICtrlCreateListViewItem($i & "|" & $g_aPath_Points[$i][0] & "|" & $g_aPath_Points[$i][1], $g_hList1) Next If $iIndex > -1 Then _GUICtrlListView_ClickItem($g_hList1, $iIndex) _GUICtrlListView_EnsureVisible($g_hList1, $iIndex) EndIf _GUICtrlListView_EndUpdate($g_hList1) EndFunc ;==>List_Update Func Point_Add($iIndex, $iX, $iY) If $iIndex <> -1 Then _ArrayInsert($g_aPath_Points, $iIndex, $iX & "|" & $iY, 0) _GUICtrlListView_InsertItem($g_hList1, $iIndex, $iIndex) _GUICtrlListView_SetItemText($g_hList1, $iIndex, $iX, 1) _GUICtrlListView_SetItemText($g_hList1, $iIndex, $iY, 2) _GUICtrlListView_EnsureVisible($g_hList1, $iIndex) Else _ArrayAdd($g_aPath_Points, $iX & "|" & $iY, 0) GUICtrlCreateListViewItem(UBound($g_aPath_Points) - 1 & "|" & $iX & "|" & $iY, $g_hList1) _GUICtrlListView_EnsureVisible($g_hList1, UBound($g_aPath_Points) - 1) EndIf State_Save($g_aPath_Points) EndFunc ;==>Point_Add Func Point_Adjust($iX, $iY, $bToAll) If Not $bToAll Then Local $iIndex = List_Index() If $iIndex == -1 And IsArray($g_aPath_Points) Then $iIndex = UBound($g_aPath_Points) - 1 If $iIndex == -1 Then Return $g_aPath_Points[$iIndex][0] += $iX $g_aPath_Points[$iIndex][1] += $iY _GUICtrlListView_SetItemText($g_hList1, $iIndex, $g_aPath_Points[$iIndex][0], 1) _GUICtrlListView_SetItemText($g_hList1, $iIndex, $g_aPath_Points[$iIndex][1], 2) If $iIndex <> UBound($g_aPath_Points) - 1 Then _GUICtrlListView_ClickItem($g_hList1, $iIndex) Else For $i = 0 To UBound($g_aPath_Points) - 1 $g_aPath_Points[$i][0] += $iX $g_aPath_Points[$i][1] += $iY Next List_Update(List_Index()) EndIf State_Save($g_aPath_Points) Points_Update($g_aPath_Points, $g_bClosePath, $g_bShowImage) EndFunc ;==>Point_Adjust Func Point_Delete($iIndex) If $iIndex <> -1 Then _ArrayDelete($g_aPath_Points, $iIndex) _GUICtrlListView_DeleteItem($g_hList1, $iIndex) State_Save($g_aPath_Points) ;List_Update($iIndex) EndIf EndFunc ;==>Point_Delete Func Point_Modify($iIndex, $iX, $iY) If $iIndex <> -1 Then $g_aPath_Points[$iIndex][0] = $iX $g_aPath_Points[$iIndex][1] = $iY _GUICtrlListView_SetItemText($g_hList1, $iIndex, $iX, 1) _GUICtrlListView_SetItemText($g_hList1, $iIndex, $iY, 2) _GUICtrlListView_EnsureVisible($g_hList1, $iIndex) State_Save($g_aPath_Points) EndIf EndFunc ;==>Point_Modify Func Point_Selected($aPts, $hImage, $iIndex) If $iIndex > -1 Then GUICtrlSetState($g_hSelSquare, $GUI_HIDE) Local $hWnd = GUICtrlGetHandle($hImage) Local $aPos = ControlGetPos($hWnd, "", 0) If IsArray($aPos) And IsArray($aPts) Then _WinAPI_RedrawWindow($hWnd, Default, Default, $RDW_ERASENOW) Local $iXs = ScaleX($aPts[$iIndex][0]) + $aPos[0] - ScaleX(1) / 2 Local $iYs = ScaleY($aPts[$iIndex][1]) + $aPos[1] - ScaleY(1) / 2 WinMove(GUICtrlGetHandle($g_hSelSquare), "", $iXs, $iYs, ScaleX(1), ScaleY(1)) GUICtrlSetState($g_hSelSquare, $GUI_SHOW) ;ConsoleWrite("Point_Selected" & @CRLF) Else ConsoleWriteError("Error: Point_Selected" & @CRLF) EndIf EndIf EndFunc ;==>Point_Selected Func Point_Swap($iIndex1, $iNext) _GUICtrlListView_BeginUpdate($g_hList1) Local $iIndex2 = 0 Local $aTmp = 0 If $iIndex1 <> -1 Then $iIndex2 = $iIndex1 + $iNext If $iIndex2 > UBound($g_aPath_Points) - 1 Then $iIndex2 = 0 ElseIf $iIndex2 < 0 Then $iIndex2 = UBound($g_aPath_Points) - 1 EndIf _ArraySwap($g_aPath_Points, $iIndex1, $iIndex2) Local $iX1 = _GUICtrlListView_GetItemText($g_hList1, $iIndex1, 2) Local $iY1 = _GUICtrlListView_GetItemText($g_hList1, $iIndex1, 2) Local $iX2 = _GUICtrlListView_GetItemText($g_hList1, $iIndex2, 2) Local $iY2 = _GUICtrlListView_GetItemText($g_hList1, $iIndex2, 2) _GUICtrlListView_SetItemText($g_hList1, $iIndex1, $iX2, 1) _GUICtrlListView_SetItemText($g_hList1, $iIndex1, $iY2, 2) _GUICtrlListView_SetItemText($g_hList1, $iIndex2, $iX1, 1) _GUICtrlListView_SetItemText($g_hList1, $iIndex2, $iY1, 2) _GUICtrlListView_ClickItem($g_hList1, $iIndex2) _GUICtrlListView_EnsureVisible($g_hList1, $iIndex2) Else ;ConsoleWrite("Array Shift" & @CRLF) If $iNext > 0 Then ;ARRAY SHIFT -- Melba23 Local $iUBound = UBound($g_aPath_Points) ; Get size of array $aTmp = _ArrayExtract($g_aPath_Points, 0, $iUBound - 2) ; Extract all but last _ArrayInsert($aTmp, 0, _ArrayExtract($g_aPath_Points, $iUBound - 1, Default)) ; Insert last at top $g_aPath_Points = $aTmp Else $aTmp = _ArrayExtract($g_aPath_Points, 1, Default) ; Extract all but top row _ArrayAdd($aTmp, _ArrayExtract($g_aPath_Points, 0, 0)) ; Add top row at bottom $g_aPath_Points = $aTmp EndIf List_Update(List_Index()) Points_Update($g_aPath_Points, $g_bClosePath, $g_bShowImage) EndIf State_Save($g_aPath_Points) _GUICtrlListView_EndUpdate($g_hList1) EndFunc ;==>Point_Swap Func Points_Reverse($aPts) Local $hPath = GDI_Line_hPath_From_Points($aPts, 0, 0) ;_GDIPlus_PathFlatten($hPath) _GDIPlus_PathReverse($hPath) Local $aPoints = _GDIPlus_PathGetPoints($hPath) _GDIPlus_PathDispose($hPath) If IsArray($aPoints) Then ;ConsoleWrite("Flipped_Points" & @CRLF) Global $aPts_Rev[$aPoints[0][0]][2] For $i = 1 To $aPoints[0][0] $aPts_Rev[$i - 1][0] = Int($aPoints[$i][0] / ScaleX(1)) $aPts_Rev[$i - 1][1] = Int($aPoints[$i][1] / ScaleY(1)) Next Return $aPts_Rev Else Return $aPts EndIf EndFunc ;==>Points_Reverse Func Points_Rotate($aPts, $iDegrees) Local $hPath = GDI_Line_hPath_From_Points($aPts, 0, 0) ;_GDIPlus_PathFlatten($hPath) Local $hPen = _GDIPlus_PenCreate(0x0, ScaleX(1)) Local $aBounds = _GDIPlus_PathGetWorldBounds($hPath, 0, $hPen) _GDIPlus_PenDispose($hPen) If IsArray($aBounds) Then Local $hMatrix = _GDIPlus_MatrixCreate() _GDIPlus_MatrixTranslate($hMatrix, $aBounds[0] + $aBounds[2] / 2, $aBounds[1] + $aBounds[3] / 2) _GDIPlus_MatrixRotate($hMatrix, $iDegrees) _GDIPlus_MatrixTranslate($hMatrix, -($aBounds[0] + $aBounds[2] / 2), -($aBounds[1] + $aBounds[3] / 2)) _GDIPlus_PathTransform($hPath, $hMatrix) _GDIPlus_MatrixDispose($hMatrix) EndIf Local $aPoints = _GDIPlus_PathGetPoints($hPath) _GDIPlus_PathDispose($hPath) If IsArray($aPoints) Then ;ConsoleWrite("Rotate_Points" & @CRLF) Dim $aPts_Rev[$aPoints[0][0]][2] For $i = 1 To $aPoints[0][0] $aPts_Rev[$i - 1][0] = Int($aPoints[$i][0] / ScaleX(1)) $aPts_Rev[$i - 1][1] = Int($aPoints[$i][1] / ScaleY(1)) Next Return $aPts_Rev Else Return $aPts EndIf EndFunc ;==>Points_Rotate Func Points_Scale($iScaleX, $iScaleY) For $i = 0 To UBound($g_aPath_Points) - 1 If $iScaleX > 0 Then $g_aPath_Points[$i][0] *= 2 Else $g_aPath_Points[$i][0] /= 2 EndIf If $iScaleY > 0 Then $g_aPath_Points[$i][1] *= 2 Else $g_aPath_Points[$i][1] /= 2 EndIf Next State_Save($g_aPath_Points) List_Update(List_Index()) Points_Update($g_aPath_Points, $g_bClosePath, $g_bShowImage) EndFunc ;==>Points_Scale Func Points_Update($aPts, $g_bClosePath = False, $b_Show_Image = True, $iSelected = -1) Local $_Image_File = $g_sImagefile If Not $b_Show_Image Then $_Image_File = "" GDI_Draw_ArrayPoints($aPts, $g_hImage1, $g_bClosePath, 0, 0, $_Image_File, $iSelected) EndFunc ;==>Points_Update Func ScaleX($iX) Local $iXs = $g_iXScale If $iXs == 0 Then $iXs = -1 If $iXs > 0 Then $iX = $iX * $iXs Else $iX = $iX / Abs($iXs) EndIf Return $iX EndFunc ;==>ScaleX Func ScaleY($iY) Local $iYs = $g_iYScale If $iYs == 0 Then $iYs = -1 If $iYs > 0 Then $iY = $iY * $iYs Else $iY = $iY / Abs($iYs) EndIf Return $iY EndFunc ;==>ScaleY Func SelSquare_Drag() Local $iIndex = List_Index() If $iIndex <> -1 Then Local $cInfo = GUIGetCursorInfo($g_hForm1) Local $aPosSelOrig = ControlGetPos($g_hForm1, "", $g_hSelSquare) If IsArray($aPosSelOrig) Then Local $iSubtractX = $cInfo[0] - $aPosSelOrig[0] Local $iSubtractY = $cInfo[1] - $aPosSelOrig[1] EndIf If IsArray($cInfo) Then Do $cInfo = GUIGetCursorInfo($g_hForm1) ControlMove($g_hForm1, "", $g_hSelSquare, $cInfo[0] - $iSubtractX, $cInfo[1] - $iSubtractY) Until Not $cInfo[2] EndIf Local $aPosSelNew = ControlGetPos($g_hForm1, "", $g_hSelSquare) If IsArray($aPosSelNew) And IsArray($aPosSelOrig) Then Local $iXm = $g_aPath_Points[$iIndex][0] + Int(($aPosSelNew[0] - $aPosSelOrig[0]) / ScaleX(1)) Local $iYm = $g_aPath_Points[$iIndex][1] + Int(($aPosSelNew[1] - $aPosSelOrig[1]) / ScaleY(1)) Point_Modify($iIndex, $iXm, $iYm) Points_Update($g_aPath_Points, $g_bClosePath, $g_bShowImage, $iIndex) EndIf EndIf EndFunc ;==>SelSquare_Drag Func SplitDir($FullPath) Local $sDrive, $sDir, $sDummy _PathSplit($FullPath, $sDrive, $sDir, $sDummy, $sDummy) Return $sDrive & $sDir EndFunc ;==>SplitDir Func SplitFileName($FullPath) Local $sDummy, $sFileName, $sExt _PathSplit($FullPath, $sDummy, $sDummy, $sFileName, $sExt) Return $sFileName & "" & $sExt EndFunc ;==>SplitFileName Func State_Cleanup(ByRef $a1) If (UBound($a1) > $g_iUndo_Max + 2) Then Local $a1Rem = _ArrayExtract($a1, 1, Default) $a1Rem[0] = $a1[0] Local $sTmp = $a1[1] If $sTmp <> "" And FileExists($sTmp) Then FileDelete($sTmp) ;ConsoleWrite("Cleanup Delete (UnD) " & $sTmp & @CRLF) EndIf $a1 = $a1Rem EndIf EndFunc ;==>State_Cleanup Func State_Destroy($bRedo_Only = False) Local $sTmp While (UBound($g_asRedo_Files) > 1) $sTmp = _ArrayPop($g_asRedo_Files) If $sTmp <> "" And FileExists($sTmp) Then FileDelete($sTmp) ;ConsoleWrite(", Delete (ReD) " & $sTmp) If @error Then ConsoleWriteError("Failed to Delete " & $sTmp) EndIf WEnd GUICtrlSetState($g_ahCtl1[$eC1_redo], $GUI_DISABLE) If $bRedo_Only Then Return While (UBound($g_asUndo_Files) > 1) $sTmp = _ArrayPop($g_asUndo_Files) If $sTmp <> "" And FileExists($sTmp) Then FileDelete($sTmp) ;ConsoleWrite(", Delete (UnD)" & $sTmp) If @error Then ConsoleWriteError("Failed to Delete " & $sTmp) EndIf WEnd GUICtrlSetState($g_ahCtl1[$eC1_undo], $GUI_DISABLE) EndFunc ;==>State_Destroy Func State_Is_Diff(ByRef $a1, ByRef $a2) Local $bIsDiff = True If UBound($a1) = UBound($a2) Then $bIsDiff = False For $i = UBound($a1) - 1 To 0 Step -1 If $a1[$i][0] == $a2[$i][0] And $a1[$i][1] == $a2[$i][1] Then ContinueLoop Else ;ConsoleWrite("Diff " & $i & @CRLF) $bIsDiff = True ExitLoop EndIf Next Else ;ConsoleWrite("Diff " & @CRLF) EndIf Return $bIsDiff EndFunc ;==>State_Is_Diff Func State_Restore(ByRef $aPts, $bUndo) Local $sTmp = "" Local $aRes If $bUndo Then $sTmp = _ArrayPop($g_asUndo_Files) ;ConsoleWrite(", Restore (UnD)" & $sTmp) If $sTmp <> "" And FileExists($sTmp) Then _ArrayAdd($g_asRedo_Files, $sTmp) _FileReadToArray($sTmp, $aRes, 0, ",") If UBound($g_asUndo_Files) < 2 Then GUICtrlSetState($g_ahCtl1[$eC1_undo], $GUI_DISABLE) If UBound($g_asRedo_Files) > 2 Then GUICtrlSetState($g_ahCtl1[$eC1_redo], $GUI_ENABLE) If UBound($g_asUndo_Files) > 1 And Not State_Is_Diff($aPts, $aRes) Then Return State_Restore($aPts, $bUndo) If Not @error Then Return $aRes Else ConsoleWriteError("Failed to Restore " & $sTmp) EndIf Else $sTmp = _ArrayPop($g_asRedo_Files) ;ConsoleWrite(", Restore (ReD) " & $sTmp) If $sTmp <> "" And FileExists($sTmp) Then _ArrayAdd($g_asUndo_Files, $sTmp) _FileReadToArray($sTmp, $aRes, 0, ",") If UBound($g_asRedo_Files) < 2 Then GUICtrlSetState($g_ahCtl1[$eC1_redo], $GUI_DISABLE) If UBound($g_asUndo_Files) > 2 Then GUICtrlSetState($g_ahCtl1[$eC1_undo], $GUI_ENABLE) If UBound($g_asRedo_Files) > 1 And Not State_Is_Diff($aPts, $aRes) Then Return State_Restore($aPts, $bUndo) If Not @error Then Return $aRes Else ConsoleWriteError("Failed to Restore " & $sTmp) EndIf EndIf Return $aPts EndFunc ;==>State_Restore Func State_Save($aPts) If $g_iUndo_Max < 1 Then Return Local $sTmp = _TempFile(@TempDir, "DPP_") If UBound($g_asRedo_Files) > 2 Then _ArrayAdd($g_asUndo_Files, _ArrayPop($g_asRedo_Files)) _ArrayAdd($g_asUndo_Files, $sTmp) _FileWriteFromArray($sTmp, $aPts, 0, Default, ",") If UBound($g_asRedo_Files) > 2 Then State_Destroy(True) State_Cleanup($g_asUndo_Files) ;ConsoleWrite("Save State " & UBound($g_asUndo_Files) & " " & $sTmp & @CRLF) If UBound($g_asUndo_Files) > 2 Then GUICtrlSetState($g_ahCtl1[$eC1_undo], $GUI_ENABLE) If @error Then MsgBox(0, @ScriptName & " Error", "Unable to create undo file " & $sTmp) GUICtrlSetState($g_ahCtl1[$eC1_undo], $GUI_DISABLE) GUICtrlSetState($g_ahCtl1[$eC1_redo], $GUI_DISABLE) $g_iUndo_Max = 0 EndIf EndFunc ;==>State_Save Func Tab1_Select() Local $iStateCtl1, $iStateCtl2 Local $tabindex = GUICtrlRead($g_hTab1) ;ConsoleWrite("tab" & $tabindex + 1 & "_selected" & @CRLF) Select Case $tabindex = 0 $iStateCtl1 = $GUI_SHOW $iStateCtl2 = $GUI_HIDE Case $tabindex = 1 $iStateCtl1 = $GUI_HIDE $iStateCtl2 = $GUI_SHOW Case Else _GUICtrlTab_ActivateTab($g_hTab1, 0) Return EndSelect For $i = 0 To UBound($g_ahCtl1) - 1 GUICtrlSetState($g_ahCtl1[$i], $iStateCtl1) Next For $i = 0 To UBound($g_ahCtl2) - 1 GUICtrlSetState($g_ahCtl2[$i], $iStateCtl2) Next EndFunc ;==>Tab1_Select Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam) Static Local $hWndList1 = GUICtrlGetHandle($g_hList1) If Not IsHWnd($hWndList1) Then $hWndList1 = GUICtrlGetHandle($g_hList1) If @error Then Return $GUI_RUNDEFMSG If $wParam = $g_hList1 Then Local $tNMHDR = DllStructCreate($tagNMHDR, $lParam) Switch DllStructGetData($tNMHDR, "Code") Case $LVN_KEYDOWN, $NM_CLICK GUICtrlSendToDummy($g_hList1_LVN, $lParam) EndSwitch EndIf Return $GUI_RUNDEFMSG EndFunc ;==>WM_NOTIFY  


      DrawPathPoints.au3
    • fenhanxue
      By fenhanxue
      i want to copy a picture file to clipboard, so that i can paste the picture through ctrl+V
      this is my code ,but it dosen't work :
      #AutoIt3Wrapper_UseX64 = n #Include <Clipboard.au3> #include <GDIPlus.au3> _GDIPlus_Startup() $hClipboard_Bitmap = _GDIPlus_BitmapCreateFromFile('C:\1.jpg') _ClipBoard_Open(0) _ClipBoard_SetDataEx($hClipboard_Bitmap,$CF_BITMAP) _ClipBoard_Close() _GDIPlus_Shutdown() can you help me
×