jvds Posted March 31, 2019 Share Posted March 31, 2019 (edited) i'm trying to get my head around how to compare 2 images and draw the changing pixels, like the german guys did with the desktostream script that used assembler, i actually butchered that script to try to understand it, on a pc with a cctv card i played footage back and streamed the cctv pc's dekstop to my pc, it was not bad at all, however the infrared stream that is gray-scale did stream extremely fast and streamed image is very small i'm trying to see if i can do the same, with _WinAPI_BitBlt instead of using the desktostream, and also doing something like getting the image down to 8 or 4 bits and stream that , since it seems to me assembler for desktostrem only can stream 32 bits? the assembler one is probably faster but i want to see if i can achieve it with _WinAPI_BitBlt i tried $SRCINVERT i get the changed pixels but the pixels that where on black are their original color and pixels that where on other colors are inverted color or the other way arround so i suppose i have to take in to account the black pixels and non black pixels and work separately with them, actually i have a logical knot in my brain now i don't know how to proceed 🤣 expandcollapse popup#include <GUIConstantsEx.au3> #include <ScreenCapture.au3> #include <WindowsConstants.au3> AutoItSetOption("GUIOnEventMode", 1) $ColorDepth = 32 $secondaryBitmap = 32 $Width = @DesktopWidth / 2 $Height = @DesktopHeight / 2 $Form = GUICreate("GUI", $Width, $Height, -1, -1, $WS_MINIMIZEBOX+ $WS_CAPTION+ $WS_POPUP+ $WS_SYSMENU+$WS_SIZEBOX) $Pic = GUICtrlCreatePic("", 0, 0, 255, 255) GUICtrlSetResizing($Pic, $GUI_DOCKLEFT+$GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKBOTTOM) GUISetState(@SW_SHOW) Local $hWnd = _WinAPI_GetDesktopWindow() Local $hDDC = _WinAPI_GetDC($hWnd) Local $Bmp1_DibHandle Local $Bmp1_DibHandleObj Local $Bmp1_ptr Local $Bmp1_Buffer = _CreateNewDIB_Bitmap(@DesktopWidth, @DesktopHeight,$ColorDepth,$Bmp1_ptr,$Bmp1_DibHandle,$Bmp1_DibHandleObj) _WinAPI_SetStretchBltMode($Bmp1_Buffer, $COLORONCOLOR) Local $Bmp2_DibHandle Local $Bmp2_DibHandleObj Local $Bmp2_ptr Local $Bmp2_Buffer = _CreateNewDIB_Bitmap($Width, $Height,$secondaryBitmap,$Bmp2_ptr,$Bmp2_DibHandle,$Bmp2_DibHandleObj) ;~ Local $Bmp2_Buffer = _CreateNewDIB_Bitmap($Width, $Height,32,$Bmp2_ptr,$Bmp2_DibHandle,$Bmp2_DibHandleObj) ;~ _WinAPI_SetStretchBltMode($Bmp2_Buffer, $BLACKONWHITE) ;~ _WinAPI_SetStretchBltMode($Bmp2_Buffer, $COLORONCOLOR) _WinAPI_SetStretchBltMode($Bmp2_Buffer, $HALFTONE) ;~ _WinAPI_SetStretchBltMode($Bmp2_Buffer, $WHITEONBLACK) Local $Bmp3_DibHandle Local $Bmp3_DibHandleObj Local $Bmp3_ptr Local $Bmp3_Buffer = _CreateNewDIB_Bitmap($Width, $Height,$secondaryBitmap,$Bmp3_ptr,$Bmp3_DibHandle,$Bmp3_DibHandleObj) ;~ Local $Bmp2_Buffer = _CreateNewDIB_Bitmap($Width, $Height,32,$Bmp2_ptr,$Bmp2_DibHandle,$Bmp2_DibHandleObj) Local $Bmp4_DibHandle Local $Bmp4_DibHandleObj Local $Bmp4_ptr Local $Bmp4_Buffer = _CreateNewDIB_Bitmap($Width, $Height,$secondaryBitmap,$Bmp4_ptr,$Bmp4_DibHandle,$Bmp4_DibHandleObj) ;~ Local $Bmp2_Buffer = _CreateNewDIB_Bitmap($Width, $Height,32,$Bmp2_ptr,$Bmp2_DibHandle,$Bmp2_DibHandleObj) Local $Bmp5_DibHandle Local $Bmp5_DibHandleObj Local $Bmp5_ptr Local $Bmp5_Buffer = _CreateNewDIB_Bitmap($Width, $Height,$secondaryBitmap,$Bmp5_ptr,$Bmp5_DibHandle,$Bmp5_DibHandleObj) ;~ Local $Bmp2_Buffer = _CreateNewDIB_Bitmap($Width, $Height,32,$Bmp2_ptr,$Bmp2_DibHandle,$Bmp2_DibHandleObj) local $Bmp_BufferOut $Switch=true GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit") $hCtrl = GUICtrlGetHandle($Pic) $hGUI_DC = _WinAPI_GetDC($hCtrl) $test=0 While 1 $Timer = TimerInit() _WinAPI_BitBlt($Bmp3_Buffer, 0, 0, $Width, $Height, $Bmp2_Buffer, 0, 0, $SRCCOPY) ;~ _WinAPI_BitBlt($Bmp1_Buffer, 0, 0, @DesktopWidth, @DesktopHeight, $hDDC, @DesktopWidth, 0, $SRCCOPY) _WinAPI_BitBlt($Bmp1_Buffer, 0, 0, @DesktopWidth, @DesktopHeight, $hDDC, 0, 0, $SRCCOPY) _WinAPI_StretchBlt($Bmp2_Buffer, 0, 0, $Width, $Height, $Bmp1_Buffer, 0, 0, @DesktopWidth, @DesktopHeight, $SRCCOPY) _WinAPI_BitBlt($Bmp3_Buffer, 0, 0, $Width, $Height, $Bmp2_Buffer, 0, 0, $SRCINVERT) _WinAPI_BitBlt($hGUI_DC, 0, 0, $Width, $Height, $Bmp3_Buffer, 0, 0,$SRCCOPY ) ;~ SLEEP(1000) ;~ _WinAPI_BitBlt($Bmp4_Buffer, 0, 0, $Width, $Height, $Bmp3_Buffer, 0, 0, $NOTSRCCOPY) ;~ _WinAPI_BitBlt($hGUI_DC, 0, 0, $Width, $Height, $Bmp4_Buffer, 0, 0,$SRCCOPY ) ;~ SLEEP(2000) ;~ $test+=1 ;~ if $test=50 Then ;~ $filename = @ScriptDir & "\Complete Image .jpg" ;~ _ScreenCapture_SaveImage($filename, $Bmp2_DibHandle) ;~ $filename = @ScriptDir & "\black with changed pixels Image .jpg" ;~ _ScreenCapture_SaveImage($filename, $Bmp3_DibHandle) ;~ Exit ;~ EndIf WEnd Func _CreateNewDIB_Bitmap($Width, $Height,$BitCount, ByRef $ptrbmp, ByRef $DibHandle, ByRef $DibHandle_Obj) Local $tBITMAPINFO = DllStructCreate("dword Size; long Width; long Height; word Planes; word BitCount; dword Compression; dword SizeImage; long XPelsPerMeter; long YPelsPerMeter; dword ClrUsed; dword ClrImportant; dword RGBQuad[256];") DllStructSetData($tBITMAPINFO, 'Size', 40) DllStructSetData($tBITMAPINFO, 'Width', $Width) DllStructSetData($tBITMAPINFO, 'Height', -$Height) DllStructSetData($tBITMAPINFO, 'Planes', 1) DllStructSetData($tBITMAPINFO, 'BitCount', $BitCount) Local $iColorCnt = BitShift(1, -$BitCount) DllStructSetData($tBITMAPINFO, 'ClrUsed', $iColorCnt) DllStructSetData($tBITMAPINFO, 'ClrImportant', $iColorCnt) Switch $BitCount Case 1 DllStructSetData($tBITMAPINFO, 'RGBQuad', BitOR(BitShift(0xFF, -16), BitShift(0xFF, -8), 0xFF), 2) Case 4 Local $aCol[16] = [8, 24, 38, 56, 72, 88, 104, 120, 136, 152, 168, 184, 210, 216, 232, 248] For $i = 0 To 15 DllStructSetData($tBITMAPINFO, 'RGBQuad', BitOR(BitShift($aCol[$i], -16), BitShift($aCol[$i], -8), $aCol[$i]), $i + 1) Next ;~ Case 4 ;~ Local $aCol[16] = [16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 216, 232, 248] ;~ For $i = 0 To 15 ;~ DllStructSetData($tBITMAPINFO, 'RGBQuad', BitOR(BitShift($aCol[$i], -16), BitShift($aCol[$i], -8), $aCol[$i]), $i + 1) ;~ Next ;~ Case 8 ;~ ; Windows reserves first color for white, ;~ DllStructSetData($tBITMAPINFO, 'RGBQuad', 255, 1) ;~ ; and last color as black! ;~ DllStructSetData($tBITMAPINFO, 'RGBQuad', 0, 255) ;~ Local $iColor = 10 ;~ For $i = 20 To $iColorCnt - 22 ;first 20 and last 20 are reserved! ;~ DllStructSetData($tBITMAPINFO, 'RGBQuad', BitOR(BitShift($i, -16), BitShift($i, -8), $i*$iColor), $i + 1) ;~ Next Case 8 ; Windows reserves first color for white, $tBITMAPINFO.RGBQuad((0)) = 0xFFFFFF ; and last color as black! $tBITMAPINFO.RGBQuad((0xFF)) = 0x000000 Local $iColor = 20, $iRed, $iGreen, $iBlue For $iRed = 0 To 255 Step 51 For $iGreen = 0 To 255 Step 51 For $iBlue = 0 To 255 Step 51 $tBITMAPINFO.RGBQuad(($iColor)) = BitShift($iRed, -16) + BitShift($iGreen, -8) + $iBlue $iColor += 1 Next Next Next EndSwitch Local $hDCbuffer = _WinAPI_CreateCompatibleDC(0) $DibHandle = _WinAPI_CreateDIBSection(0, $tBITMAPINFO, $DIB_RGB_COLORS, $ptrbmp) ;~ $DibHandle = _WinAPI_CreateDIBSection(0, $tBMI, $DIB_RGB_COLORS, $ptrbmp) $DibHandle_Obj=_WinAPI_SelectObject($hDCbuffer, $DibHandle) Return $hDCbuffer EndFunc ;==>_CreateNewDIB_Bitmap Func _Exit() _WinAPI_ReleaseDC($hWnd, $hDDC) GUIDelete() Exit EndFunc ;==>_Exit ;~ Func _DeleteBitmap32($DC, $ptr, $hbmp) ;~ $ptr = 0 ;~ EndFunc with my script you see i also get a double image Edited March 31, 2019 by jvds image Link to comment Share on other sites More sharing options...
user4157124 Posted March 31, 2019 Share Posted March 31, 2019 Example here: https://www.autoitscript.com/forum/topic/158744-image-compare-99-identical/?do=findComment&comment=1152192 Replace $MERGEPAINT by $SRCINVERT . AUERLO (AutoIt error logger) Link to comment Share on other sites More sharing options...
jvds Posted March 31, 2019 Author Share Posted March 31, 2019 if i use that script i get the same result, a double image, now after i was away from computer a while i was thinking about what can be done, what this script and the example one of uez does is inverting the newer image on to the older one with $SRCINVERT, the result is all unchanged pixels are black, (good so far),the problem is all pixels changed from black to color are their true color, and all pixels that there on other colors and changed colors are inverted color, so the image have a mix of inverted and not inverted colors + the old image blent in to the new (old colors vs new ones)making it apear a double image what can probably work is take an image(First Image), taking another image,fiew secs later (Second Image), invert the images on each other to get the black pixels + mixed color pixels,(third image), take all colors on third image exept black, and blank them out, make it tansparent?,then overlay the image with only black pixels over the second image and there i have all the changed pixels black, that will work i suppose, but now that i think about it, that will give me problems with black later on, when i stream the image to a client and try to draw the image on the previously recieved one. will try it anyway to do that not sure how to make all colors but black transparent, any tips? dont know it its the right path either moded desk to stream script achieves exaxly what i need to achieve with _WinAPI_BitBlt Link to comment Share on other sites More sharing options...
junkew Posted March 31, 2019 Share Posted March 31, 2019 Not sure if it will help you in your goal FAQ 31 How to click some elements, FAQ 40 Test automation with AutoIt, Multithreading CLR .NET Powershell CMDLets Link to comment Share on other sites More sharing options...
jvds Posted April 1, 2019 Author Share Posted April 1, 2019 ok so playing arround with one of the scripts found on the forum i figured out what i need to do, first $SRCINVERT my old and new images so I get image a.bmp open a.bmp in paint, repace black with white and save it as b.bmp $MERGEPAINT a.bmp and b.bmp, i get Resul which is the black mask then $SRCAND the newer newer image with the black mask, and i get the changed pixels in full color only problems is how do i fill in replacing black with white with _WinAPI_BitBlt or another fast functions?? the step with a.bmp and b.bmp was done manualy Link to comment Share on other sites More sharing options...
UEZ Posted April 1, 2019 Share Posted April 1, 2019 (edited) I've written a DLL which compares two GDI+ images and saves the differences in a new bitmap. Maybe it's useful for you. expandcollapse popup;Coded by UEZ #AutoIt3Wrapper_UseX64=n #include <GDIPlus.au3> #include <GUIConstantsEx.au3> Global $sDLL = @ScriptDir & "\_GDIPlus_BitmapCompare" $sDLL &= @AutoItX64 ? "_x64.dll" : ".dll" If @AutoItX64 Then If Not FileExists($sDLL) Then __GDIPlus_BitmapCompareX64DLL(True) Else If Not FileExists($sDLL) Then __GDIPlus_BitmapCompareDLL(True) EndIf _GDIPlus_Startup() Global $hImgA = _GDIPlus_ImageLoadFromFile("c:\Temp\A.png"), _ $hImgB = _GDIPlus_ImageLoadFromFile("c:\Temp\B.png") Global $iDiffCnt Global $fTimer = TimerInit() Global $hImgDiff = _GDIPlus_BitmapCompare($hImgA, $hImgB, $iDiffCnt) Global $fEnd = TimerDiff($fTimer) If $hImgDiff Then Global $aDim = _GDIPlus_ImageGetDimension($hImgA) Global Const $hGUI = GUICreate("Image Diff", $aDim[0], $aDim[1]) GUISetState() Global Const $hGfx = _GDIPlus_GraphicsCreateFromHWND($hGUI) _GDIPlus_GraphicsDrawImageRect($hGfx, $hImgDiff, 0, 0, $aDim[0], $aDim[1]) MsgBox($MB_ICONINFORMATION, "Information", "Image comapared in " & $fEnd & " ms. Found " & $iDiffCnt & " differences.", 60) Do Until GUIGetMsg() = $GUI_EVENT_CLOSE _GDIPlus_ImageDispose($hImgDiff) _GDIPlus_GraphicsDispose($hGfx) Else MsgBox($MB_ICONERROR, "Error", "Images does not have same size or are not supported by GDI+", 30) EndIf _GDIPlus_ImageDispose($hImgA) _GDIPlus_ImageDispose($hImgB) _GDIPlus_Shutdown() ; #FUNCTION# ==================================================================================================================== ; Name ..........: _GDIPlus_BitmapCompare ; Version .......: 0.60 build 2019-04-03 ; Description ...: Compares two GDI+ bitmaps and creates the difference in a new GDI / GDI+ bitmaps. ; Syntax ........: _GDIPlus_BitmapCompare($hImgA, $hImgB, Byref $iDiffCntReturn[, $iDiff = 2[, $bGDI = False]]) ; Parameters ....: $hImgA - a handle to a GDI+ bitmaps. ; $hImgB - a handle to a GDI+ bitmaps. ; $iDiffCntReturn - [in/out] the amount of differences between the two bitmaps. ; $iDiff - [optional] an integer value. Default is 2. Source colors ; 1. Source colors will be used for difference bitmap. ; 2. Destination colors will be used for difference bitmap. ; 3. Difference color bitmap A or bitmap b. ; 4. Difference color bitmap A xor bitmap b. ; 5. Difference color bitmap A and bitmap b. ; 6. Difference color bitmap A imp bitmap b. (bitwise-and (implication)) ; $bGDI - [optional] a boolean value. Default is False. If true then a GDI bitmap will returned. ; Return values .: GDI / GDI+ image handle with the difference. ; Author ........: UEZ ; Modified ......: ; Remarks .......: _GDIPlus_BitmapCompare.dll / _GDIPlus_BitmapCompare_x64.dll is required in script dir! ; Related .......: ; Link ..........: ; Example .......: Yes ; =============================================================================================================================== Func _GDIPlus_BitmapCompare($hImgA, $hImgB, ByRef $iDiffCntReturn, $iDiff = 2, $bGDI = False) Local $sDLL = @ScriptDir & "\_GDIPlus_BitmapCompare" $sDLL &= @AutoItX64 ? "_x64.dll" : ".dll" Local $tDiffCnt = DllStructCreate("ulong count") Local $aResult = DllCall($sDLL, "ptr", "_GDIPlus_BitmapCompare", "ptr", $hImgA, "ptr", $hImgB, "ubyte", $iDiff, "struct*", $tDiffCnt, "bool", False) If $aResult[0] = 0 Then Return SetError(1, 0, 0) $iDiffCntReturn = $tDiffCnt.count Return $aResult[0] EndFunc ;Code below was generated by: 'File to Base64 String' Code Generator v1.20 Build 2018-02-02 Func __GDIPlus_BitmapCompareDLL($bSaveBinary = False, $sSavePath = @ScriptDir) Local $_GDIPlus_BitmapCompareDLL $_GDIPlus_BitmapCompareDLL &= '/z9NWpAAAwAAAAQAAAD//wAAuAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAADh+6DgC0Cc0huAFMzSFUaGlzIHByb2dyYW0gY2Fubm90IGJlIHJ1biBpbiBET1MgbW9kZS4NDQokAAAAAAAAAFBFAABMAQMAgiulXAAAAAAAAAAA4AAOIwsBAhkAIAAAABAAAADwAACQGQEAAAABAAAgAQAAAAAQABAAAAACAAAEAAAAAQAAAAQAAAAAAAAAADABAAAQAAAAAAAAAgAAAAAAEAAAABAAAAAQAAAQAAAAAAAAEAAAANwgAQBkAAAAACABANwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAIQEAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQbAQAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVVBYMAAAAAAA8AAAABAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAgAAA4FVQWDEAAAAAACAAAAAAAQAAHAAAAAIAAAAAAAAAAAAAAAAAAEAAAOBVUFgyAAAAAAAQAAAAIAEAAAIAAAAeAAAAAAAAAAAAAAAAAABAAADAMy45NQBVUFghDQkCClB3MaABHGTeOPcAAHEZAAAASAAAJAAAV7Xflv9Tg+wYxwQkgADoAhZ8icOJDbv/bt8JGcyF26MGlYgEhHQNxwMhAIPdm9v9xBgxwFvDBrgBDgmQV1ZBEN/8t/+LVCQkhdJ1cqEsUACFwA+OFQHoATHbi7vuv7c1CLGcoxfrD412AGvoSv/Wbt3/bjUEukOJ2PAPsRVkjDd14UE69+9AlZCD+AIPhOMbmB/Yt9+9rHB/EFteX8IMNfaNvCeR7+9+7PoBGXXkZKEYBzH2i1gEiz10HOa23esXbznYSgwgd9dYG6TbifByHd6jdNvFzDYB' $_GDIPlus_BitmapCompareDLL &= 'KSENw4TxTmwFc5kaFxIVy73f3Z5AMCJ0HPcox0QkBALI+95+twsIDyCJFCT/0GUMgwX0AbLthbOYoLeQPuk3/wBtEL5kv2CIcrxSf2HI94nGdEEShI+D6wQ53nf3bXfhD4sTYHTzDP/SDnbxiTQfdsbe+xaExwUtSQmIY0L4nrELkIcJjDw7wt3vuw3pBoZmkIcH6SoMuvL2vpCNdCYAzX/AEMcGCIT2781IL22k6ez+J5U2OXsP6dsQMwQpD9jvbDgCaMb+71VXiW9Y/o3NMonHidOD7ByJ+TAQdUlh6TgYOHRkhBtsShh+z0NWADzoBNxRa+/CLxyD+wN0TYV0SV43tMV2ha3/1RzP113DvwZXfo8/jUP/QolcPr5uNJjdd7xDADzxQCPrv+S37N0stCZeJ2Yj/P8GW1gUN7guD0Tw694+BLCDM7l1I54BdaIX4djKvEDpSW8iLeSQ3XDkFkwB2QjB/UkPhRwsBRbDEDZLtXbJfd0jGYRPAumrHY0PhSG9tjNPlVtUG286vRAM1mB0GotM54vBYdgtIDkCbHFEP/5utw0iDBUXnCsM69eQVYnlxmg2uFHOMCA8EkBvM5eWdhV6sXATujXKmOPZdBaqQA7nHHQN9zoWU8LiCTI95lywv2MIBLBdfMnDb18Z3JcZ6QDpOwa7+PeWuYO/6XsPHo92WyO5c8dF/AYIfRF1rVR27QxqAAHPCVy3GMl2f+6J7F3VL4HslCRTVjSes5Oz+Ab08BTsjbPtfltQA/hQ/3UISgrMD+z//zZJ8Nkb2F3w3+D2xEAPlMDR6BnAb2OtbBH0JBJYE8PR68lh3fcZ2wnYJx31ABiVHuwFMvB0DJ7phQPeLS3th13UV9/3ufwA86tflpAh2Q+8pMVPz9nJoJAGlNlTBLflsLfYittdmAv0nDygUxuc4QsqaAogJjG/T9sc675h7iRbU7QK7OSEUyVzg3A7AQqQUwP0ixYZZJALDKQC2ckWOaCSjIgG' $_GDIPlus_BitmapCompareDLL &= '9DN4rNqLXRR/D7ZdEOyD6dZBffyFfCHM6yIU2893+wZ+CS2ABhEHiV2ANoCzbWPfiZ0nigWIFGY3eLE+2DLrzGaPhXRLtcbv7gLpv1QPt50mU9uBEnNtabclTecI3zePmw5DkEkmpHD4bPZv32RWJoszAdiJwcHhAo1fRrb/5AHLiwuJTYgajV3LidjBtFv7l+BNzAHBiwGJ7S6EOfqtcXMbZQVBCxSD/8uXkW3XRRDBdSA1hU3BiW/QyvbLweMCWrREPRjp1pmyNwkbAih5tF3G3qBNUwvprShN+QM8YK9rrhILjS7GweY0T9KN8yuBBHUmM3k7rLuByRP/MXW/3onwms8u3THD61JaBXUgI8/JlkIoKQaIQRhh2/fRhYRTK2y+WexBZokHDoFsOdltEFxbaZTBr0Mkluc3ewcOJI10yytmG4y/5k3UUZPsC7xbkWaQDKSgGRi/bRhbmzEkAGjujY3YwQ57DiPcB9SLFna57YXO/OsGxKAHRF5b17CWvkYUj3aPfxEYUuPk8CGu+s165kpGfIsLrHtDsK9l369TLfx0pYVDFNftCPIIDDXKMrIQCBgwWrBl7HRzELY/EmWHfQXsCgAI/1+y/Ttzxh6LGMHrGIjYiEeKYG8IDATYvy+EDIVMEAh9B7YNioxdKnYfU2rvTO1I+joGCIPDBA+D19gWXMAFCB0nDcE6+C0A/yVMRAcGGWSQQDw4NG1flEEweARNAXCi8TViowp0dAJoQg1unQjYtg22ey7MiLxUYHQEDiwYTgSheUAkAtUXJlzi3YuDLUUyB8OPs2dv50wcDcxBKA5cTR10777oFzwEDIyLFQ90/BTnbo52jrHIQZFAiWJXr5uEzow/ixWji/BU83QICGQMpCzpqLlwvl9vnZUzOtHoAoazSb19asIWlB/vi1wViwSdZtxU16gIJg3NW8IIP9nDzPdf1AGAnIkr0g0Jsye/VlAUWmh9MjT2dBiFRhuM0VkyoDwAgBTh' $_GDIPlus_BitmapCompareDLL &= 'B7uh1otGCJSE69jrDb8CXakJU46hiU5qjoeF5wEbPB1PbDfD21HtfeoOLI2XHM/AsyGYRw5soAe5RoOrnHMLVSwj8A7C9ggQNiyJjb8FpzG62RxVHAfrtS/zGHn4Fhb/dqz5FA7fYTT9nFAgje4kBCxvT0M4VeRm7bAP18cO8bQOliwhX38WV7ru0Es8CpmJ17lyx/cRoRKegB2eCb4TY+9VAOkJBAQYDIC02UYcj1AIXwLnupuH/ChPU7shaJ0q0GzvtRJrtqc0Bn783tFg//fDQIH7HXXo8cA/sC9ySFVoxfNjhE5+b1dRIwMDANy15/7Q15VAuQ0PzMRaSBvNNJeP854/Lv0yH1Sgi1XPTQyBiUy2jgdoUDbJX4kTiXw45t4ZyekiSs9UlK//4I+EXOjfCwF/K7Br+CSLdCQwhDStEQz28D45+/tkZjkGYHQ+D2ZidC4xRsI6Phjl6QxVgR/uVQdGEmwUYZ7thh8pHFAHGBnP1VfA3+4qBoYJizUbG6sD1yQIlo0w6sxuPGAaiRxA3i+1AeZYU78kHg9FstwwtsIwPHYvGqbc1ugUQCAaM1UpJIWwBDcvD2yQup04D3xwHBgMt+pCihRzKBOYhNPrKRC+Fj80Nj+wVlh1hYl0JASLHb4Wjv2B/9ODdGXXZmdg0zO2FVBAJgpiGnPAxp4xDWQqCmZNJngdFkc9YjgWdsADb2QAUGhBNJAPiFRWz2D2lsTmZOuxTxU1k2ZnsgloPU8OmGMf/2gaYAEGETATN4LpFqkfJb04+U/zw/sazzBCtt6hOR912GC9O6pA0g+Fov00MlTCWyi0kpXMaOgO73R8/AQYFrcSWzPGVjcIFKZQ0AkVtPsQN2p0aDuUZiIUuxO+LfddZjBsQ0MY36khJs9QZAFTDNKuRXhkBFB11ha/igzSMfsQzOlk/+YXEhbDu/YXK9LrhXNXdZHrzmYpWDkBz3TIVgMfRqwkzMloicKSJbjRdMH6EAkQmMhm' $_GDIPlus_BitmapCompareDLL &= 'GcHbSJtQRcETDRDSuBmCIAs/KtCJE9gUtSMPQ/8zDIt8Zhrj99BqLDunMb8NX790jO1BwMF0VAsdZ78VRvz2n8PTdEGF/3QFD+mJL4tsdHXdt/ftdAoHEPuJfQBQKB4L23eb+AcpyNWJB6UHKdqDwgoWg7sXbIsMJyEGxwfsew9MN0HA9BARdzcZ5CgoQMbHBgmFc8KwP1BPL+dbmHTMKCg8yJtYZ0tYghOAhsscIF1wrImeogSv06yGdqnjVVjIyVJmNDBpus9FtwECCDQqFBwgNMhhpvsUAbc4KTi0672GjQklDKQoW2VJOnMlvFsPv1zJADKriHg+4g2ED7uCKzvsTeYcwQ+9FhzD7FvyJS04xQsl2RAYtsefz6mULMxL31s/npq67mxhMlIwzBr1WCX0ui3yhQZIQE+xJsS+GUASD/PLnXSseEBsAc/2XLyLdO3QdysQ9WUx6M7cOhZEbR1CbGeQpRTvRFR9LDuTjPVE2FxYOSMErPhI6VcPr8hk8N6BAc5HOkSbLazNkOuyj6kJEoaYwM95Vnsdmd4QjmYPwJ8SgtxOdv/SGXXr7wzzpUZ8L7/zJJkXfOxWhiFsmBSdD+sBdfQoFudDgxXQzO5d2F6e6wKJO0OtFIUlTmQDS+Dw68mfX1BwUk9wtp9wqJSfyCCDTfwH+PQggwwy7OjktgwyyODEvGYBWgLNCL9DsOEolMhMN7SCl7BnnL0IJCRoJSKyRUKgZwIcs0GaGMAYMB8KEp3aJHDzWhvBhnQnGRAcaNGO70QsL2BSidjoccLMsEO/0GeggNTKb6T4jhrRASdiD7bA99hNPyZw0S9CMBhuELj0zyAUPU7mQLsv99DWxTpx4dKevRBxtm1yHHye2BAzAxQQ3iOPPWCJxQdkiceAicbtf9eZwy+MKxgDHDHrMd8x/uzdttiB/mQh8GaJNYVsdNj9J5C4sBm/RL5PI+vg7+X/RyPfKLdTgAkEAMCLRQSNdwGhYw+EAXFt' $_GDIPlus_BitmapCompareDLL &= 'UUSjewXYdAQ4U4ziDOdmbPk+iUXwBxz0lZjMjI0VSCgPqAjqsPdgXP1lv6ACA0LPByRYHxzlEYluDBUZA3SL4USMWMGfi+t7gokGIMGIH8wnnxJSAb8vgz3ca/B2nRQCVynaDIS6Af8t+AJ0EUd0Ox9iiUw0bBIoCHDjdpIFdOeviwOZ2Ss3iacU2S1sSeJjLyjTlwhUiz7sk+unZj8g4YCFUA9fAW9gbw8hr3GYeeBUoxtcjRgDTjDYVDRsDO9lRng4UAdcfDdGEU56HAM4WX/xizFCnjCpVBh9w30vKg+O2YM9DT/bjVcEf6svsZ8KxncOi3q6Twg5yA+C6NsCuLIf2oPrOfN14mmDPnEdTyHM9sezaMTYb9iYHHZOHOK+m8SNC0YIfSUizANHDCAffNAQYhRyHA5jw6sj5RgEBrA3+vCJR3RtTI1Q8+L7Sl2gxHQ2BKvgv/5dkO/92b8A4AMdMUJA9hQADFOHNQxBrCcAM2+ZjW8F2AEA7jD89ulKvRMAvgP7IWw8pD0AZx+WfQLchbYARwgfcNhguCQAXsVQDy35AY8AVg9UFPYDRjAAP1JMBBQB+XwAuN0KmwRAAoUAHj3g8OHXzgYAAiSaMynEEXEA3r6uHxejgrgABEhsLcv2orAAiweQjwgLVc4AXo5R20hshY0AAAxwoe5BeIAAs0h0uwR4HzkAOt1CiC0su24AOxtlR/6F+7MADBQLCwt/c0kAixOLSzSCCvAAr7Hb11p6BasAxLMrEDwKl5EAZTMIIIUITQEAD8ixCWb/QQAAjWX0+2CxWEgAbF3ri3MEYHYAR0Z+g8MIA5YAhlXMNho8jscAzrYpzCaJFnIA06FsO7a6lRgAyH8OKJBbOx0A+D3CfxF9pY0APFuTjTS9aQEA8A2T8ZEW3o0ATcw8TPlAnmgACxk2rerZyHcAhCecE9QEuNMARdjDTnhguIAAJeuNJzNaGBwAO/2FOxwY8/YAFbvaRMNX6SsAhoG/' $_GDIPlus_BitmapCompareDLL &= 'zlvbMU0A4YHPKxFmg7kA5P/9hVJIx4sAfcQt4ynQAccAifCJfa9U29oAMmOLL+85n28AaQl2PYVUC7YABrpdgXY6icEAkA2APkvBYX8AOcBItogG670AiwZo+PcP5CsAA4k+66GLDeMAAfGLQeRKNs4AuUG8QEQMkhQAOcz/n2hNRuAAHJ5UQwHoPngAgCB6LQ6kjWgAuejibFkoJv8AGroBeDzVhcYA/9cdDEQjbqYAYHFDBC/cgd0Abq9bCCd1200AiCpsgJMN2hwAdp9UJDREwMIAv6sM2OmuhU8Aw3RC7Ew3awcAOIkDcmijR9YASPa+oomrI8AAc+mLV2Blde8AuO+IvST06/QAn2+DmgR0hvQAhw8SIBfCMI8ACBW7wP+OdxcAiwI52HUK604AiwfZdGrYyj4AesKLQhzx608AQ4oFTotIikoALqwtfGQs69EAiTNSHmcDeGcAdevZjxjosxQA28Huf0ByHfcAdQ2z2ZIA8+wAnb8XfP2CNZMAjDl13pYg2hYAkt0Ri1h8mYkAwO/I3ozGdiAAei70ewOp70wAlp5fX/6YS9gAWS0Bfa865BsA8ByE168ePOkAWf2T1NkNY98AA0A8gThQRe8AyMRWQgUKAYEAeBgLB8+QoQEANDFP/1lxsLcAEzhNWh/rzq8A6UOuCqgTA1IAZ/6twLZyBgMAQn+tRAIYdBsAMckXfoMNr1AAmNp3BwNQpdMAcoYvUeAMg8EA+qI58XXok18ANHi8Xl/vBlUAfHaNREPYPBgASON3CxlAd9oAdT1geQuTuw0Au3e4EyQgrAQA56ENPI2JS7cAvZATd4AGFGoABorW1NZbfIUA7XW+x6/GcdsA+WrLw+76pAgAaAT7XMDIiRwAQK9c3l68tjkAN98NjlsODccAsgc6Lz8Ii58AhglbcgiJ2I8A4y0p1jMB6RMAHe9l7X0HIOwANcM390udRYYA7APzz+/JBgsAydpJ71aNMGoAXMIF9i50' $_GDIPlus_BitmapCompareDLL &= 'DasAf+UPwO0DcogAjVQBGApJBq4AEt9tNsd7kPYAQicgHDwvNJEAqxaPp8IcyHUA6Umx3WtlVf8AidYIn8DeZW0A/7AEwXFZzsAA2AsPxxc/CAYAl7DfTzwiugQA0kwlDBwSZngAqQUpJBbB6B8ALk8bAYNO6/IAby4xRgsGwv8AU5HwaQnhxcMACV/4Ug9YdM0AkemLmIDy2jIAP/Y3LCJyxoEAw4XadQvruuAA4IYdj4PuEhQAi0pzbnzRKhMAUvYczn/oHbsAuYVxDGNhgccALvhfSLPmgp8AFJB6TxzsUaQAiXgAUVD9vnUAC60QvEz1chUAgekLgwng7mMAr/kHGHfrKcEAEFhZw3LkyBEAw7IIsgSyAHIBAADw2NTM6SYgAHK4z+nH394dAJ+qDRt5BMDtAIBQYAd7rw/QAAAAgipAQkHBAO7qgKskpP8AAFCJmsjM9bHaAIkFVYAPCv+vAKAibGliZ2NqAC0xNi5J/v//AGRsbABfSnZfAFJlZ2lzdGVyAENsYXNzZXP/AP8321OAA1AZADBNaW5ndy13ADY0IHJ1bnRpAG1l+639/yBmAGFpbHVyZToKAABBZGQHNyAlAHAgaD9/2759ACBubyAfYWdlAC1JYylvbgAgACBW345t/2lyAHR1YWxRdWJ5ADhlZAZvciAlAGTt1i5ieXczAGF0AkVh7pO9AHkzUHJvdEc1ANvft/93aXRoACBjb2R/MHglAHgnVW5rcXd7AN/a7W4gcG51AGR6Q2xvY2F3ABHtbd9cOgtvAGwgdnZzEG7bAHaRtS6tM2JfACAretv+/5BlAEdDQzogKGk2ADg2LXBvGHjUALf9rXBqbDowAHYwLCBCdZJ0AMB3nXlDIBxHAFctV3JqrSkgADQE8hf2LjkuADM/d2luMzIWAAElfzUuMi4wABVho5L/P2QJAJJGPwAKSgJBAEAFkqoIAGwUACeSV/IANMbAAMXlZCu5mAMQAMLZpmmaJj5a' $_GDIPlus_BitmapCompareDLL &= 'AHiMwhtl03TNAKS8A9TmBMOaAaACGC5EYnKGaQFAAZiowtLu0zQAzbIGxCAySmgApNs0TXCEkq4AxK/Esmm67tAAB94D7PoGxU0BIAQOFiAqMjw0QUABRk5WXmgABdMAcnyIkpzF3wQAZQsoAyELIVMAwCMeWQCyFAMAACjARmWrwAMAAPCqgkAZMBUABEIbveBHgIgADFaxyeWyOdAA0BxUDMAYyGAAABGbVCCDgoIAAixQA/+/bKYAfEyxAURlbGUAdGVDcml0aWMAtk+C4mFsU64AAUVuFHJst20AyhVHKkMHc28AMk3/wEpQfg8AU2NyZWVurT0A+/ZCdWZmNkkAbmZvG3VyFUgABMUSFL5jHtgAAazVEklkFFQAaGHtg90FYWQAE0xhcmchXrAAEhT/V2luZG8Ad1OUHNbFblsAGUUzb3INi3UAIsWLbeVIYQUAQRFezR6bBZEAD1N0ZB5rb78AnQ15PWVtVGkAbS1zRmkUCa0AbbfYGAhja3AAdYkNlOCaa8MA+vlwBIJiZdsATKR2Fay1W/sA11AD+nJtatwAR1lIFloOM1MAD+xuwmzULRUAVW5oozZzb3sAZEV4PnBVnEIAFGjbtrUQBlQAC20yYRLmtu4ASVBUbHO2VoYAdVg/CSGKFUYANBuxZA+yCnAAMN12a/9HZGkAcELWvnBMX2sACXOQsG1gE14AbBU1tjO3AWUAihtGWW0B7P0AB7Z9MBpIQkkAVE1BUBslbhQA8dkcRGlzhWUASeZmjigeEcIADdlcwTBEhxgAt5OJV97ap7gAX1/Rd25leAwAu22DfWFtc2cAXwtjFXRabGYAVnO/zrBfaa0A6W0Kb2IFqs8ACsncBjiLEWEAYgwx5wqeD50AF8DxbbPmFwcADUp13GaCdYYAzskFd+EHbSIAR+fc1pp7ZSQABA9hSrcQ29oAc38GbgfwbYcA79zWWnZBNJUAZrwCIQUtE18BQD4FIAlHIwsOAA0WJiUT' $_GDIPlus_BitmapCompareDLL &= 'LgoMAAogEgcGJwcLADHwXAG+vf//AEILBhQJEAntABlpDOBE8JUDAAgAHB0SFyXfAP7/3xUlCQkNACcsJRhvCRU8AEQRFAoKDwQEAAkeGSr/v/1vAFUqNAcJB3g4AIIRWAspBhAKABYKFQYaICESAP/v//8lIwoIAAoUGVlKFwcMAAecEwcNB5IEAKMRBxMRBhUPAL1/+/YIFQwGAEEiCRkPFRsQAAwaFREQcG9vAO3/ABMmETsYABo/HhILDyMFEH4RBQVwBrcIAQAJCgYJEWsNHwA8aBsdKw5BLgANJR0NFQf27QBb+w4SFBAabgAiFw0OBQ8NBgAtGIX7v/3bBgBiBxIKKhcaCgAZDBwJJCAYFgAUHAY/1ra3fwAGMwYTNA8FsAAJIx4OJf0qvwC83f4iGA0KGwAK/BMKN8QUDgBdGBQFG77dvgD7DA4HEBsMSgANDBYPDz4WCwAPDy9c2P7/wQChHgQM8GQL8AAgEAQE8Nx/DAAE6MDf9VYPAAAAUEXGAQkAggArpVyW5f8gowDgAA4jCwECGQAAJkRG2FjX3AAHEBQQA0AiEAAL2eTWygJBBwABAACzWezYAQAMjpgeNAMBLAAnewIRALBkvwDCgCd6pAYd8AAAAOxZoKaQAgAEaBi4wt4rMADBxwAu7Au26wDAdAesJJDrBAAjuo0XLmAdYAAuZOphECTlwgC+d/uLKm1ANABN9+zALnIobAAIJ1AKLM7O9QCUQC5idmCURQDJ1rrAm4BRTwBlA9gg32R3sAA2T2lpuhFmJwBDwJ8IOGCHfQAAQ1JUAJLQTwCNlQLYQCecnwAgdIAM8u/gQgBlskE44dWb8AA7RCeq5smWOQDwY/PHAABAIyQJIBAM/wAGAIB8QCQIAQ+FwlABYAC+FQABEI2+6wAP//9Xg83/6wANkJCQigZGiAAHRwHbdQeLHgCD7vwR23LtuAWwAgAYARHAAdtzCO91CeQAc+QxyQCD6ANyDcHgCAHQ' $_GDIPlus_BitmapCompareDLL &= 'A4Pw/3R0icXF+QLJygB1IEHMAcoEAIPBAoH9APP/AP+D0QGNFC+DgP38dg+KAkJACQBJdffpY////wCQiwKDwgSJBwCDxwSD6QR38RABz+lMYAFeifcAucEhAACw6PIArnUXgD8AdfcAiwdmwegIwcAAEIbEKfgB8Ksg6+ONvgAgG4sHAAnAdDyLXwSNAIQwABABAAHzgFCDxwj/lliwAACVigdHCMB03ACJ+VdI8q5V/wyWXEAB4AIHiQODAMME6+FhMcDCBAwAsAeNXvwxwAPAArABIjzvdxEBIMOLA4bEwgYB8ACJA+viJA/B4AgQZotwCgLr4osMrmBwBOEH//+7AAIQcChUagRTV/8Q1Y2Hn/AVgCB/AIBgKH9YUFRQEUEBWI2egQKNu2MAGwEAVzHAqlkASVBqAVP/0WEAjUQkgGoAOcQAdfqD7IDprvgA/v/rGla+GNAAABD8rYXAdA0AagNZ/3QkEOLA+v/Q6+5ekAoAACCcGwEQuDAADGSOAHIA1yCzARzgALIB+1EEdQFifAIPAA8ADwALAFpwsChQ8SgIAHzwAFi1PAGJ8ABoPAEFAJR0Aaq2cACmMADE9ADUdABCZ+BgbHVzLtGSSwBFUk5FTDMyLgBETEwAbXN2Y2RydHIBAABBYyBgcGBvc2VJbTCQEAFlCnRgjWMwknJlc3MAAABMb2FkTGkAYnJhcnlBAAAGVmORgY9lY3QAAHBfaW9i8wiBRHEADq4hYCRxMjQABPAACDAAggwwABAVAAApcAAhcANHRElQ4AlfQgBpdG1hcENvbXBwYXJlQgmvAaEBAAXhKRiQA505ZjuEADuIO4w7kDuc+Du4O38BdAEPAA8ADwAfDwAPAA8ADwAOAA==' $_GDIPlus_BitmapCompareDLL = _WinAPI_Base64Decode($_GDIPlus_BitmapCompareDLL) If @error Then Return SetError(1, 0, 0) Local $tSource = DllStructCreate('byte[' & BinaryLen($_GDIPlus_BitmapCompareDLL) & ']') DllStructSetData($tSource, 1, $_GDIPlus_BitmapCompareDLL) Local $tDecompress _WinAPI_LZNTDecompress($tSource, $tDecompress, 8192) If @error Then Return SetError(3, 0, 0) $tSource = 0 Local Const $bString = Binary(DllStructGetData($tDecompress, 1)) If $bSaveBinary Then Local Const $hFile = FileOpen($sSavePath & "\_GDIPlus_BitmapCompare.dll", 18) If @error Then Return SetError(2, 0, $bString) FileWrite($hFile, $bString) FileClose($hFile) EndIf Return $bString EndFunc ;==>__GDIPlus_BitmapCompareDLL Func __GDIPlus_BitmapCompareX64DLL($bSaveBinary = False, $sSavePath = @ScriptDir) Local $_GDIPlus_BitmapCompareX64DLL $_GDIPlus_BitmapCompareX64DLL &= '/z9NWpAAAwAAAAQAAAD//wAAuAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAADh+6DgC0Cc0huAFMzSFUaGlzIHByb2dyYW0gY2Fubm90IGJlIHJ1biBpbiBET1MgbW9kZS4NDQokAAAAAAAAAFBFAABkhgMAYyulXAAAAAAAAAAA8AAuIgsCAhkAMAAAABAAAAAgAQAATwEAADABAAAAABAAAAAAABAAAAACAAAEAAAAAAAAAAUAAgAAAAAAAHABAAAQAAAAAAAAAgAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAQAAAAAAAAAAAAABAAAAD8YAEAZAAAAABgAQD8AAAAAAAAAAAAAAAAYAAA+AEAAAAAAAAAAAAAYGEBABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgUQEAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVQWDAAAAAAACABAAAQAAAAAAAAAAIAAAAAAAAAAAAAAAAAAIAAAOBVUFgxAAAAAAAwAAAAMAEAACQAAAACAAAAAAAAAAAAAAAAAABAAADgVVBYMgAAAAAAEAAAAGABAAACAAAAJgAAAAAAAAAAAAAAAAAAQAAAwDMuOTUAVVBYIQ0kCAoe90BCb8FuqsomAQDTHgAAAFYAAEkCAMP/2v//U0iD7CC5AAEAAOgCABa8SInBBMMUGnxIixV/57XbL0IsSIXbIgIYMhJ0DzHA/9j/7EjHAxYag8QgW8O4ARUPHwBBVUFv/3/3VFVXVq0ohdJJicxNicV1eosFlG9IhcAPjnc3t2+yAY+D6AGeHbJBMf++e4kFddv35nY8Ji2m4usHuei8/9XY+PD7n237SA+xM0hudexgPZGLB4P4Ag+Eih+CCeycudhp9AMoW15fv7sF/11BXEFdw2YuFIQAAYP6AT11' $_GDIPlus_BitmapCompareX64DLL &= '39uWd7dlhAQlMBT2NhBwCOh2H7TKMRdggKc5xr0CHE4OvgoJ4zH2DAoBPe0z+09aFDITPClphfYYvu72DyxcBWtA4wB+dA0WFbT/H14EKgBMieH/0IMFf240AXmmWbAhvukCIsVmRIJr8fdMiyWpgkmLDCQrbI4k2pGX7cV0Ry4toU0AicaI7rdv2gucOfV3E9wW0nTv/9IldtvDO7TtPOlVxEnHRS0OBCQVfLAp1scH7YcDER5cmCAAwj8eAStHpLtbYFQfWjDufGfmWUCKThgNPNP7Xiq65EdHRx1YDEBN8W5t8vU/cALBUp+B4GzHeyBKPX+QdlY2d3zNidOJF5DEdUFLbXRXG05w+3ocbCbgMdK3BMwCg/sOrr3oA3RCXnQ+ifCu/wCcIHx/K0bDv22NQ/9yidpfGO5bXnh3wSjQwDJmkIWdvRXE68I3qynsGczhu5u6S7iND0Tw65o/V4ILNhs4SnUdCgF1uDN0kQ+2aF4C0jlLW/DwGvOMQrppfXmtDQK3D4VTqxm2pDuawKvJiwKGiocQfS1m/5JIRns4TOcFxT4hdAouSE++21+0jJAURCQ4iVQkNIBMJCiEF9w7lef4CCEcvi6Li19wgalNVU7lvx/+9L+/W4M9ACwedDBIjQ2nO3QVYd4A2utsj+0vIhWjtihUXe/5TglM0CvQEBeDHF5s313GF7wgBZZ2692/S/uNzd+QAUIL/Gb/HrRdMO0MTD2QHzAMTRDIKc1f6FUYTIlFIEj4D+/oVpzJfRgKEbonuSkLdi5ym+DrAZDWQMnDhQKB7Bjluz3sVo1EicCSTSiImdByyMvwjUXMoxLIxLW7gxzAVchXSYnQkMKLudeZwp7brCzAXS3u4//s8w8QVAhNxA8uwQ+awEMVI5XO/kXCD7bA99hUQ8jAuR2XyyHBCcwA70N7B7vJK5vAwx1JxAIDXCTQZ98LHuwQ8WiQZKBIsXbBye3HQAgPEBj1gEUPtcWjhWDCS8eF' $_GDIPlus_BitmapCompareX64DLL &= 'WPW2czthQF8ZGI4Me7bABCGdwwh/als1ew1UOS4OXLUp/BAsUqlMa7gDTQzILfbublOLMomFHFA+DzdsE0gb2DLMwLSVWKCp6aSQVsdyIMj1Zd8tQbkKICYKX0Z3saCF+MHEefygW3cdZ1ggSQER1KKQNFt7T+YYVk2ATBq2h9nBT4tJXbCNhiUDW1sCok0OaZM8Ejg0Lha84tgoJ4B9hHUK9uDxT/nu2esikCAGdo4IOOsJkJ737MlEFokcaOgO4OCPYWWePGbCv8032o92IWZU2pQKzYC3tEb/w1LiwPNIDyrAocxQWeQdWJxIE1ee3KpcSWXMfdi6u034ODUmENiLlXWJ0Q5a+2/EVdxIAcpIweICDNAuienOzlHyUIA0Ol328Jq+ixc5/oTMsUdA1HX4bYZQBBWJEDKYMcHvQFulr8KL/YkCX5AhkLe1kG4CNFCwSp4DdTmOjT4mWHl/lQnKUn8EdT+Cx4dCMcqByhIKGQr5kBAFdTYhLQBy9+tFeQZ1PSo4CjwFL/fRjesEkFba8UfHZoMwAYbcZjsCD4Zcnso7KsUk3t7addPTNH0prczugKemTDLTfcxgK9ImX/+DfTAAdET+KE1tG3blI6VZvDcdtgUvz7QoRdBMDZA7hD/w9x3w0EiBxK5bXcOqohxYU8PO/AftBF7vGL8bawysJvyks8+EyQf/JbLWNg+iycnJ7ZIfgnJiCe9k5FLX2soPG7ELv3+LBQpkKMABFokFwWuswv5jggHDeDHSDH+XV2JoUViNDVhutAgPPLkCC+aWE08yFf4zE38Pst4WrIMtuYYBdAfD8nV/lz+UbA7MMcl7bJwRb3924fMOLA18cB9uGv8V53WH7YnWORBuwVBgu8zwdvjNGZ+JDcptNxXLDEQhdqFZYhi/wx/fBvzC5jgFv80KEmw3OMcs/4wKg9SQVqg1KNcNgx9CU0hj2Tco3lE6JzxGB/PDnVXcrl3LzsYyKb9XbvmHG/QxzuRi' $_GDIPlus_BitmapCompareX64DLL &= 'TRz+RnQVnHdG+4P5BHQhaNnPSMcE/vcRWGIBgj+LSwhDw8394OvUn1Mx24tsg8MBH8HFa7osg/uu8W3jn3QnqITkjYEPfAmcYMXDZo40NNboZIIssG+rxGBWLBIwAd842LnhbCtfVAUJyrhAAfsUiV0C660/Pw2cuhQapd22gvvE0TM8rEiz4BSLAJ+JyOJJQGDgUEXJYFNUeTQFQ17jQ0DfVyOVCzwTCh2DM7sJ4wqYD7FfarsIAdp1/36suQow80irx4MfBBgSIAYPnUMk5lU25duJ/EClYZqJg5XfcSMl/3kS4IuHvLf1xlhRXUtmn6hYxyFa7PAvabOwTz9DOP8Gg9+FL3L/UAg4UEg583XojUprcCYAQ/pbeI8sFI0Ujhu0p9/kRALBui4wuOkOerhbgDbUsRWnvJQKvXNQN2is16hlX59r1ODF2gE+aTINgMe+Gww8EwL/4MwPvD9J7dhpL0BoORB8f1bAzrwPHhcO0084EaxgCNFm+/8Pt1A8ZjlQOHQfEkg+SDpC0QSrR0yKrlgQRD6zEP+dEuzrEFosUA4oGWk/DA8F9hihBhTb6DQZcSh2EDgsEELwH0jCcNhR0kpvtD+1BQ+/RCRCa7yv3P4/1RUsTekJ0jRaJ1Mfb1DQ7NEQTMVFdATARIkIjgxOPxR8EaffHefm2kJTx8N0tsf4YF2P0Rvy19POAgYxsBEC+8hUjvYQZokq78/NDBBUJCw6jVH/HjwwvKcteD5Xe3QtSOgqNg0ud7gFyV9I7l8vwOcxOTjrxr/HBV5Mx96dXzNXZv95MFUYnWZKb/eQQGItFunICB+brF+FJhh2STBLAuw/+3GRrjwqkFYG66SfZt9UtokS/1CMHQJTq3ix3dJ1eGj1XgN2NZgGl5cwjNBo6Todt+FidMHoEDoVzmBqwoZ7+mwSBch0WKD5VGR2tUNrcCJ6c6hUJhJLEBvodlQOoAWbTFv/11KeKk+ICOBSUIUZBjcxXOuDXzsc' $_GDIPlus_BitmapCompareX64DLL &= '8LknfETHjnWhGh5ZGD0fn8WjKHQ7Bys3TgQOwfkQI5V2bD8SRJLAZhRxK90mekEPRcBXDSTJuBk7EBoucMiJC3c/v5T58D3I5F1xE5xMbVuzANbVLkWoWjiav0Jvet83cEE5w3RJFFo6KFJ8RDnTdOioX4M50wYo84kxvDfhI/2ay4kKTZZEKdiCQYkAvx3/v01ECkEp2kGDwgFFiREjcccBY6e8c/1wFAJzB0GGbNs93W/SQUVpH40rFeFMgDhIMBM8rPG5sp1oMX6cSqWLi4tYEwABvtIK3z/NVwixOWjbVobGUwbL+jjmXCGX/HrrcljbLVjVapXHTkUfNSg4oNz1XSLtdAr0lSc4EMCa//gcLAdjF29pGvY5ITd4x1JffxAVh2bgUJwoP0ZcOxUckEMG5EY3YFbBoIOODEcrFktMOxh2CyEsTx8ooxWsHVM/V1/twIcDX64Unr/e2vQQPoUwsVuXfPHtw5oslyaqdRJIY0McRMMQFNaUDkYwGgMX63ULfd+59qs9VM0paoRPPXGmZ7n1SwN6i0UHPbYLDkMIaRPB+N9zuNmrzOUYNC7HQzRvDPd3f0owUhDrhYtKbIPKAYlf7rTl6UfNvtLGBgHwNOIBhT4oGoBqNGp3EB0cAAhkc+t03PJyYjbpGYWmRxx15PN/rIZW+YI1YysGGvi6KvjfoUl2YA5fidj/FMaD6wF19lJXBpXSj6cNlbIVzrE/UusD2OhQsAX2twEyPNYAdfLrwr/8alqOfHj4nwZfRlZa64Qn3eAx/0q4Dzoik5EnJwr6zOqTk5OT2qKSgvFTw5Zy/1N5ywYZgIsMUbUAt8bvQ7wDNXR2uQgJK6RAMGTvtCEWLEchbnXCI/XZ0GYIjQm46mesSb/em30YYu7qtIt8tyDhXvxoRyuUFth3wyhkKhNyCHFEs3/6tLUCawxIXpTAwKQJlnFgKPznNgyfQIgdPxi4MqLfLZmHAgJYe8gbdBekAbjtSPfTvh0t' $_GDIPlus_BitmapCompareX64DLL &= 'QmhAgFe4RD5M1q3K5vbpjhRkFWqJxQ/HK03VnZpLMIBOpTNkePteexj60P8BIDHltO9IMdc1/81MyAgU/kghxkg53nQj8Ab74Kbs0DWmF/OvF/vBj78HX7jMXSDSZtSQvjNx0GAFeOvNv7izWw50j3Bw9GxYr8766i7KNVdZ/9g+64fTDnYsH05JicEwax3atRmcOuAY2FJEXbwDlILIIuhfF0qHs5QFIUE4t91dK2yC5clF/jRjNX1YyKI3G0XzXAkEAMBY7Vx5u1+nn1xVyxYbRfAU0CsPThv4jLZYzybJyWwE93QLC7qJ3aXJg/tIcweMWQWNzjZG9em8CBQinBkvn6gA16+IGIP6A1yFNe1LRz+IJVwvkCLsxkN/BZMngDgCGj4A08wAAn4CNkDuF+kCD/8dKdb3McAq3DUiDKp036QCuwqPFdDR7WcYqyP84+u5f94GlxuD436f/z8pdLDmHz0/gghHWD1uWArmWP4wPeH6YA5okxb8QbgbAPiwKRffxkhglqMluG1rZmOEdElc2kg4uPChq8LwMVyfkB9wSzGQX+BjLRHHQPs+8O3z1uTHXhwAB8yHFlr9W9D7b7/pVAwQTDnTchQqUAhEi1oITQHaHvrvpuAPgiwbg8EBRhhBOel112blxx8XJ2zjxBxOt/t2wWxt5sHlAyLtTAMtpqwSRRBBCvxSAi1eKIxBnHhGnYIMwDACPAjj19c5AHyrbCgIvwm/sUCkx1t0xESNUPyD4tYEb8L7dNRAg+C//GbpfvKFs51AxA1DQjg98HeacGNuKIMFJPipBBqjVPj32fJYLPr+MbwrfDHtDBtXWJHG/Rxdvbok3sIoGgXsWoIHg/MpbV8qRCzxHc57OSo3+B2QqDqcCB9BVuVXbbSTrmpgSpmUgCDsAoe4GwD/QV5d/2+7Q+T+dpe8SJi8BEAGxe7CxY8e4+C1RjXjJPHZ6u1ZTVrL+eIkKcRAr3vqlSBsOzLfKWArfm88+Ad+' $_GDIPlus_BitmapCompareX64DLL &= 'kgoLfiaAG0X2g7TtI+weTBZTBBjSS609gJsIyXUbXBgDMMBOb9YiLgQsFVMIYnDxye0XH1lNFA+DyodQ0Wg1aKQkM218vm7bHWAdDnCMD7ZmTAHhCnq01gTgchBMACse1ob4a7v2CooiIB0fDBBAwfhJKewyrQvq6gTvLAMBdXjqVKYIlLP8hJ9WvOVyphpaWdLbMfa2yw0ewwE1g8XMFCVw/s4JfOsZ/8YBbhg7NSfo/oD7ZA+NWcwDBRsev2PDl7KU3XZICP2J+kH/+Gq+xNZIEx879fhNQ7Ma4Lpi6KbQMGAY120EGELU66nfB0gb7HGgI0d90PKeBIHgcK9li0P4Bp6RbhY8GIjb6fIdwAh1abcWDRpGEeQw0knkihW3B3CEEA9I0nDCSewxHL5MUtUqDUK+tbtxtw+3Z2hmhZhHAWQCUkUivj1aCMNdi49NCfIdB8jFhQQDzlf1QvlLmA1jIahDCCzTee8ymSysDwH+vvmj5CiLAT2RwHdjPY0Mc3s9CNJ+73DFIJwPhwpsPQIggFz4pzs9BTeFejHSuQv77xXf0XR6AUH8OyDcOSkuJcL/0NRZH8/bftg9lLesd0M9khmuk3XLrYC8f6YI6N79oISk8st0tTim0uj+tENAnpV0aT2WfUBkkiM5JATmBCvN48NWH8//fh3HPRYYEbqMDSIxlYkrIAUXvtxVMIjwX59h4rbYhzsQgeeQmS127W3DBEErCySkAws/TIIFQh839r7RGpsIEFYdJdIgD9kAL8Y4IE/2VSbMMUbhAjQUM5XTfQqfjR0JV+K9Xpxq1ylW+2yq30hd9Y2rWiXe/QjX7uyxIHBl1t8iFOsuxgdaa8T6XQsOiWeGUAyJU/QDVH/2bQVyg8cMKeiJQ/wkGP4gdDWKPQ5oKvFQLXXFEGy04JX2IViJ8p9TiVbxXvgP6Oj/FQDBkjy6n1kGPwbr5D97EYsCQcDb013mQYHg/iAM+ENDRyMTjj45Iyx1QFM/' $_GDIPlus_BitmapCompareX64DLL &= '2upoIryD4SLTi3QydyD66KM9e3Qpc3VBaxOLOhwjnD8mY3wfc8tPbZA/R1J4hF9zR+Hql1TZ2igHbkdPUEj/4D9koq79v3Q7d+ySEbOvyw4CHId1K8H4IoLXPZoFdG7ViSk5C/wB3U+Ef/ZCBOPJJgVvIi15XpUWTYem7yc3ni90TCcWQWLnIp6vMbeI0vGt/z872BIsopMRAZ94sVn3zkFWrptwpOuEvhsUGNAzhd9useBQvyU9uTKQiwtkpY+Pxsb/114Og9+VeDzIirqLWxBkddwUvnsJflak7lXTphfjRQcAOShWYdFlu1UP338cQFMjjonIGLd3h9QaRl48iTikzSzEo5v/cKTxvZBqm9/LOy6DHVw9QxBCvvtD2BOavX/rkpD7Stc2cj0RQV/lpZ0nUJY3vpEVChW+aCTuxDnYdQ3r1OwJbCrKEnQlT0IQsZf2Ld1oAsy96wIfiKt/QItA2Y4AU2JQ7VDZVOvC71Oj69WBidHeoypfvJDg69w/Svgl7HLHWWB4FAPOXo1UWaSN0vUmHE3+NHJDjU6bLBpkf9rY2peuxlAWLBEWWfsAPPiCONl17wpTVAWTtmwZKFQSJjSQe2mJnryZf74SdBZCfVfgTgT3AZCSCVT2+bHSacvbkMIjzCV/f/gT4Vgfmp9jQTxIAcG/eQJvRIE5UEV5FGaBeRgLAue3gUganhY5TVp0CTHfBid+f+vOH38Pt0H9YFuJFFIBGBBJBsQpg+kBYhEggB7SZMgoduMNv0BADEk50Ez0dwgDSOLKclpzf7W6wChMOch147Ofn04OLR8Y+WwIdyk4K4gb4hQbGjua7TjgG3SPJhk8fI3RnmkmPELZ3k/zFDZT2kJcAhgQBrdiiPUuwaICgAZ8wyiJC0yB6zgKJPt0tfjozlg9mvlkkOIEGtYUtMEeVjCBUmEfAh0MX8HMjsc+/84F5UgpDG+Uu94cp40mfH+ZnacbnSA0jqHWtUe9C91/memwdhEg' $_GDIPlus_BitmapCompareX64DLL &= 'OvBEGAY/YEZu2F9CNfIZPklLwSm8iG2I8Z5P83BGKMZGVAZGev2HVNFEwij2QicgkE+DU/bcsBZCwsINOQbDdejZHz7XS+VgJRxj21dweNR0ChMAFUghESvtD0XeLz8MMUyyICMZCr/nHRfohiN88A/YJAIVa/v30MHoH2dgwX/TPA+7V8M9wRjtP9iAZjKonojoNYM0pAtfdPneu7/uN0c8i5QHkCz+z4nTOPTw13BI2r2u+x51EuuzjTscg5/ufRSLSrX/69rqdQe6DE4bhfZ/54tqDFz9AhtcrOmfICVXg0mrPtvj/9cI//5rJfMPEUQk9NkGUFHZPCTf7TQ1HCR+yCII2WwG/JvWTrP/2+LZLCRZWNlcRloQfchbZLP+GrkP+rjJycnJ6trCssnJycmikoJyycnJyWJSQjLkycnJIhIC4rfk5ORk0sKyovXk5OSSgnJit/9Y/7ofUVBIPQAQwxhyGUiBH99rv+kbgwkGLRM7d5DBcpAYdilYWd3OunJycnKqmopqC05uFxoPCvo/EzGQk+q6Py+37ZcsBDzfAQAEsGyxyZcAK8AAPy6uBwDAASv4PwUs5AkAAAKVCpj2eR/NO7gGAMCNCf+/iqhsaWJnY2otMTYuZGzV+P//bABfSnZfUmVnaXN0ZXJDbGFzc2VzzZk9Sg6AP3ZAD3H//4c9GfAzTWluZ3ctdzY0IHJ1bnRpbWUgs5+E/2ZhaWx1cmU6Ct9kZBbuFby9fSAlcCBo/iBubyBGYWdlLRJjfgX/v1pvbgAgIFZpcnR1YWxRdUR5eWVkbBNs3gxvciAlYnluZmF0BLtP28aL7W9Qcm90lnN3L/gPd2l0aCBjb2QOMHgleE9Vbmvdm21v6nduIHDkdWT8jmxvY2H28K693SJ0Fm9sIHb0cyDkLtnaREtrb2LGIF56ZUj+MSx/LnBkYXRhOSEndjAgHyvQSsA5KHUiQGDfzLsYyAl6gD2fF3JCXuOgMBSIQi7kYh+A' $_GDIPlus_BitmapCompareX64DLL &= 'cNihJeR43/AIP5mQC7kQIHfDHf8PR0NDOiAoeDg2X6QtcG/MfoNoR3hUamyg/HYwLCBCdcw/PirIdCwg7EdXLVeJ/RctiWr+KSA0LjkuM3+SHwL5d2luMzI1LjIuMFBdiaB/qEIVtH9/hSpoqwHP5qiqFxBNEHDNp/k0UIsSCJAS16fZfJoTHOATLxQsz/M8zTAUNjRAnDy2z/M8oKZI8CWeJCZ57j13Xw6EBlinFqzPe9rnZBAnBrdoFsDZU5rPPXDXLrYoeA5z7yntuykWiA7vBpi/Dp6n+e5ZKuYWYCpjrHBpnu95dLDugCoqtGbzeU8O8V64ACtiLH1K+5TEDmovFtgOFjEpzebBtk4gMQwy+HefZvMOyDMIcdA9NCYW7fM8zUA0vyDAXzVGLJ7SbD5gNTo2NA5ez/M89wY8LxZyQIDEe5rPPUSnFm43SHAOfZ7n3rMGVKcW+2AAONzzvKcGjmgWkMh0d+dpvvsOJTmeFjA53oye53me4OOc8PagVYFP66c7BsqkcekAEFtUL////1MBBQIABTIBMAEMBwAMQggwB2AGcAVQBMACn////9AAAAEKBgAKMgYwBWAEcANQAsABBAEABIIEAppzWf8FBAMBUAEIA9YTJ3fNf91HQq4GAwAGQgJgFs4l33YuUj+3ckLsvf0KBQUK0mgDMAJgn4+kweTbBy9id6K1//8vEQkFEbINAwowCWAIcAfABdAD4K//MKSCtw8IBQAIQgQwxh789wNgAnBfBwQABzIrcEfB2iDYDx9PZ7UR2wZXPxcjDW+097e3bVQQUGsBcxZQRaEAKpBCAVQg5FFEwSfY+CjxSqZURPm1Tk5mjzD0D0ZeemRiT06YrPRvxGTkye3cD/QG9STk5OTkOE5kguTk5OSSprjIMvLk5OLyDvYmcnJyckBWaoRycnJymKrC4G17cnLo/Ar3vw9ut2nLOAFIH1YPZE5OTk5ygIyUTk5OTp6osLpOTk5OxMzU3E9O' $_GDIPlus_BitmapCompareX64DLL &= 'Tk7m8PoE+CcnJyMQGiQuQqGoivjf8qYIgI3wByTNJVMA8BQRO7RVASjwB0UADAg/5BFRLA8Z8ACAW8Z/BKiiJQ8IGUWAzg6ZogFgEXcMKGCkArkBakSqgrmCDiyq6wAAMqCbVcIFnLR44kRlMwn6/2xldGVDcml0aWNhbFPdAdva0dpFbihyK0dUQw5zb2QfmElQTXQfU2NyZZmdvf1lbkJ1ZmZsSW5mbzd1ciqQVIKaBPRjKtsO7NUlSWQpVGgKYWQn0D/MfkxhcmdCvVdpbmRvd1Nva5tJmDkyRWZvcht7zWwHFnVESGEKQSO99pdLkKMfU3RkPbPbt1kbeXplbVRpbVpzRmkoE3lB254xEGNr4HX0AAFJbuBoOMHy4AlMGgpKrUh2Ky9QBFYoyAYkbdS4zw5u9o8cMFJ0bBRGGlHvBP/sVGFi4ClDYXB07k5MeGwR9r90JUxvb2t1cFUEoocnFPQvhVVudwwNbyEVClMfTT9ol2H/KmBo62RFeHswcAUgcKfcKVMoFNZaMyAMVBZtZGEkRcWuPXxUbHMQVth1sH+xwSgoqR9Xno6HCbiQQEdkaQyCBsNwQlAgcLS0HKwF9hJzJ7xsK0PmaDNb/Jw3RrJtpvrL3D+wMDVIQklUTUFQN0s5QQsBPURpcwJlSeIbZE9gI4QbRD4FA8OyMG4mqXDjOXMTfF9fou5uZXgZcft3uDhiX2biFmFtc2dfL2MHD7ttLMxsZsREFuptZmNncBRhDH1wI29wCkWq7B5GL0HL7B4wLg4biHXF7z3eqWZCCndyDm1F3QmWfw5lbWNweYRYCOBswdkuOERwZ24QDnZQ8JoSHG4PTm0idqI/tVBgiD5mGdwrCBjw/B/t/wgE8FAQCAjwMAEQAfBorRgI8OgPCPS/kNQAWmSGCwBjK6Vc9OwfNVcuA7UAIgsCAhkMGFIAxrWNpZr529AA2ttICz97N9IAKwQFGAHgKaAAAe2l9rYBI10ADw0VAAWR' $_GDIPlus_BitmapCompareX64DLL &= 'duAA+GQmCeST/BQAa2AAAPgBIAEAAHD3StopIBAAPihA8rQWPE0AsQFvLusgCCwAFSwYTPa5FfAAphb0UGAuT1gAqey2kPYH1jIATsAuclFH8jwA78AKTlAMNEAAtNuDyC5wx2AAn0BPk8pIMzAAeKxwwbe6kkIAYmwAkFzQpOAAW8mALXA+ZV0Aye1D5+CfRGkAJM97kU8n8E4ACkYmH8RtnkMAUlRSWCo3Q+sAn1BPQHRsc2gAMzScVBBSf2AA7TaF02Uf1yAAT1Tvwr3vHUIANwDLIw75CEoAkiRJAAAAgP8DAAQCAEiJTCQISACJVCQQTIlEJAAYgPoBD4WHAgAAAFNWV1VIjQA1AuH//0iNvgDb3/7/VzHbMYDJSIPN/+hQgBsAAdt0AvPDix4ASIPu/BHbihYA88NIjQQvg/kABYoQdiFIg/0A/Hcbg+kEixAQSIPABAAEiRdIAI1/BHPvg8EEAIoQdBBI/8CIQBeD6QGKEAALAQB18PPD/EFb6wAISP/GiBdI/4DHihYB23UKBy4AcuaNQQHrB//AyEH/0xHAAgILEABz5IPoA3IZwYDgCA+20gnQgCMAg/D/dFjR+EhAY+hyOOsOgBYIoYUWcij/wYoHGAEUAsmJBHPtg8EC6wIFwgVIgf0A+/8A/4PRAuga//8I/+lgAAFeSIn3AlbAAEjHxgAuAAAAsgJTV0iNTAA3/V5WW+svSAA5znMyVl6sPACAcgo8j3cGgAB+/g90BizoPAgBd+TBBhZWrSgA0HXfXw/IKfgIAdirgQQDrOvfQFteSIPsKMBaAAEAlYsHCcB0T4sAXwRIjYwwAFAAAQBIAfNIg8cgCP8VrA/AbJWKAgdASQjAdNdIiQD5SIn6/8jyrsBIien/FZZBB4AOAAlIiQNIg8MIAOvWSIPEKF1f4F5bMcDDgQIAEcAUMF78McCCEIAKIzwA73cRSAHDSIuAA0gPyEgB8IAOAOvgJA/B4BBmBIsHwAsC' $_GDIPlus_BitmapCompareX64DLL &= '6+FIiwwtREEWACfw//+7AAAQAABQSYnhKEG4BEKQ2kEhg+wAIP/VSI2HrwEBgJcgf4BgKH9MgI1MJCBNiwFDCCNABwAgxgU8wAz8SASNjoESagFaTTFQwFDoKcAEWIEpSACNRCSAagBIOUTEdYEUgEyLAKVIEouAp0iLAKrpLcKQ/v/DVgCmdK4ApgCtSIXAdBRRUiRBUMFO/9ABGEFYQFpZ6+Vew8S3CERSAUArAABoxAEMnodBL8cDJQDlCGAQ6wjMMAD/CAEAs1H/BB8A/x8AHwAfAB8AHwAfAB8AHwAHHwAfAAcAkGABAFCrYAAJAJzgAWBsAqngAVaAbAIFALTsAtbkAcYV5ADk7AP07AFnZGkAcGx1cy5kbGwAAEtFUk5FTDMAMi5ETEwAbXMQdmNydOICAABHAaAERGlzcG9zZSBJbWFnZSACZXQAUHJvY0FkZHIAZXNzAABMb2EAZExpYnJhcnkAQQAAVmlydHUEYWwgBHRlY3QAMABleGmgAAEAYyuEpVzhAC5hAQAhEVVlACTgAShgACxgABMQFQAASeAAAABfEEdESVDAE19CaQB0bWFwQ29tcDhhcmWCElMDAIUBAAIUIAfgoeih8KHA+KEIomiicgIfAAcfAB8ADgA=' $_GDIPlus_BitmapCompareX64DLL = _WinAPI_Base64Decode($_GDIPlus_BitmapCompareX64DLL) If @error Then Return SetError(1, 0, 0) Local $tSource = DllStructCreate('byte[' & BinaryLen($_GDIPlus_BitmapCompareX64DLL) & ']') DllStructSetData($tSource, 1, $_GDIPlus_BitmapCompareX64DLL) Local $tDecompress _WinAPI_LZNTDecompress($tSource, $tDecompress, 10240) If @error Then Return SetError(3, 0, 0) $tSource = 0 Local Const $bString = Binary(DllStructGetData($tDecompress, 1)) If $bSaveBinary Then Local Const $hFile = FileOpen($sSavePath & "\_GDIPlus_BitmapCompare_x64.dll", 18) If @error Then Return SetError(2, 0, $bString) FileWrite($hFile, $bString) FileClose($hFile) EndIf Return $bString EndFunc ;==>__GDIPlus_BitmapCompareX64DLL Func _WinAPI_Base64Decode($sB64String) Local $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "ptr", 0, "dword*", 0, "ptr", 0, "ptr", 0) If @error Or Not $aCrypt[0] Then Return SetError(1, 0, "") Local $bBuffer = DllStructCreate("byte[" & $aCrypt[5] & "]") $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "struct*", $bBuffer, "dword*", $aCrypt[5], "ptr", 0, "ptr", 0) If @error Or Not $aCrypt[0] Then Return SetError(2, 0, "") Return DllStructGetData($bBuffer, 1) EndFunc ;==>_WinAPI_Base64Decode Func _WinAPI_LZNTDecompress(ByRef $tInput, ByRef $tOutput, $iBufferSize) $tOutput = DllStructCreate("byte[" & $iBufferSize & "]") If @error Then Return SetError(1, 0, 0) Local $aRet = DllCall("ntdll.dll", "uint", "RtlDecompressBuffer", "ushort", 0x0002, "struct*", $tOutput, "ulong", $iBufferSize, "struct*", $tInput, "ulong", DllStructGetSize($tInput), "ulong*", 0) If @error Then Return SetError(2, 0, 0) If $aRet[0] Then Return SetError(3, $aRet[0], 0) Return $aRet[6] EndFunc ;==>_WinAPI_LZNTDecompress The DLL will be extracted and saved to the script dir when it doesn't exist. Don't forget to change the path to the images in lines 15 / 16. Edited April 3, 2019 by UEZ Small update 2019-04-03 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!¯\_(ツ)_/¯ ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ Link to comment Share on other sites More sharing options...
jvds Posted April 1, 2019 Author Share Posted April 1, 2019 It works really well now, it does exacly what i want, only problem is my mask. i create a black and white bitmap (line 58 $Bmp6_Buffer = _CreateNewDIB_Bitmap) copy the buffer that hold the image that was $SRCINVERT in to the new black and white image and i have the mask it possible to tell the structure in _CreateNewDIB_Bitmap to thread all pixels as white and only true black pixels as black here? Switch $BitCount Case 1 DllStructSetData($tBITMAPINFO, 'RGBQuad', BitOR(BitShift(0xFF, -16), BitShift(0xFF, -8), 0xFF), 2) Or maybe with this operators? how do i set the hDest brush or the hdcDest? ;~ $PATCOPY - Copies the brush selected in hdcDest, into the destination bitmap ;~ $MERGECOPY - Merges the color of the source rectangle with the brush currently selected in hDest, by using the AND operator. ;~ $PATINVERT - Combines the colors of the brush currently selected in hDest, with the colors of the destination rectangle by using the XOR operator. ;~ $PATPAINT - Combines the colors of the brush currently selected in hDest, with the colors of the inverted source rectangle by using the OR operator. The result of this operation is combined with the color of the destination rectangle by using the OR operator. delaying the script between captures 400ms it clearly does what i intend here is the sript, expandcollapse popup#include <GUIConstantsEx.au3> #include <ScreenCapture.au3> #include <WindowsConstants.au3> AutoItSetOption("GUIOnEventMode", 1) $ColorDepth = 32 $secondaryBitmap = 32 $Width = @DesktopWidth / 2 $Height = @DesktopHeight / 2 $Form = GUICreate("GUI", $Width, $Height, -1, -1, $WS_MINIMIZEBOX+ $WS_CAPTION+ $WS_POPUP+ $WS_SYSMENU+$WS_SIZEBOX) $Pic = GUICtrlCreatePic("", 0, 0, 255, 255) GUICtrlSetResizing($Pic, $GUI_DOCKLEFT+$GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKBOTTOM) GUISetState(@SW_SHOW) Local $hWnd = _WinAPI_GetDesktopWindow() Local $hDDC = _WinAPI_GetDC($hWnd) Local $Bmp1_DibHandle Local $Bmp1_DibHandleObj Local $Bmp1_ptr Local $Bmp1_Buffer = _CreateNewDIB_Bitmap(@DesktopWidth, @DesktopHeight,$ColorDepth,$Bmp1_ptr,$Bmp1_DibHandle,$Bmp1_DibHandleObj) _WinAPI_SetStretchBltMode($Bmp1_Buffer, $COLORONCOLOR) Local $Bmp2_DibHandle Local $Bmp2_DibHandleObj Local $Bmp2_ptr Local $Bmp2_Buffer = _CreateNewDIB_Bitmap($Width, $Height,$secondaryBitmap,$Bmp2_ptr,$Bmp2_DibHandle,$Bmp2_DibHandleObj) ;~ Local $Bmp2_Buffer = _CreateNewDIB_Bitmap($Width, $Height,32,$Bmp2_ptr,$Bmp2_DibHandle,$Bmp2_DibHandleObj) ;~ _WinAPI_SetStretchBltMode($Bmp2_Buffer, $BLACKONWHITE) ;~ _WinAPI_SetStretchBltMode($Bmp2_Buffer, $COLORONCOLOR) _WinAPI_SetStretchBltMode($Bmp2_Buffer, $HALFTONE) ;~ _WinAPI_SetStretchBltMode($Bmp2_Buffer, $WHITEONBLACK) Local $Bmp3_DibHandle Local $Bmp3_DibHandleObj Local $Bmp3_ptr Local $Bmp3_Buffer = _CreateNewDIB_Bitmap($Width, $Height,$secondaryBitmap,$Bmp3_ptr,$Bmp3_DibHandle,$Bmp3_DibHandleObj) Local $Bmp4_DibHandle Local $Bmp4_DibHandleObj Local $Bmp4_ptr Local $Bmp4_Buffer = _CreateNewDIB_Bitmap($Width, $Height,$secondaryBitmap,$Bmp4_ptr,$Bmp4_DibHandle,$Bmp4_DibHandleObj) Local $Bmp5_DibHandle Local $Bmp5_DibHandleObj Local $Bmp5_ptr Local $Bmp5_Buffer = _CreateNewDIB_Bitmap($Width, $Height,$secondaryBitmap,$Bmp5_ptr,$Bmp5_DibHandle,$Bmp5_DibHandleObj) Local $Bmp6_DibHandle Local $Bmp6_DibHandleObj Local $Bmp6_ptr Local $Bmp6_Buffer = _CreateNewDIB_Bitmap($Width, $Height,1,$Bmp6_ptr,$Bmp6_DibHandle,$Bmp6_DibHandleObj) Local $Bmp7_DibHandle Local $Bmp7_DibHandleObj Local $Bmp7_ptr Local $Bmp7_Buffer = _CreateNewDIB_Bitmap($Width, $Height,1,$Bmp7_ptr,$Bmp7_DibHandle,$Bmp7_DibHandleObj) Local $BmpOld_ptr Local $BmpOld_DibHandle Local $BmpOld_DibHandleObj Local $BmpOld_Buffer = _CreateNewDIB_Bitmap($Width, $Height,$secondaryBitmap,$BmpOld_ptr,$BmpOld_DibHandle,$BmpOld_DibHandleObj) Local $BmpNew_ptr Local $BmpNew_DibHandle Local $BmpNew_DibHandleObj Local $BmpNew_Buffer = _CreateNewDIB_Bitmap($Width, $Height,$secondaryBitmap,$BmpNew_ptr,$BmpNew_DibHandle,$BmpNew_DibHandleObj) $Switch=true GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit") $hCtrl = GUICtrlGetHandle($Pic) $hGUI_DC = _WinAPI_GetDC($hCtrl) $test=0 ;~ Specifies a raster operation code. These codes define how the color data for the source rectangle is to be combined with the color data for the destination rectangle to achieve the final color: ;~ $BLACKNESS - Fills the destination rectangle using the color associated with palette index 0 ;~ $CAPTUREBLT - Includes any window that are layered on top of your window in the resulting image ;~ $DSTINVERT - Inverts the destination rectangle ;~ $MERGECOPY - Merges the color of the source rectangle with the brush currently selected in hDest, by using the AND operator. ;~ $MERGEPAINT - Merges the color of the inverted source rectangle with the colors of the destination rectangle by using the OR operator. ;~ $NOMIRRORBITMAP - Prevents the bitmap from being mirrored ;~ $NOTSRCCOPY - Copies the inverted source rectangle to the destination ;~ $NOTSRCERASE - Combines the colors of the source and destination rectangles by using the OR operator and then inverts the resultant color. ;~ $PATCOPY - Copies the brush selected in hdcDest, into the destination bitmap ;~ $PATINVERT - Combines the colors of the brush currently selected in hDest, with the colors of the destination rectangle by using the XOR operator. ;~ $PATPAINT - Combines the colors of the brush currently selected in hDest, with the colors of the inverted source rectangle by using the OR operator. The result of this operation is combined with the color of the destination rectangle by using the OR operator. ;~ $SRCAND - Combines the colors of the source and destination rectangles by using the AND operator ;~ $SRCCOPY - Copies the source rectangle directly to the destination rectangle ;~ $SRCERASE - Combines the inverted color of the destination rectangle with the colors of the source rectangle by using the AND operator. ;~ $SRCINVERT - Combines the colors of the source and destination rectangles by using the XOR operator ;~ $SRCPAINT - Combines the colors of the source and destination rectangles by using the OR operator ;~ $WHITENESS - Fills the destination rectangle using the color associated with index 1 in the physical palette. While 1 $Timer = TimerInit() _WinAPI_BitBlt($Bmp3_Buffer, 0, 0, $Width, $Height, $Bmp2_Buffer, 0, 0, $SRCCOPY) ;~ _WinAPI_BitBlt($hGUI_DC, 0, 0, $Width, $Height, $Bmp3_Buffer, 0, 0,$SRCCOPY ) ;~ sleep(2000) ;~ _WinAPI_BitBlt($Bmp1_Buffer, 0, 0, @DesktopWidth, @DesktopHeight, $hDDC, @DesktopWidth, 0, $SRCCOPY) ;get the mew image _WinAPI_BitBlt($Bmp1_Buffer, 0, 0, @DesktopWidth, @DesktopHeight, $hDDC, 0, 0, $SRCCOPY) _WinAPI_StretchBlt($Bmp2_Buffer, 0, 0, $Width, $Height, $Bmp1_Buffer, 0, 0, @DesktopWidth, @DesktopHeight, $SRCCOPY);resize new image _WinAPI_BitBlt($Bmp3_Buffer, 0, 0, $Width, $Height, $Bmp2_Buffer, 0, 0, $SRCINVERT) ;$SRCINVERT the new and old image so the changed pixels are any other color exept black, ;~ _WinAPI_BitBlt($hGUI_DC, 0, 0, $Width, $Height, $Bmp3_Buffer, 0, 0,$SRCCOPY ) ;~ sleep(2000) ;~ GET $BmpX_Buffer white black pixels on the image ;~ _WinAPI_BitBlt($Bmp3_Buffer, 0, 0, $Width, $Height, $BmpX_Buffer, 0, 0, $MERGEPAINT) ;Merge the two images to get the mask, blackmask covers pixels that did not change(will give problems with real black pixels probably) ;~ _WinAPI_BitBlt($hGUI_DC, 0, 0, $Width, $Height, $Bmp3_Buffer, 0, 0,$SRCCOPY ) ;~ sleep(2000) ;creating the mask Mode 2, not working good _WinAPI_BitBlt($Bmp6_Buffer, 0, 0, $Width, $Height, $Bmp3_Buffer, 0, 0, $SRCCOPY) ;Draw the mask using the older image in to a Black white pixel bitmap, not a perfect mask but to test out if it will work ;~ _WinAPI_BitBlt($hGUI_DC, 0, 0, $Width, $Height, $Bmp6_Buffer, 0, 0,$SRCCOPY ) ;~ sleep(2000) _WinAPI_BitBlt($Bmp5_Buffer, 0, 0, $Width, $Height, $Bmp6_Buffer, 0, 0, $SRCCOPY) ;copy mask to a color bitmap, ;~ _WinAPI_BitBlt($hGUI_DC, 0, 0, $Width, $Height, $Bmp5_Buffer, 0, 0,$SRCCOPY ) ;~ sleep(2000) _WinAPI_BitBlt($Bmp5_Buffer, 0, 0, $Width, $Height, $Bmp2_Buffer, 0, 0, $SRCAND) ;$SRCAND the new image with the mask, changed pixels will be in color, unchanged pixels will be black _WinAPI_BitBlt($hGUI_DC, 0, 0, $Width, $Height, $Bmp5_Buffer, 0, 0,$SRCCOPY ) ;~ sleep(8000) sleep(100) ;~ $test+=1 ;~ if $test=50 Then ;~ $filename = @ScriptDir & "\Complete Image.Png" ;~ _ScreenCapture_SaveImage($filename, $Bmp2_DibHandle) ;~ $filename = @ScriptDir & "\black with changed pixels Image.Png" ;~ _ScreenCapture_SaveImage($filename, $Bmp5_DibHandle) ;~ Exit ;~ EndIf ;~ ;up to here seems to be good, true black pixels will give a problem, fix later ;~ Exit WEnd Func _CreateNewDIB_Bitmap($Width, $Height,$BitCount, ByRef $ptrbmp, ByRef $DibHandle, ByRef $DibHandle_Obj) Local $tBITMAPINFO = DllStructCreate("dword Size; long Width; long Height; word Planes; word BitCount; dword Compression; dword SizeImage; long XPelsPerMeter; long YPelsPerMeter; dword ClrUsed; dword ClrImportant; dword RGBQuad[256];") DllStructSetData($tBITMAPINFO, 'Size', 40) DllStructSetData($tBITMAPINFO, 'Width', $Width) DllStructSetData($tBITMAPINFO, 'Height', -$Height) DllStructSetData($tBITMAPINFO, 'Planes', 1) DllStructSetData($tBITMAPINFO, 'BitCount', $BitCount) Local $iColorCnt = BitShift(1, -$BitCount) DllStructSetData($tBITMAPINFO, 'ClrUsed', $iColorCnt) DllStructSetData($tBITMAPINFO, 'ClrImportant', $iColorCnt) Switch $BitCount Case 1 DllStructSetData($tBITMAPINFO, 'RGBQuad', BitOR(BitShift(0xFF, -16), BitShift(0xFF, -8), 0xFF), 2) Case 4 Local $aCol[16] = [8, 24, 38, 56, 72, 88, 104, 120, 136, 152, 168, 184, 210, 216, 232, 248] For $i = 0 To 15 DllStructSetData($tBITMAPINFO, 'RGBQuad', BitOR(BitShift($aCol[$i], -16), BitShift($aCol[$i], -8), $aCol[$i]), $i + 1) Next ;~ Case 4 ;~ Local $aCol[16] = [16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 216, 232, 248] ;~ For $i = 0 To 15 ;~ DllStructSetData($tBITMAPINFO, 'RGBQuad', BitOR(BitShift($aCol[$i], -16), BitShift($aCol[$i], -8), $aCol[$i]), $i + 1) ;~ Next ;~ Case 8 ;~ ; Windows reserves first color for white, ;~ DllStructSetData($tBITMAPINFO, 'RGBQuad', 255, 1) ;~ ; and last color as black! ;~ DllStructSetData($tBITMAPINFO, 'RGBQuad', 0, 255) ;~ Local $iColor = 10 ;~ For $i = 20 To $iColorCnt - 22 ;first 20 and last 20 are reserved! ;~ DllStructSetData($tBITMAPINFO, 'RGBQuad', BitOR(BitShift($i, -16), BitShift($i, -8), $i*$iColor), $i + 1) ;~ Next Case 8 ; Windows reserves first color for white, $tBITMAPINFO.RGBQuad((0)) = 0xFFFFFF ; and last color as black! $tBITMAPINFO.RGBQuad((0xFF)) = 0x000000 Local $iColor = 20, $iRed, $iGreen, $iBlue For $iRed = 0 To 255 Step 51 For $iGreen = 0 To 255 Step 51 For $iBlue = 0 To 255 Step 51 $tBITMAPINFO.RGBQuad(($iColor)) = BitShift($iRed, -16) + BitShift($iGreen, -8) + $iBlue $iColor += 1 Next Next Next EndSwitch Local $hDCbuffer = _WinAPI_CreateCompatibleDC(0) $DibHandle = _WinAPI_CreateDIBSection(0, $tBITMAPINFO, $DIB_RGB_COLORS, $ptrbmp) ;~ $DibHandle = _WinAPI_CreateDIBSection(0, $tBMI, $DIB_RGB_COLORS, $ptrbmp) $DibHandle_Obj=_WinAPI_SelectObject($hDCbuffer, $DibHandle) Return $hDCbuffer EndFunc ;==>_CreateNewDIB_Bitmap Func _Exit() _WinAPI_ReleaseDC($hWnd, $hDDC) GUIDelete() Exit EndFunc ;==>_Exit ;~ Func _DeleteBitmap32($DC, $ptr, $hbmp) ;~ $ptr = 0 ;~ EndFunc Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now