Jump to content

compare images and draw only the changed pixels on to a black image


jvds
 Share

Recommended Posts

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 🤣 

#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

double.jpg

Edited by jvds
image
Link to comment
Share on other sites

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

 

dsimple.jpg

Link to comment
Share on other sites

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

csample.jpg.37daa37745121c0b08cbd45b01e37fdc.jpg

then $SRCAND the newer newer image with the black mask, and i get the changed pixels in full color

dsample.jpg.0ef56a174991845f9474d47478a30955.jpg

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

I've written a DLL which compares two GDI+ images and saves the differences in a new bitmap. Maybe it's useful for you.

;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 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

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
eSample.png.eb77ae9dd18a9756e61183ef39923c57.png


here is the sript,

#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

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
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...