Jump to content

Recommended Posts

  • Moderators

I know there are snippet threads, but I'd like this one to be specific.

I've see quite a few neat GDI+ code snippets (UEZ and Progandy come to mind first) to manipulate, create, etc, and I thought it'd be neat to be able to find them under one thread.

I'm going to reserve the next 3 posts because I'm unsure at the moment if it's the "Quote" or "Spoiler" bbcode tags that has the 10 limit.

You can link or post the snippets you find or create and I'll title them and put them in the threads for everyone to find. ( Going to have to remember to edit with regular editor! )

Some of these may not have titles, so I may create my own, if the author(s) want(s) a different one, let me know.

_GDIPlus_WaterMark.au3 - Author: UEZ - Added: 2012-10-13 - Updated:

;coded by UEZ build 2012-08-10 beta
;updated by UEZ ( x&y position ) 2012-10-13 beta
#include-once
#include <GDIPlus.au3>

#cs - Example
_GDIPlus_Startup()
$sIn = StringReplace(@AutoItExe, "autoit3.exe", "ExamplesGUImsoobe.jpg")
$sOut = @ScriptDir & "Watermarked.jpg"

$r = _GDIPlus_WatermarkImage($sIn, $sOut, "Watermarked by UEZ", 170, 50, "Arial", 64, 45)

_GDIPlus_Shutdown()

If $r Then ShellExecute($sOut)
Exit
#ce

;======================================================================================
; Function Name:         _GDIPlus_WatermarkImage
; Description:           adds a text to an image
;
; Parameters:            $sBitmapFile: image file to load
;                                    $sSave: filename for saved image -> if no extension (jpg, bmp, png, gif, tif) is given the default is png image format
;                                    $sText: text string to draw onto the image
;                                    $iX: x position of the text on the image
;                                    $iY: y position of the text on the image
;                                    $sFontName: font name to use
;                                    $iFontSize: size of the font
; Optional:                  $fAngle: angle of the text -> 0° - 359°
;                                        $iFontColor: color of the text
;                                        $fAlpha: alpha channel of the text -> 0.0 (transparent) - 1.0 (opaque)
;                                        $iJPGQuality: JPG save quality -> 0 (worst) - 100 (best)
;
; Requirement(s):    GDIPlus.au3
; Return Value(s):   Success: 1
;                                    Error:
; Error codes:           1: image file to load not found
;                                    2: unable to create bitmap from loaded image
;                                    3: unable to save watermarked image
;
; Remark:                    don't forget to start _GDIPlus_Startup() / _GDIPlus_Shutdown()
;
; Author(s):                 UEZ
; Version:                   v0.99 Build 2012-10-13 Beta
;=======================================================================================
Func _GDIPlus_WatermarkImage($sBitmapFile, $sSave, $sText, $iX, $iY, $sFontName, $iFontSize, $fAngle = 0, $iFontColor = 0xFFFFFF, $fAlpha = 0.04, $iJPGQuality = 90)
    If Not FileExists($sBitmapFile) Then Return SetError(1, 0, 0)
    Local $hBitmap = _GDIPlus_BitmapCreateFromFile($sBitmapFile)
    If Not $hBitmap Then Return SetError(2, 0, 0)
    If $fAlpha < 0 Then $fAlpha = 0
    If $fAlpha > 1 Then $fAlpha = 1
    Local $hCtxt = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    Local $hBrush = _GDIPlus_BrushCreateSolid(BitShift(Int($fAlpha * 0xFF), -24)  + $iFontColor)
    Local $hFormat = _GDIPlus_StringFormatCreate()
    Local $hFamily = _GDIPlus_FontFamilyCreate($sFontName)
    Local $hFont = _GDIPlus_FontCreate($hFamily, $iFontSize, 0)
    Local $tLayout = _GDIPlus_RectFCreate(0, 0, 0, 0)
    Local $aMeasure = _GDIPlus_GraphicsMeasureString($hCtxt, $sText, $hFont, $tLayout, $hFormat)
    If Not $fAngle Then
        _GDIPlus_GraphicsSetSmoothingMode($hCtxt, 2)
        DllCall($ghGDIPDll, "uint", "GdipSetTextRenderingHint", "handle", $hCtxt, "int", 4)
        DllStructSetData($tLayout, "x", $iX)
        DllStructSetData($tLayout, "y", $iY)
        _GDIPlus_GraphicsDrawStringEx($hCtxt, $sText, $hFont, $tLayout, $hFormat, $hBrush)
    Else
        $fAngle = Mod($fAngle, 360)
        Local $iW = Int(DllStructGetData($aMeasure[0], "width") * 2), $iH = Int(DllStructGetData($aMeasure[0], "height") * 2), $iQ
        If $iW > $iH Then
            $iQ = $iW
        Else
            $iQ = $iH
        EndIf
        Local $hBitmap_Rot = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iQ, "int", $iQ, "int", 0, "int", 0x0026200A, "ptr", 0, "int*", 0)
        $hBitmap_Rot = $hBitmap_Rot[6]
        Local $hCtxt_Rot = _GDIPlus_ImageGetGraphicsContext($hBitmap_Rot)
        _GDIPlus_GraphicsSetSmoothingMode($hCtxt_Rot, 2)
        DllCall($ghGDIPDll, "uint", "GdipSetTextRenderingHint", "handle", $hCtxt_Rot, "int", 4)
        Local $hMatrix = _GDIPlus_MatrixCreate()
        _GDIPlus_MatrixTranslate($hMatrix, $iQ / 2, $iQ / 2)
        _GDIPlus_MatrixRotate($hMatrix, $fAngle, False)
        _GDIPlus_MatrixTranslate($hMatrix, -$iQ / 2, -$iQ / 2)
        _GDIPlus_GraphicsSetTransform($hCtxt_Rot, $hMatrix)
        DllStructSetData($tLayout, "x", $iQ / 2)
        DllStructSetData($tLayout, "y", $iQ / 2)
        _GDIPlus_GraphicsDrawStringEx($hCtxt_Rot, $sText, $hFont, $tLayout, $hFormat, $hBrush)
        _GDIPlus_GraphicsDrawImageRect($hCtxt, $hBitmap_Rot, $iX - $iQ / 2, $iY - $iQ / 2, $iQ, $iQ)
        _GDIPlus_MatrixDispose($hMatrix)
        _GDIPlus_GraphicsDispose($hCtxt_Rot)
        _GDIPlus_BitmapDispose($hBitmap_Rot)
    EndIf
    Local $bRes
    If StringRight($sSave, 4) = ".jpg" Then
        Local Const $sCLSID = _GDIPlus_EncodersGetCLSID("JPG")
        Local $tParams = _GDIPlus_ParamInit(1)
        Local $tData = DllStructCreate("int Quality")
        If $iJPGQuality < 0 Then $iJPGQuality = 0
        If $iJPGQuality > 100 Then $iJPGQuality = 100
        DllStructSetData($tData, "Quality", $iJPGQuality)
        Local $pData = DllStructGetPtr($tData)
        _GDIPlus_ParamAdd($tParams, $GDIP_EPGQUALITY, 1, $GDIP_EPTLONG, $pData)
        Local Const $pParams = DllStructGetPtr($tParams)
        $bRes = _GDIPlus_ImageSaveToFileEx($hBitmap, $sSave, $sCLSID, $pParams)
        $tData = 0
        $tParams = 0
    Else
        StringRegExp($sSave, ".*.(gif|png|bmp|tif)", 1)
        If @error Then
            If StringRight($sSave, 1) = "." Then
                $sSave &= "png"
            Else
                $sSave &= ".png"
            EndIf
        EndIf
        $bRes = _GDIPlus_ImageSaveToFile($hBitmap, $sSave)
    EndIf
    Local $err
    If Not $bRes Then $err = 3
    _GDIPlus_FontDispose($hFont)
    _GDIPlus_FontFamilyDispose($hFamily)
    _GDIPlus_StringFormatDispose($hFormat)
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_GraphicsDispose($hCtxt)
    _GDIPlus_BitmapDispose($hBitmap)
    $tLayout = 0
    If $err Then Return SetError($err, 0, 0)
    Return 1
EndFunc

_GDIPlus_BMPFromMemory – Author UEZ – Added: 2012-10-14 – Updated:

; Smoke_N only changed function name
#include-once
#include <Memory.au3>
#include <GDIPlus.au3>

;======================================================================================
; Function Name:        _GDIPlus_BMPFromMemory
; Description:            Loads an image which is saved as a binary string and converts it to a bitmap or hbitmap
;
; Parameters:              $bImage:    the binary string which contains any valid image which is supported by GDI+
; Optional:                  $hHBITMAP:  if false a bitmap will be created, if true a hbitmap will be created
;
; Remark:                      hbitmap format is used generally for GUI internal images, $bitmap is more a GDI+ image format
;                                      Don't forget _GDIPlus_Startup() and _GDIPlus_Shutdown()
;
; Requirement(s):      GDIPlus.au3, Memory.au3 and _WinAPI_BitmapCreateDIBFromBitmap() from WinAPIEx.au3
; Return Value(s):    Success: handle to bitmap (GDI+ bitmap format) or hbitmap (WinAPI bitmap format),
;                                      Error: 0
; Error codes:            1: $bImage is not a binary string
;                                      2: unable to create stream on HGlobal
;                                      3: unable to create bitmap from stream
;
; Author(s):                    UEZ
; Additional Code:    thanks to progandy for the MemGlobalAlloc and tVARIANT lines and
;                                      Yashied for _WinAPI_BitmapCreateDIBFromBitmap() from WinAPIEx.au3
; Version:                    v0.98 Build 2012-08-29 Beta
;=======================================================================================
Func _GDIPlus_BMPFromMemory($bImage, $hHBITMAP = False)
    If Not IsBinary($bImage) Then Return SetError(1, 0, 0)
    Local $aResult
    Local Const $memBitmap = Binary($bImage) ;load image  saved in variable (memory) and convert it to binary
    Local Const $len = BinaryLen($memBitmap) ;get length of image
    Local Const $hData = _MemGlobalAlloc($len, $GMEM_MOVEABLE) ;allocates movable memory  ($GMEM_MOVEABLE = 0x0002)
    Local Const $pData = _MemGlobalLock($hData) ;translate the handle into a pointer
    Local $tMem = DllStructCreate("byte[" & $len & "]", $pData) ;create struct
    DllStructSetData($tMem, 1, $memBitmap) ;fill struct with image data
    _MemGlobalUnlock($hData) ;decrements the lock count  associated with a memory object that was allocated with GMEM_MOVEABLE
    $aResult = DllCall("ole32.dll", "int", "CreateStreamOnHGlobal", "handle", $pData, "int", True, "ptr*", 0) ;Creates a stream object that uses an HGLOBAL memory handle to store the stream contents
    If @error Then Return SetError(2, 0, 0)
    Local Const $hStream = $aResult[3]
    $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromStream", "ptr", $hStream, "int*", 0) ;Creates a Bitmap object based on an IStream COM interface
    If @error Then Return SetError(3, 0, 0)
    Local Const $hBitmap = $aResult[2]
    Local $tVARIANT = DllStructCreate("word vt;word r1;word r2;word r3;ptr data; ptr")
    DllCall("oleaut32.dll", "long", "DispCallFunc", "ptr", $hStream, "dword", 8 + 8 * @AutoItX64, _
                                           "dword", 4, "dword", 23, "dword", 0, "ptr", 0, "ptr", 0, "ptr", DllStructGetPtr($tVARIANT)) ;release memory from $hStream to avoid memory leak
    $tMem = 0
    $tVARIANT = 0
    If $hHBITMAP Then
        Local Const $hHBmp = _WinAPI_BitmapCreateDIBFromBitmap($hBitmap)
        _GDIPlus_BitmapDispose($hBitmap)
        Return $hHBmp
    EndIf
    Return $hBitmap
EndFunc   ;==>_GDIPlus_BMPFromMemory

Example – Needle Movement (4bit example provided, link to 32bit found in code) – Author: UEZ - Added: 2012-10-14 – Updated:

;coded by UEZ 2012 build 2012-09-26
;link to 32bit photo example
#include <GUIConstantsEx.au3>
#include <Memory.au3>
#include <GDIPlus.au3>
Opt("GUIOnEventMode", 1)

_GDIPlus_Startup()

Global Const $hBitmap_bg = Load_BMP_From_Mem(_Speedometer())
Global Const $iW = _GDIPlus_ImageGetWidth($hBitmap_bg), $iH = _GDIPlus_ImageGetHeight($hBitmap_bg)
Global Const $hGUI = GUICreate("GDI+ Speedometer by UEZ 2012", $iW / 2, $iH / 2)
GUISetBkColor(0xABCDEF, $hGUI)
GUISetState()
Global Const $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
Global Const $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iW, $iH, $hGraphic)
Global Const $hCtxt = _GDIPlus_ImageGetGraphicsContext($hBitmap)
_GDIPlus_GraphicsSetSmoothingMode($hCtxt, 2)
DllCall($ghGDIPDll, "uint", "GdipSetTextRenderingHint", "handle", $hCtxt, "int", 4)
Global Const $iRadius = 300
Global Const $iNeedle_size = 16
Global Const $fCenter_x = $iW / 2, $fCenter_y = $iH / 2
Global Const $hPen_needle = _GDIPlus_PenCreate(0xFFFF0000, $iNeedle_size)
Global Const $hCap = _GDIPlus_ArrowCapCreate(1, 1)
    _GDIPlus_PenSetCustomEndCap($hPen_needle, $hCap)

Global Const $hBrush = _GDIPlus_BrushCreateSolid(0xFF000000)
Global Const $fRad2Deg = ACos(-1) / 180
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")

Global Const $fDegMin = -223.5, $fDegMax = 44
Global $fDeg = $fDegMin, $fAcc = 0.75, $fKMH, $fMPH


Do
    _GDIPlus_GraphicsDrawImageRect($hCtxt, $hBitmap_bg, 0, 0, $iW, $iH)
    DllCall($ghGDIPDll, "int", "GdipDrawLine", "handle", $hCtxt, "handle", $hPen_needle, "float", $fCenter_x, "float", $fCenter_y, "float", $fCenter_x + Cos($fDeg * $fRad2Deg) * $iRadius, "float", $fCenter_y + Sin($fDeg * $fRad2Deg) * $iRadius)
    _GDIPlus_GraphicsFillEllipse($hCtxt, $fCenter_x - $iNeedle_size, $fCenter_y - $iNeedle_size, $iNeedle_size * 2, $iNeedle_size * 2, $hBrush)
    _GDIPlus_GraphicsDrawString($hCtxt, StringFormat("%.3i MPH", $fMPH), 240, 520, "Times New Roman", 24)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iW / 2, $iH / 2)
    If $fDeg < $fDegMax Then
        $fDeg += $fAcc
        $fKMH = (249.5 + $fDeg) / 1.33333
        $fMPH = Int($fKMH * 0.621371)
        $fAcc *= 1.005^2
    EndIf
Until Not Sleep(20)


Func _Exit()
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_ArrowCapDispose($hCap)
    _GDIPlus_PenDispose($hPen_needle)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_GraphicsDispose($hCtxt)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_BitmapDispose($hBitmap_bg)
    _GDIPlus_Shutdown()
    GUIDelete()
    Exit
EndFunc

#region
;======================================================================================
; Function Name:        Load_BMP_From_Mem
; Description:            Loads an image which is saved as a binary string and converts it to a bitmap or hbitmap
;
; Parameters:              $bImage:    the binary string which contains any valid image which is supported by GDI+
; Optional:                  $hHBITMAP:  if false a bitmap will be created, if true a hbitmap will be created
;
; Remark:                      hbitmap format is used generally for GUI internal images, $bitmap is more a GDI+ image format
;                                      Don't forget _GDIPlus_Startup() and _GDIPlus_Shutdown()
;
; Requirement(s):      GDIPlus.au3, Memory.au3 and _WinAPI_BitmapCreateDIBFromBitmap() from WinAPIEx.au3
; Return Value(s):    Success: handle to bitmap (GDI+ bitmap format) or hbitmap (WinAPI bitmap format),
;                                      Error: 0
; Error codes:            1: $bImage is not a binary string
;                                      2: unable to create stream on HGlobal
;                                      3: unable to create bitmap from stream
;
; Author(s):                    UEZ
; Additional Code:    thanks to progandy for the MemGlobalAlloc and tVARIANT lines and
;                                      Yashied for _WinAPI_BitmapCreateDIBFromBitmap() from WinAPIEx.au3
; Version:                    v0.98 Build 2012-08-29 Beta
;=======================================================================================
Func Load_BMP_From_Mem($bImage, $hHBITMAP = False)
    If Not IsBinary($bImage) Then Return SetError(1, 0, 0)
    Local $aResult
    Local Const $memBitmap = Binary($bImage) ;load image  saved in variable (memory) and convert it to binary
    Local Const $len = BinaryLen($memBitmap) ;get length of image
    Local Const $hData = _MemGlobalAlloc($len, $GMEM_MOVEABLE) ;allocates movable memory  ($GMEM_MOVEABLE = 0x0002)
    Local Const $pData = _MemGlobalLock($hData) ;translate the handle into a pointer
    Local $tMem = DllStructCreate("byte[" & $len & "]", $pData) ;create struct
    DllStructSetData($tMem, 1, $memBitmap) ;fill struct with image data
    _MemGlobalUnlock($hData) ;decrements the lock count  associated with a memory object that was allocated with GMEM_MOVEABLE
    $aResult = DllCall("ole32.dll", "int", "CreateStreamOnHGlobal", "handle", $pData, "int", True, "ptr*", 0) ;Creates a stream object that uses an HGLOBAL memory handle to store the stream contents
    If @error Then Return SetError(2, 0, 0)
    Local Const $hStream = $aResult[3]
    $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromStream", "ptr", $hStream, "int*", 0) ;Creates a Bitmap object based on an IStream COM interface
    If @error Then Return SetError(3, 0, 0)
    Local Const $hBitmap = $aResult[2]
    Local $tVARIANT = DllStructCreate("word vt;word r1;word r2;word r3;ptr data; ptr")
    DllCall("oleaut32.dll", "long", "DispCallFunc", "ptr", $hStream, "dword", 8 + 8 * @AutoItX64, _
                                           "dword", 4, "dword", 23, "dword", 0, "ptr", 0, "ptr", 0, "ptr", DllStructGetPtr($tVARIANT)) ;release memory from $hStream to avoid memory leak
    $tMem = 0
    $tVARIANT = 0
    If $hHBITMAP Then
        Local Const $hHBmp = _WinAPI_BitmapCreateDIBFromBitmap($hBitmap)
        _GDIPlus_BitmapDispose($hBitmap)
        Return $hHBmp
    EndIf
    Return $hBitmap
EndFunc   ;==>Load_BMP_From_Mem

Func _WinAPI_BitmapCreateDIBFromBitmap($hBitmap) ;create 32-bit bitmap v5 (alpha channel supported)
    Local $tBIHDR, $aRet, $tData, $pBits, $hResult = 0
    $aRet = DllCall($ghGDIPDll, 'uint', 'GdipGetImageDimension', 'ptr', $hBitmap, 'float*', 0, 'float*', 0)
    If (@error) Or ($aRet[0]) Then Return 0
    $tData = _GDIPlus_BitmapLockBits($hBitmap, 0, 0, $aRet[2], $aRet[3], $GDIP_ILMREAD, $GDIP_PXF32ARGB)
    $pBits = DllStructGetData($tData, 'Scan0')
    If Not $pBits Then Return 0
    $tBIHDR = DllStructCreate(  'dword bV5Size;long bV5Width;long bV5Height;word bV5Planes;word bV5BitCount;dword bV5Compression;' & _ ;http://msdn.microsoft.com/en-us/library/windows/desktop/dd183381(v=vs.85).aspx
                                                                'dword bV5SizeImage;long bV5XPelsPerMeter;long bV5YPelsPerMeter;dword bV5ClrUsed;dword bV5ClrImportant;'  & _
                                                                'dword bV5RedMask;dword bV5GreenMask;dword bV5BlueMask;dword bV5AlphaMask;dword bV5CSType;' & _
                                                             'int bV5Endpoints[3];dword bV5GammaRed;dword bV5GammaGreen;dword bV5GammaBlue;dword bV5Intent;' & _
                                                                'dword bV5ProfileData;dword bV5ProfileSize;dword bV5Reserved')
    DllStructSetData($tBIHDR, 'bV5Size', DllStructGetSize($tBIHDR))
    DllStructSetData($tBIHDR, 'bV5Width', $aRet[2])
    DllStructSetData($tBIHDR, 'bV5Height', $aRet[3])
    DllStructSetData($tBIHDR, 'bV5Planes', 1)
    DllStructSetData($tBIHDR, 'bV5BitCount', 32)
    DllStructSetData($tBIHDR, 'bV5Compression', 0) ; $BI_BITFIELDS = 3, $BI_RGB = 0, $BI_RLE8 = 1, $BI_RLE4 = 2, $RGBA = 0x41424752
    DllStructSetData($tBIHDR, 'bV5SizeImage', $aRet[3] * DllStructGetData($tData, 'Stride'))
    DllStructSetData($tBIHDR, 'bV5AlphaMask', 0xFF000000)
    DllStructSetData($tBIHDR, 'bV5RedMask', 0x00FF0000)
    DllStructSetData($tBIHDR, 'bV5GreenMask', 0x0000FF00)
    DllStructSetData($tBIHDR, 'bV5BlueMask', 0x000000FF)
    DllStructSetData($tBIHDR, 'bV5CSType', 2) ; LCS_WINDOWS_COLOR_SPACE = 2
    DllStructSetData($tBIHDR, 'bV5Intent', 4) ; $LCS_GM_IMA
    $hResult = DllCall('gdi32.dll', 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBIHDR), 'uint', 0, 'ptr*', 0, 'ptr', 0, 'dword', 0)
    If (Not @error) And ($hResult[0]) Then
        DllCall('gdi32.dll', 'dword', 'SetBitmapBits', 'ptr', $hResult[0], 'dword', $aRet[2] * $aRet[3] * 4, 'ptr', DllStructGetData($tData, 'Scan0'))
        $hResult = $hResult[0]
    Else
        $hResult = 0
    EndIf
    _GDIPlus_BitmapUnlockBits($hBitmap, $tData)
    $tData = 0
    $tBIHDR = 0
    Return $hResult
EndFunc   ;==>_WinAPI_BitmapCreateDIBFromBitmap

;Code below was generated by: File to Base64 String Code Generator v1.10 Build 2012-09-08

Func _Speedometer($bSaveBinary = False)
    Local $Speedometer
    $Speedometer &= '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'
    $Speedometer &= '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'
    $Speedometer &= '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'
    $Speedometer &= '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'
    $Speedometer &= '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'
    $Speedometer &= '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'
    $Speedometer &= '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'
    $Speedometer &= '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'
    $Speedometer &= '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'
    $Speedometer &= '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'
    $Speedometer &= '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'
    $Speedometer &= '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'
    $Speedometer &= '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'
    $Speedometer &= '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'
    $Speedometer &= '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'
    $Speedometer &= 'y7ruCJEHD+/33aYDAMDEBpe+2N6ioQCEZzNrb4p3xDoDpL05YqmBQNvGejR5rDQqzvRlXTeNu60dnQAAjNOyUWxbdWk2tbVNimusE3VnCLRtrEfTF6O1cPWa4szGuhsKAAC4Vis5JkvuBa2Z2qouTTdFz7bd7wybjbQ/mnLeMtpbyoDhrbTZAAAA2y0NxPtbo80N2oPtdwZE0ITnderLPrcjv54fcXYkAABYaQwWZ46klXAuYM4mEbSqJrYWOs1HztwQoLw+AAAQQYvjeaFKMVaipBktETSaBtoXZ1dev7JlX2wAAOacKuo0grYsOPKbAhBomNi2HzkjrQkAgEgbke6cT6R536MpAIE23sRWhYo+ZRQ/QWxJWhMAABBprrXWXruuGS0CjaYBdZdUHiSbRrPNgjgDAABE2ltvvtmJdhsH3BQgC6mspgCaBEC1aBJQJZoGVBgpsgs8AQAAbG7e5r7i15ffFEAEDVR8r2iVRi05kpZ/ephanAEAAMigvM3GAUfOtKdOIs4QaPDS5ZfV2SkTvfpDz40uugxxBgAA1KTNl+7U3qe9VHtqNyEINDo7Q83YHOJMhZSlHaABAAALjgIizXtnqY5NBBqdnZ7ZWVmcnX/+fFcLAABApGnfmtBOo2zHJgKNzk7VgNkjrbg4U1dOljgDAABEmlKLI0WaB6znD3Ov07GJQGPSgL5oLqgsK85U8LkuAAAAZ547s7O7u1uxccCRM9W1ac/Ua+gqgEDjy65I2iCPtIPbB/26Q89zxRkAAIAsohRJU4qxipmtjWgVuasuzhBoRNIk0tTZeVSeXunJsRfFdJ5rAAAA3o8qTBywnYb2yFnnRCPQGKyuFKa+kLkXhX5XKXEGAABQOpKmrJL2xBa8zhBoGNkmRJovCp0mGhh6DgAARNK070wq0rQHKqvUlNcZAg2PtAEiTSazelzMgLb1uZoAAEDjgGuvVxvRtuV1hkDDIy18IRMdmxJiIZIWImeKrv2/vbt5sfMswwD+VOKm2SVZ2tTEVRYuJEILXSRV68Ik0GLHrKQGuhAyBKpQXRQ6hS5UmAgSwUUgFld1DAp+LDLGJlJBocFFFq5MbOqy7T/Qwmku8JWHc8g505yv9+P3W2Y3kznve537ee77LqsEgMaBh5yTNnb3emIQbTtnnQloBtk2f6j5hjGjkpag1qnKGQCG2eZdl4BXhbMlDaLlkbf/+nZZDDJWozmD70D4AoDMLMtYjL1PGZgMZ+0fRKuCZttAvRKq5QAgJzuppM2snPUhnAloVkL1IqQB4Lgz/57uz96EMwHNSqj8AT/3xLOlgwAQ0hLC8u/j4azb+zUFNG3M+QO+dnu3C5U0AKjndiacpXJW31VLOOvNfk0Bzd7OTlXSAHAnLQ0BCWdjjQT9Cme6ONm5ujPKgL+sv/jtP35XWg4AWhjOVNBw3AkAWe80iHAmoAlpnejuBIC8q3L6M6hwJqC5k5aScdsAQN2tmXfWUMKZgGYER0JaSsb5ADQ7zVoBAOpRGnlnlSES0MxJy4L17O5cJwBIweB+ODNKQ0Bz3NksWM/+znVW0gBg88Lm6H8bAoSzENDs7oxU0tYR0gBQOdv/6P62rG9CQBPSABDO8u4ppTwonCGgCWnHjh1bSUgDgD/+/g9lD+EMAU1Ie21r6/8hLR+cZQCANKd96+zZvHPKr998c1o4Q0Dj4IFDTUjLBycTnMuiAWA7QJrT8q7JOyfvnrI32MXJj7/3o1FWQ2VmWhbXLgoA9mpmN/QPLv7w0wYzVNDIB6ceaDsvAAygzTsl75Y5wxkCmoG2+ZaT1ucWbR0AwHYAHHGyc3VnlIW1cX33+iNPPvXkqOwdAMZoLHE7ACpotg48zGooAIzRWHI4Q0AzKy3dN9M6PAEQzpoxGquccYaAZlZajjzTjTMOAGM0mnCWd8YKwxnuoLH90+1RunHyAbz0s0vNvTQANAOkU7MNzQAIaJoHMgn61JnTZc0A0AyAI07NA/kgRsrZw2we'
    $Speedometer &= 'ALC2qX3hDAFNSKubB4Z1Lw3AZoBmbVNLOzUR0DQPZHXHsDYPANgMkGd/R5oBcAdN80D/76UBuG/WoWYAVNCsh6rvpfXzyBPA8NkOr21CQLN5oCdHngA898Sz+eLdhvtmOOLEvDQAR5qbFzZHPZ5vhoBmXlq+dZ3fPF+6A8DKpv6P0MARp1Ec3TjyBNClOZQjTVTQaMrkcX33eouPPAF0aTbXU0q/oYJGPui5wxB5AGSpbmsAWHRed2kOLZwhoBnF0Rx55m5ayuj5xlbWBkDVLM/iPJMdaeKIs6HLc40NBAB2aeZ+8MSRJipoqKbFyhsIAMw2a8LZ5JEmKmjwwYfvjy6/frlcu727wgYCAOMzskvzxVdeLAcPHJodzhDQMDMtzQQ7v9kpiwWgESDP2U812wxHnJiZliXruQeRu2n7H92fb3plfgCqZnUjQJ61c4QzVNDQQDBPNQ2Ajec38qV3cVUzVNDQQFBX09JttHcAxmfk2Zln6FLHZ6CChrtpeci8c+ud8mAAgll1CrG8JecIaHDrn7dGV65cKVkV1ZTpty9ulwcDMNfs3Llz5fiXjq8snCGgoZpmJEcFUDVr9h2v864Z7qCh09NOzwpgh2bCWeaarb1DExU0HHumlN/IQ+nUmdNlYAADZ5uVea07zkRAw0iOepfcEI49AceZndmhiYCGJoK+z04DbALodhMAAhqaCFLyP795vvQEoDuz800AaBJAE0EeaFlv0tmVUYDjzDzDmnCW04G+NQGggoZjzwxr7NL9NMCw2bYdZyKggSG3gHtmJ06cUDFDQFst3E8DcM8Md9BwPy1HnfX9NEvYAffM2gAVNPjgw/dHv3zjjdKW+WmAeWYJZt954YVy8MChJpiBgIb7aSsOaoBg1tEGAAQ00PEJ6MwEAQ2NBDdv3lxKUANUzObvzAQBDUFtrqNPgI3nN3LXdUmdmSCgYTRH24MaoGIGAhqC2mtbW+XUmdMlALJS7tWtrVTe11gxAwENR58G3tbAgNkWVcxAQEPX57BXSIGVTG3rygQBDUHtz7/aLddu75bof+cnuF+WSnpHghkIaAhqN27cSLdWvxsKwAyzjgczENCwQqp+iHf/nhq4+N+zlUwgoKGhoO7o6k5VDRxj9rwjEwQ0NBS0vKoGqmWXX7+cO6UDPcYEAQ3Hny2sqoFqmWNMENBw/LnGqhqYXdZUtqfNLwMBDXR/rmlUB6iWnTx5clXHmCCggaoaCGX5IjR3tQwENHBX7S9vvVWqsDZ+WXmOyho4wvzK008v9G4ZCGjgCHR2ZQ1UytZ3hAkCGlgrFV//4jPla99+ZrBhDZWyKZ+LtYQyENDAEeggK2sIZVVluVNHmCCggbCWl1XfZqzh+LJ7oQwENBDW7vzt39Vxz+TgzVNnTpcuwFT/arDzxPHl0ae+0ItQBgIaaDDoUkcoqmTDuOgPAhoIa3fv3s3Lr/XVNVTJ8iXiyJEjQhkIaOAodOxOz8IDGwJZdWfS0eU0IKCB6tqdO3eal+ZKAhsCWf23dfTo0XmqZICABo5D6/tA9R023CEb+9tZ1rElIKCB49D/vPtumRrYJkcdDCC0CWPjI15iWiD7/OOPL/nYEhDQwJHo+B22WcdXHQ5twtjUY/DJO2RdObIEBDRQZasrKocPH25xtU1V7N69ew/1f1naCxDQgCkv+lkv+1Rfchy2xPAmhCVQpyI29v8ztDAGCGjAjGCwtgAngM3+PZcpAAENENxmBotIuIg6YCTMdTV01b+nyO8qpvy+lhfEAAEN0JBQ7mvC28fvfVTe+/i/UwLJ3gNKPLbvc7nUXmoJLNPk8vteQ+c0+ZlqabrIzxaL+vnqEBZLv7gPCGiAylu5r6m+RRPi6qDTJ3Ww3PfYZ+uKYapgJbpWCQMENECYm6heJdQ1qnAXCw15CVe1OmhFwtZYFW8toQvgE2Bc+n0wJVTiAAAAAElFTkSuQmCC'
    Local $bString = Binary(_Base64Decode($Speedometer))
    If $bSaveBinary Then
        Local $hFile = FileOpen(@ScriptDir & "Tacho_4bit.png", 18)
        FileWrite($hFile, $bString)
        FileClose($hFile)
    EndIf
    Return  $bString
EndFunc   ;==>_Speedometer

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

Edited by SmOke_N

Common sense plays a role in the basics of understanding AutoIt... If you're lacking in that, do us all a favor, and step away from the computer.

Link to post
Share on other sites

Speedometer.au3 Author: UEZ

;coded by UEZ 2012 build 2012-09-26
#include <GUIConstantsEx.au3>
#include <Memory.au3>
#include <GDIPlus.au3>
Opt("GUIOnEventMode", 1)

_GDIPlus_Startup()

Global Const $hBitmap_bg = Load_BMP_From_Mem(_Speedometer())
Global Const $iW = _GDIPlus_ImageGetWidth($hBitmap_bg), $iH = _GDIPlus_ImageGetHeight($hBitmap_bg)
Global Const $hGUI = GUICreate("GDI+ Speedometer by UEZ 2012", $iW / 2, $iH / 2)
GUISetBkColor(0xABCDEF, $hGUI)
GUISetState()
Global Const $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
Global Const $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iW, $iH, $hGraphic)
Global Const $hCtxt = _GDIPlus_ImageGetGraphicsContext($hBitmap)
_GDIPlus_GraphicsSetSmoothingMode($hCtxt, 2)
DllCall($ghGDIPDll, "uint", "GdipSetTextRenderingHint", "handle", $hCtxt, "int", 4)
Global Const $iRadius = 300
Global Const $iNeedle_size = 16
Global Const $fCenter_x = $iW / 2, $fCenter_y = $iH / 2
Global Const $hPen_needle = _GDIPlus_PenCreate(0xFFFF0000, $iNeedle_size)
Global Const $hCap = _GDIPlus_ArrowCapCreate(1, 1)
    _GDIPlus_PenSetCustomEndCap($hPen_needle, $hCap)

Global Const $hBrush = _GDIPlus_BrushCreateSolid(0xFF000000)
Global Const $fRad2Deg = ACos(-1) / 180
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")

Global Const $fDegMin = -223.5, $fDegMax = 44
Global $fDeg = $fDegMin, $fAcc = 0.75, $fKMH, $fMPH


Do
    _GDIPlus_GraphicsDrawImageRect($hCtxt, $hBitmap_bg, 0, 0, $iW, $iH)
    DllCall($ghGDIPDll, "int", "GdipDrawLine", "handle", $hCtxt, "handle", $hPen_needle, "float", $fCenter_x, "float", $fCenter_y, "float", $fCenter_x + Cos($fDeg * $fRad2Deg) * $iRadius, "float", $fCenter_y + Sin($fDeg * $fRad2Deg) * $iRadius)
    _GDIPlus_GraphicsFillEllipse($hCtxt, $fCenter_x - $iNeedle_size, $fCenter_y - $iNeedle_size, $iNeedle_size * 2, $iNeedle_size * 2, $hBrush)
    _GDIPlus_GraphicsDrawString($hCtxt, StringFormat("%.3i MPH", $fMPH), 240, 520, "Times New Roman", 24)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iW / 2, $iH / 2)
    If $fDeg < $fDegMax Then
        $fDeg += $fAcc
        $fKMH = (249.5 + $fDeg) / 1.33333
        $fMPH = Int($fKMH * 0.621371)
        $fAcc *= 1.005^2
    EndIf
Until Not Sleep(20)


Func _Exit()
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_ArrowCapDispose($hCap)
    _GDIPlus_PenDispose($hPen_needle)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_GraphicsDispose($hCtxt)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_BitmapDispose($hBitmap_bg)
    _GDIPlus_Shutdown()
    GUIDelete()
    Exit
EndFunc

#region
;======================================================================================
; Function Name:        Load_BMP_From_Mem
; Description:              Loads an image which is saved as a binary string and converts it to a bitmap or hbitmap
;
; Parameters:               $bImage:    the binary string which contains any valid image which is supported by GDI+
; Optional:                     $hHBITMAP:  if false a bitmap will be created, if true a hbitmap will be created
;
; Remark:                       hbitmap format is used generally for GUI internal images, $bitmap is more a GDI+ image format
;                                       Don't forget _GDIPlus_Startup() and _GDIPlus_Shutdown()
;
; Requirement(s):       GDIPlus.au3, Memory.au3 and _WinAPI_BitmapCreateDIBFromBitmap() from WinAPIEx.au3
; Return Value(s):      Success: handle to bitmap (GDI+ bitmap format) or hbitmap (WinAPI bitmap format),
;                                       Error: 0
; Error codes:              1: $bImage is not a binary string
;                                       2: unable to create stream on HGlobal
;                                       3: unable to create bitmap from stream
;
; Author(s):                    UEZ
; Additional Code:      thanks to progandy for the MemGlobalAlloc and tVARIANT lines and
;                                       Yashied for _WinAPI_BitmapCreateDIBFromBitmap() from WinAPIEx.au3
; Version:                      v0.98 Build 2012-08-29 Beta
;=======================================================================================
Func Load_BMP_From_Mem($bImage, $hHBITMAP = False)
    If Not IsBinary($bImage) Then Return SetError(1, 0, 0)
    Local $aResult
    Local Const $memBitmap = Binary($bImage) ;load image  saved in variable (memory) and convert it to binary
    Local Const $len = BinaryLen($memBitmap) ;get length of image
    Local Const $hData = _MemGlobalAlloc($len, $GMEM_MOVEABLE) ;allocates movable memory  ($GMEM_MOVEABLE = 0x0002)
    Local Const $pData = _MemGlobalLock($hData) ;translate the handle into a pointer
    Local $tMem = DllStructCreate("byte[" & $len & "]", $pData) ;create struct
    DllStructSetData($tMem, 1, $memBitmap) ;fill struct with image data
    _MemGlobalUnlock($hData) ;decrements the lock count  associated with a memory object that was allocated with GMEM_MOVEABLE
    $aResult = DllCall("ole32.dll", "int", "CreateStreamOnHGlobal", "handle", $pData, "int", True, "ptr*", 0) ;Creates a stream object that uses an HGLOBAL memory handle to store the stream contents
    If @error Then Return SetError(2, 0, 0)
    Local Const $hStream = $aResult[3]
    $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromStream", "ptr", $hStream, "int*", 0) ;Creates a Bitmap object based on an IStream COM interface
    If @error Then Return SetError(3, 0, 0)
    Local Const $hBitmap = $aResult[2]
    Local $tVARIANT = DllStructCreate("word vt;word r1;word r2;word r3;ptr data; ptr")
    DllCall("oleaut32.dll", "long", "DispCallFunc", "ptr", $hStream, "dword", 8 + 8 * @AutoItX64, _
                                           "dword", 4, "dword", 23, "dword", 0, "ptr", 0, "ptr", 0, "ptr", DllStructGetPtr($tVARIANT)) ;release memory from $hStream to avoid memory leak
    $tMem = 0
    $tVARIANT = 0
    If $hHBITMAP Then
        Local Const $hHBmp = _WinAPI_BitmapCreateDIBFromBitmap($hBitmap)
        _GDIPlus_BitmapDispose($hBitmap)
        Return $hHBmp
    EndIf
    Return $hBitmap
EndFunc   ;==>Load_BMP_From_Mem

Func _WinAPI_BitmapCreateDIBFromBitmap($hBitmap) ;create 32-bit bitmap v5 (alpha channel supported)
    Local $tBIHDR, $aRet, $tData, $pBits, $hResult = 0
    $aRet = DllCall($ghGDIPDll, 'uint', 'GdipGetImageDimension', 'ptr', $hBitmap, 'float*', 0, 'float*', 0)
    If (@error) Or ($aRet[0]) Then Return 0
    $tData = _GDIPlus_BitmapLockBits($hBitmap, 0, 0, $aRet[2], $aRet[3], $GDIP_ILMREAD, $GDIP_PXF32ARGB)
    $pBits = DllStructGetData($tData, 'Scan0')
    If Not $pBits Then Return 0
    $tBIHDR = DllStructCreate(  'dword bV5Size;long bV5Width;long bV5Height;word bV5Planes;word bV5BitCount;dword bV5Compression;' & _ ;http://msdn.microsoft.com/en-us/library/windows/desktop/dd183381(v=vs.85).aspx
                                                                'dword bV5SizeImage;long bV5XPelsPerMeter;long bV5YPelsPerMeter;dword bV5ClrUsed;dword bV5ClrImportant;'  & _
                                                                'dword bV5RedMask;dword bV5GreenMask;dword bV5BlueMask;dword bV5AlphaMask;dword bV5CSType;' & _
                                                                'int bV5Endpoints[3];dword bV5GammaRed;dword bV5GammaGreen;dword bV5GammaBlue;dword bV5Intent;' & _
                                                                'dword bV5ProfileData;dword bV5ProfileSize;dword bV5Reserved')
    DllStructSetData($tBIHDR, 'bV5Size', DllStructGetSize($tBIHDR))
    DllStructSetData($tBIHDR, 'bV5Width', $aRet[2])
    DllStructSetData($tBIHDR, 'bV5Height', $aRet[3])
    DllStructSetData($tBIHDR, 'bV5Planes', 1)
    DllStructSetData($tBIHDR, 'bV5BitCount', 32)
    DllStructSetData($tBIHDR, 'bV5Compression', 0) ; $BI_BITFIELDS = 3, $BI_RGB = 0, $BI_RLE8 = 1, $BI_RLE4 = 2, $RGBA = 0x41424752
    DllStructSetData($tBIHDR, 'bV5SizeImage', $aRet[3] * DllStructGetData($tData, 'Stride'))
    DllStructSetData($tBIHDR, 'bV5AlphaMask', 0xFF000000)
    DllStructSetData($tBIHDR, 'bV5RedMask', 0x00FF0000)
    DllStructSetData($tBIHDR, 'bV5GreenMask', 0x0000FF00)
    DllStructSetData($tBIHDR, 'bV5BlueMask', 0x000000FF)
    DllStructSetData($tBIHDR, 'bV5CSType', 2) ; LCS_WINDOWS_COLOR_SPACE = 2
    DllStructSetData($tBIHDR, 'bV5Intent', 4) ; $LCS_GM_IMA
    $hResult = DllCall('gdi32.dll', 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBIHDR), 'uint', 0, 'ptr*', 0, 'ptr', 0, 'dword', 0)
    If (Not @error) And ($hResult[0]) Then
        DllCall('gdi32.dll', 'dword', 'SetBitmapBits', 'ptr', $hResult[0], 'dword', $aRet[2] * $aRet[3] * 4, 'ptr', DllStructGetData($tData, 'Scan0'))
        $hResult = $hResult[0]
    Else
        $hResult = 0
    EndIf
    _GDIPlus_BitmapUnlockBits($hBitmap, $tData)
    $tData = 0
    $tBIHDR = 0
    Return $hResult
EndFunc   ;==>_WinAPI_BitmapCreateDIBFromBitmap

;Code below was generated by: File to Base64 String Code Generator v1.10 Build 2012-09-08

Func _Speedometer($bSaveBinary = False)
    Local $Speedometer
    $Speedometer &= 'iVBORw0KGgoAAAANSUhEUgAAAmgAAAJoCAYAAADS7x1JAAAACXBIWXMAAAsTAAALEwEAmpwYAABjMElEQVR4XuydTahd13mG9y0qhWTWdthIljLywANzDTFooJ9EGbgtJDSKRkEWeGCIKTQGO9CAbyCD1mCXGgUMNajBo1QtDrT1wHIsySiQQEwHGXhUKZY7bDtzKNhw6ufAZm3uOveus/c6e6919nke2Nx7rnTP2fec9fOu73fv3vv3mrEREfmf//3vBV9/+9FHDdy/f79pefjwYQOfffxp8/Fn/9Uc5sMPP2yO49FHHw3/J/H/DvOlE3/SnPjS7zdw8uTJpuXMmTMNPHLqVAN/9Id/vNdMhIjIRgSaiCi6EFyt2ApCK4grxFEriM6c/XLTcvHCheXv7z++f6QAevLsk7xONr/8xS+PfI0P/uMDXmOleHzw4EH7t/B3dIUdoq4VdNOJORFRoImIIqwVYKvEyunTpxEpXYtTK1CCsJohiL2OsOu+P10hF70/QYj2R0QUaCKiCIsERiu+IuElSRG37nvbiIgo0EQUYoeEAhaeCQWYAi4Sb/MWbiKiQBNRjL13+/Yshdi//+u/NS8dHDTr8OsPfj034Ubc3raKNhFRoIkoxs6fP7+0wPzpn/9ZMyd+fP3HzQsvvNCswye/+6SZCwhTLKB37tyZuWgTkRPNliEiIabp/i/+c5kt2W7Sz//V8zN2T0ortL/73Hcja9s//uQniLZFmyXbWkmb0RARBZqIcWNYTSLr2OW/uHxYkCnO6rF2TZLNynN/fi1FW1ewMV5u3Lix6IyX3Hg2EVGgiWgh6wqyc+fONU9fvboqg3JRQYwU93bIjSrfvnKFL4scV2u+YAti8XMXOIKNh4tWsK1hYRMRBZqILsu7d++2guwod+WilvvtxIDhXq1boOka5YoE9t9+728WuMgZbx2XqIgo0EQM6n/77bebp556ammFeuXVVxJirE74OyKsf7aIWkylKWFl61rY2hi23U06EFGgiei2xEp2859vLpotA0tLV4DwNx2NIHq2ycJGlmybdDBrd6iIAk1EUcZGF2K15h7U7+feBOjZWaocCVYxDgNYxNZ2Q2NZ6yYd3PyXmwusa1st1kQUaCK6LtvyF9euXRu19AWuKZg6/qv794SG6BI3Ww8xeiXgcMBnw/X666838PXHLjVf+84lBFgvd2g3du25v3xusQ3110QUaCKKsjbAH1G26ViyqHwCcWstxK/VHaAvBOCXIIyTwDu/udW888KtZaHfdvx87mYfFLuGhe6NH73BYWSBla4asSaiQBPRUgZYJBBlm+byty7jHm0tVIvEJjwpBL5zX10ByQbeSDsuWqg/VjxRATLGT8IVGuLWPvv408XkSQYiCjQRY4veffNW677MFmWZm2dRcYSLC4HWFa0NyHJ8dEGoTB1vSNzYukI7Jl+sYVnjb+bw0j9mTUR+r0kioih75e9eWcbd8PjFV7+/RwNuNqMJrFQ9gtKnJI6rotuBrI7JK2FZxOW+DrgmNw1z461f/Wx5AXOHOZQ9TkUUaCK6MLFAsLEQ8E2gfyvK2GwntFL1CEovG1fFPdSGIjENrsgxYc4wd5hDjBHmFHNLi6uILk6RXm4hLA8Io1A4tlg5DEoarOXm5J4nhriqSovVWqSW7N41mDADOM4GxaJGnTUsePSUbVYgokATsVYZwc0h2L+6grAxZctcxHFVFqtdHYuH2J8aElgyXOiTiLWbZ2+28WpLq5o11paI6OIUOezCJF4Gd0xtLXn6WG6K10ITYvGK10Cj5tk6kOhSltgFSn9Q5mazW4go0ETrRhvwTwwVGwMWs4y4sp1OFJB0PCDjrICLtYeFtp7DCHORgxLvWZtYMPNYNREFmujG5GROnaZuwH895GfZ4aaV6hrHE6s3+VjPtNBWZVVjzjJ353kAEVGgiW5MTuZUTK9pU8rLsitfsJa2QbH1ZpeJY/FGKtaaL9TpIFAICjATe7aWgGTO'
    $Speedometer &= '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'
    $Speedometer &= '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'
    $Speedometer &= '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'
    $Speedometer &= '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'
    $Speedometer &= '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'
    $Speedometer &= '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'
    $Speedometer &= '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'
    $Speedometer &= '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'
    $Speedometer &= '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'
    $Speedometer &= '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'
    $Speedometer &= '7tMaY2/wePPEiSxriosNZ9b2TL2uqbMWOO5JAc/3vXnW3xHQdOaUAom2ltYqlD3wy3fjzum/d9v/+Uq8jifc0M9bKVmyL7TUY7V66R2AKqrGFRW2LCzWDABA5yNnWsOtr33igcdt1189pDKAQmQJszjVQm1iQFPlU9kqOKAp7SvVV/0gWXXq5aPx9vfej12/Rx52H70439leeiXJ35O3gGabBPKc/q8g2AwAgO7Gbzl3OWRkky3X8Xe+7Lr0+qMlTSpUhAQldaJ+cviwwqY3vOl22zjPU5svNQttHJGvqlP9OjQLN1/92W7nvj3l4h++4D46e7bj/vhlr7VZ5xas87GxJpmvW+sDqgMAUNjQRaFIH7XRTEFFr59Zfp5rbZfCStkTA/S1GnORx2uaWrkWzvy3q1FRbaMWsZ4bARW0eg6sveUH33du9aLvrIqKWZGDarWOQZf++Tcj2KiQ2gAAhpZqsPnqpff7ZD5Z8mZ6xIywOOt5yy5Hmguq+xYY/JKdiXE+S3vQHaOyoy2v9e0F2wA4BRxfaVfBR+Fm6AYBPUkHfT795/5jm3Q/PE/uQrYw63ssHwDABsZa8AqUaonl3RZUUFodGltsu5HZoMoqmbpl3TGeGAo/dfxGbdeL2D+OUZsaFDR1KeJgdQuHnsnJAf8I6rk2DQAQMH4ioNIUOtbDQl/ocYU5Bi7Wn0l3jCeG1jrFdTkF4Fc/Wxq5y6WMdVlWxs3+bmDx7UULeMUeuB67ogEAijwX2boxNbexe5cbDTqbU6/PAQGtPuvQ+vr3ai1mnttSyWBCP1XwigpoxZ8dCgAIbTkWNqpCr4FV+OzG77K/9tps0rbs0g1Yg1b6wen+Q19D5rYUROeUDpx5k4XaoUnQ0/caQm1T7cKhvFwxAPAHEFXFUq8pGmuljlWd12bpfuUcDPX/sf4sIKCpZ6r1XgpoZawni10YtUEL3NRg69gUJrMvdrSvX71Y1SvreI707cauTAAA77mR09PTmg2m8DXOm+i4qmG0OQ61DZhswPqzbAHN5qHFOT+pdWBoEaXhEiYxWziq9fUCACrZlKXK2bHXjnWqeBOtmWqqymm99DgjNo4fPz5qDVymYe2qBFoxxz8gN+e1gJrSrwJKbdefhQW08HM5w9eThSurJQsAgP/4QAs8Ck9JuNOvR4U+/bmFntS4KO/5oHHgNAG7f/mfERoXsRZQFz02Ogf1oadnFdYmcv2ZdC58cCFLCVTfbE1DWfoJqB2TlQMAMFojfMNABbdr46NKvt2sh6Wrajh0PXcS1lRR1PdSURtctx9QQQs/lzO9nqwiKnM2FQCAw9hVrcqTf7aZVe8K5ska2UZsadnT6UNL+mWs70lHUpVZWdNyrvUcaxU5D/+5nFYtU7LWE0bhrIKdMiodJ+ehBTz4AADU+uQWtTyLvm1tcBgYnPQ6W6fHVPkjyyguBUzllSceeDypbhXqxmdf2/mbGURZ/7L0QNRp+7L+IvVkuXjponZDptI+AAATd3KLf6G+wpL+rLDWpl5Th21k0zKiIuh69X2VsQtVlbUkrG3buq2QsKbMdO+O+5wUtAbNHgQ9GYf8pekbLHqtWd0W/gEAsK5RSVZQsP9Hn0v9PttaJ+950/p98usk4F27dk3zNLPdpt2uguq6Z3omYS/DuvFCs0dAGzRg/VlgQJO55+diVas8i/TyTtTq3072rkwAAGATIWq/USM8rKmN+qOXf2zhLGCTQNCxT5rxsRrQ4jzPlGxOyxIAAOT4ul7wGjJbs6ZL9rBm4zXKCGg6qkAPiN3B0AfdUqrWuCmUBQz2AwAAqD6sKSspM5mCW5yaOvzS4cNObc6AU/1ZTwYAAPKqpOmYR89JQuW2QZWHtDxLOzjDA1r4OjTNQdOojTatJwMAAIQ1Lc/SRsrg9WfSXedslGFHKelzg+6wDgkllAEAgKKH3OpSdlizo7FsvEbspMSAprCl0wIscA0+a8yOVWg4AABAWEtuS8dcKiuZgBZnQJuz'
    $Speedometer &= '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'
    $Speedometer &= 'aRBpEQRaySiaGwBG/T4AAJdAeKAyABQTRuHAE6JY8iJtLHqGQJNy1aBSRauy68zy05KeaK8T9KXLl7qNBgAq15wB4NavvTpS+61rsZqLgjSHtIejZwi0KJoa76jXeGHmOrN8Ll682GnC/XaeoAHg/f++32UAABkuCdrPa0TTpDmkPVrkWNcQH/3IxxRF66VoHbVKql/9gftuIqSkr/3yWgcA2YX2EbHjaJUi1DoEaRH2wSp9XepApsVdPzOvyPL7jOM6Nh30DACpzeT162iar6FC0TNpj65BdvZv7Xct8eDh/V51IG9ff3tHU+XLpyS8AVx44ULqOQFIAVr4pK9JP36uVOL4tSQuKCc6+AGQ2lR0rIFrKIg/CzRSnOko2rlz57rXXny1H/CBTVZnpg8+S5wBEDVrMlWozWDkmlDCoiSIPABSmxnXkATeVOuVtIbFGSnOQZx57szOsz97tlfL+xFhTYkqfWBZdWbnnz/fjQYAOwp3PeamF9NRueEn6ngKVGlUpVMH/f4rr1/Rgt2PEXT6GR3waDgAKH/gkrDKad7TGvFY8PWKrneGCNpQ9AG8src35HHr/G5tBhniDAA7inxx5sfqFifuRRai3jEklCzGXMuSxj8/5nXrufQzkf/n1y4AQNeL9uDswn4duiS01o3iZbwGBJqiaKGY8AikokflsKWYc5Q3AKRFy4Q4il7Sn8zCL7/DEx81gOS+rb04p5xAhy5F08aa2+rxQWMg0DI4e/asPc0SRcCpFIQeQ50ZALYUkfRmZUEFANqLs6NpNrcd9XhpC4FAyx8BpWK+5AdtJR71M6sgzACoS1sSTo/4IFcdAKJp2aUAaXNb22roOpe2QKBNMwJK3RvJP7yKdGetMwOgLk2LpITa0rrJvIbUAwAcudZ+ne3MoJTnqoCONIRq12LRM7o480ZA9VpMXfgbj6KFDxe/oeED4O/du+cB0KkmDOftR0YkfYHo50IdwJ07d1J1iOHx/tn5AddqSZTFhFrr6U43Drg+dd4oOwBo79beoDRkjqVN1Nz20k8u9R7phECbcgSUFv3EJo0wy3M8j3N49NaTUxtCq3NKlB3cPuh1wY2wLvBzmb4pV3ZOvKHuLGJr4dquhFCr3+Xo19fe2gEAynrp5gkjayIXiLBOBVuNxHpDijPDvNYpCRjbtSJxVmSG2Tc/942UY7TE2eRpNEUAm4Ji31h6winPkV2OAIAdh2rI18UlC7bVkJZAoM1kuwFxkSSBVIo//uN6xjiPLHHYnkgjPbFKVLcWTV5G9ykA0bS17DgkxnRwTNpqINDq224YuPara31piwQLpfjzlhRpjYMPmiNpuuWMZJt07NJCASBCn14rVHpT1VYDgeaGAZ+AIXuItG5hQ9V97KbHKNS8apM8efLk5osn0AI5VqiFn9F9EG7+93HpDn3/hh4m/DjXuuUcTHyKJ+JWyO4kDRCh13U4ZK0ISCu4MWB57Ozf2u+WxIOH93ulTAYVi4MLLSOnDH2R8xsNPBMxPT/Rjz916pQuGjd9rGguUKenxN7yzVEBEGHqpBsfxbSn5Y0bNzpx4YULXjsGrFt379493MGrNVD3yajtj/f2OtUurdu5PiaroK7648ePOx03qmOepjfrApfZ6N/0+SHQKqbttGkP25xZGIOozRU3aghwzVlaoOWLKqdQ4yLNnaRNA4CJ8dS1iKlDuu0aCmQeLJri69Uzp0/nv18LU1kSsc4l6pwddHBwYnd312KXFGe9hgF9GMOKxMnfBxPAcNMFr/shF4AWVt1rsVvREKATX4E0mVngBQYAFkoSK6WMkVeJpFL1yp7/GBeiOkxO+X71PvQ7I93Q7G2hXMJdm/78E3sHPmgVGgZsZtquIWxrJx+lFiW4+qtXr6Z8ZnrfjyZbzC0+xA8AhRu7bGJdtQY2HekvIUjjGQNq0/wd8MSAPmLRQQStcsNAg95oXjR0utMFq1BrddLeZBZnmfiU4uegiBgAatgiaT2bS3TWFoU0'
    $Speedometer &= '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'
    $Speedometer &= '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'
    $Speedometer &= 'ALC2qX3hDAFNSKubB4Z1Lw3AZoBmbVNLOzUR0DQPZHXHsDYPANgMkGd/R5oBcAdN80D/76UBuG/WoWYAVNCsh6rvpfXzyBPA8NkOr21CQLN5oCdHngA898Sz+eLdhvtmOOLEvDQAR5qbFzZHPZ5vhoBmXlq+dZ3fPF+6A8DKpv6P0MARp1Ec3TjyBNClOZQjTVTQaMrkcX33eouPPAF0aTbXU0q/oYJGPui5wxB5AGSpbmsAWHRed2kOLZwhoBnF0Rx55m5ayuj5xlbWBkDVLM/iPJMdaeKIs6HLc40NBAB2aeZ+8MSRJipoqKbFyhsIAMw2a8LZ5JEmKmjwwYfvjy6/frlcu727wgYCAOMzskvzxVdeLAcPHJodzhDQMDMtzQQ7v9kpiwWgESDP2U812wxHnJiZliXruQeRu2n7H92fb3plfgCqZnUjQJ61c4QzVNDQQDBPNQ2Ajec38qV3cVUzVNDQQFBX09JttHcAxmfk2Zln6FLHZ6CChrtpeci8c+ud8mAAgll1CrG8JecIaHDrn7dGV65cKVkV1ZTpty9ulwcDMNfs3Llz5fiXjq8snCGgoZpmJEcFUDVr9h2v864Z7qCh09NOzwpgh2bCWeaarb1DExU0HHumlN/IQ+nUmdNlYAADZ5uVea07zkRAw0iOepfcEI49AceZndmhiYCGJoK+z04DbALodhMAAhqaCFLyP795vvQEoDuz800AaBJAE0EeaFlv0tmVUYDjzDzDmnCW04G+NQGggoZjzwxr7NL9NMCw2bYdZyKggSG3gHtmJ06cUDFDQFst3E8DcM8Md9BwPy1HnfX9NEvYAffM2gAVNPjgw/dHv3zjjdKW+WmAeWYJZt954YVy8MChJpiBgIb7aSsOaoBg1tEGAAQ00PEJ6MwEAQ2NBDdv3lxKUANUzObvzAQBDUFtrqNPgI3nN3LXdUmdmSCgYTRH24MaoGIGAhqC2mtbW+XUmdMlALJS7tWtrVTe11gxAwENR58G3tbAgNkWVcxAQEPX57BXSIGVTG3rygQBDUHtz7/aLddu75bof+cnuF+WSnpHghkIaAhqN27cSLdWvxsKwAyzjgczENCwQqp+iHf/nhq4+N+zlUwgoKGhoO7o6k5VDRxj9rwjEwQ0NBS0vKoGqmWXX7+cO6UDPcYEAQ3Hny2sqoFqmWNMENBw/LnGqhqYXdZUtqfNLwMBDXR/rmlUB6iWnTx5clXHmCCggaoaCGX5IjR3tQwENHBX7S9vvVWqsDZ+WXmOyho4wvzK008v9G4ZCGjgCHR2ZQ1UytZ3hAkCGlgrFV//4jPla99+ZrBhDZWyKZ+LtYQyENDAEeggK2sIZVVluVNHmCCggbCWl1XfZqzh+LJ7oQwENBDW7vzt39Vxz+TgzVNnTpcuwFT/arDzxPHl0ae+0ItQBgIaaDDoUkcoqmTDuOgPAhoIa3fv3s3Lr/XVNVTJ8iXiyJEjQhkIaOAodOxOz8IDGwJZdWfS0eU0IKCB6tqdO3eal+ZKAhsCWf23dfTo0XmqZICABo5D6/tA9R023CEb+9tZ1rElIKCB49D/vPtumRrYJkcdDCC0CWPjI15iWiD7/OOPL/nYEhDQwJHo+B22WcdXHQ5twtjUY/DJO2RdObIEBDRQZasrKocPH25xtU1V7N69ew/1f1naCxDQgCkv+lkv+1Rfchy2xPAmhCVQpyI29v8ztDAGCGjAjGCwtgAngM3+PZcpAAENENxmBotIuIg6YCTMdTV01b+nyO8qpvy+lhfEAAEN0JBQ7mvC28fvfVTe+/i/UwLJ3gNKPLbvc7nUXmoJLNPk8vteQ+c0+ZlqabrIzxaL+vnqEBZLv7gPCGiAylu5r6m+RRPi6qDTJ3Ww3PfYZ+uKYapgJbpWCQMENECYm6heJdQ1qnAXCw15CVe1OmhFwtZYFW8toQvgE2Bc+n0wJVTiAAAAAElFTkSuQmCC'
    Local $bString = Binary(_Base64Decode($Speedometer))
    If $bSaveBinary Then
        Local $hFile = FileOpen(@ScriptDir & "Tacho_4bit.png", 18)
        FileWrite($hFile, $bString)
        FileClose($hFile)
    EndIf
    Return  $bString
EndFunc   ;==>_Speedometer

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

Edited by LaCastiglione
Link to post
Share on other sites
  • Moderators

@LaCastiglione

Thanks for the link, not sure what "udf snippet" you want me to do.

But I'm not going to create the udf snippet, or guess, so if you want to put it together out UEZ's code, do so and post it with appropriate credits.

Thanks

Common sense plays a role in the basics of understanding AutoIt... If you're lacking in that, do us all a favor, and step away from the computer.

Link to post
Share on other sites

Here another one besides the snippets I sent per pm to SmOke_N. ;)

_GDIPlus_SaveImage2BinaryString.au3

Func _GDIPlus_SaveImage2BinaryString($hBitmap, $iQuality = 50, $bSave = False, $sFilename = "Converted.jpg") ;coded by Andreik, modified by UEZ
    Local $sImgCLSID = _GDIPlus_EncodersGetCLSID("jpg")
    Local $tGUID = _WinAPI_GUIDFromString($sImgCLSID)
    Local $pEncoder = DllStructGetPtr($tGUID)
    Local $tParams = _GDIPlus_ParamInit(1)
    Local $tData = DllStructCreate("int Quality")
    DllStructSetData($tData, "Quality", $iQuality) ;quality 0-100
    Local $pData = DllStructGetPtr($tData)
    _GDIPlus_ParamAdd($tParams, $GDIP_EPGQUALITY, 1, $GDIP_EPTLONG, $pData)
    Local $pParams = DllStructGetPtr($tParams)
    Local $hStream = DllCall("ole32.dll", "uint", "CreateStreamOnHGlobal", "ptr", 0, "bool", True, "ptr*", 0) ;http://msdn.microsoft.com/en-us/library/ms864401.aspx
    If @error Then Return SetError(1, 0, 0)
    $hStream = $hStream[3]
    DllCall($ghGDIPDll, "uint", "GdipSaveImageToStream", "ptr", $hBitmap, "ptr", $hStream, "ptr", $pEncoder, "ptr", $pParams)
    _GDIPlus_BitmapDispose($hBitmap)
    Local $hMemory = DllCall("ole32.dll", "uint", "GetHGlobalFromStream", "ptr", $hStream, "ptr*", 0) ;http://msdn.microsoft.com/en-us/library/aa911736.aspx
    If @error Then Return SetError(2, 0, 0)
    $hMemory = $hMemory[2]
    Local $iMemSize = _MemGlobalSize($hMemory)
    Local $pMem = _MemGlobalLock($hMemory)
    $tData = DllStructCreate("byte[" & $iMemSize & "]", $pMem)
    Local $bData = DllStructGetData($tData, 1)
    Local $tVARIANT = DllStructCreate("word vt;word r1;word r2;word r3;ptr data;ptr")
    Local $aCall = DllCall("oleaut32.dll", "long", "DispCallFunc", "ptr", $hStream, "dword", 8 + 8 * @AutoItX64, "dword", 4, "dword", 23, "dword", 0, "ptr", 0, "ptr", 0, "ptr", DllStructGetPtr($tVARIANT)) ;http://msdn.microsoft.com/en-us/library/windows/desktop/ms221473(v=vs.85).aspx
    _MemGlobalFree($hMemory)
    If $bSave Then
        Local $hFile = FileOpen(@ScriptDir & "" & $sFilename, 18)
        FileWrite($hFile, $bData)
        FileClose($hFile)
    EndIf
    Return $bData
EndFunc   ;==>_GDIPlus_SaveImage2BinaryString

Reads a GDI+ bitmap from a handle and converts the bitmap to a JPG image in the memory. The result is a binary string of the JPG image which can be saved somewhere else. Example can be found here:

The code is based on Andreik's HBITMAP_To_Bytes function which can be found here:

Br,

UEZ

Edited by UEZ

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

Selection of finest graphical examples at Codepen.io

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

Link to post
Share on other sites

I got great use out of this one, when i needed to show that something was still working, but no actual percentage of progress was able to be provided. All credit is UEZ and Malkey, I merely had the need.

,-. .--. ________ .-. .-. ,---. ,-. .-. .-. .-.
|(| / /\ \ |\ /| |__ __||| | | || .-' | |/ / \ \_/ )/
(_) / /__\ \ |(\ / | )| | | `-' | | `-. | | / __ \ (_)
| | | __ | (_)\/ | (_) | | .-. | | .-' | | \ |__| ) (
| | | | |)| | \ / | | | | | |)| | `--. | |) \ | |
`-' |_| (_) | |\/| | `-' /( (_)/( __.' |((_)-' /(_|
'-' '-' (__) (__) (_) (__)

Link to post
Share on other sites

Create an account or sign in to comment

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

Create an account

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

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By UEZ
      As already annouced in >this topic here the GUI version of the GDI+ v1.1 color effects.
       

       
      GDI+ Color Transformer.au3:
       
      ;IMPORTANT: You are not allowed to sell this code or just parts of it in a commercial project or modify it and distribute it with a different name! ;Distributing copies of the program in compiled pe format (exe) must be free of any fee! ;~ #AutoIt3Wrapper_AutoIt3Dir=c:\Program Files (x86)\AutoIt3\3.3.8.1\ ;~ #AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 #AutoIt3Wrapper_UseX64=n #AutoIt3Wrapper_Icon=Color_32x32.ico #AutoIt3Wrapper_Res_Field=CompanyName|UEZ Software Development #AutoIt3Wrapper_Res_Field=ProductName|GDI+ Color Transformer #AutoIt3Wrapper_Res_Field=ProductVersion|%AutoItVer% #AutoIt3Wrapper_Res_Fileversion=0.9.7.0 #AutoIt3Wrapper_Res_Field=Build|2016-04-23 #AutoIt3Wrapper_Res_LegalCopyright=UEZ Software Development #AutoIt3Wrapper_Res_Language=1033 #AutoIt3Wrapper_Res_Field=URL|http://www.autoitscript.com/forum/index.php?showtopic=151155 #AutoIt3Wrapper_Run_Au3Stripper=y #Au3Stripper_Parameters=/so #AutoIt3Wrapper_Run_After=del /f /q "%scriptdir%\%scriptfile%_stripped.au3" #AutoIt3Wrapper_UseUpx=n #AutoIt3Wrapper_UPX_Parameters=--best --lzma #include <Clipboard.au3> #include <Constants.au3> #include <ButtonConstants.au3> #include <EditConstants.au3> #include <GDIPlus.au3> #include <GUIConstantsEx.au3> #include <GUIMenu.au3> #include <Misc.au3> #include <SliderConstants.au3> #include <StaticConstants.au3> #include <TabConstants.au3> #include <WindowsConstants.au3> Global $iResult = _GDIPlus_Startup() If @error Then If @error = 2 Or @extended < 6 Then Global $sUrl = "http://www.winsxs.org/?OtherTech/thread-13-1-1" Global $iChoice = MsgBox(4 + 16 + 262144, "Error", _ "GDIPlus.dll v1.1 is needed to run this script properly!" & @CRLF & _ "How to use GDI+ v1.1 e.g. on WinXP: " & $sUrl & @CRLF & @CRLF & "Open site with default browser?") If $iChoice = 6 Then ShellExecute($sUrl) Exit Else Exit MsgBox(16 + 262144, "Error", "Cannot initialize GDI+", 120) Endif EndIf Global Const $ghGDIPDll = $__g_hGDIPDll DllCall("Kernel32.dll", "long", "SetProcessDEPPolicy", "long", False) ;disable DEP for this process Global $tRECTF = DllStructCreate($tagGDIPRECTF) DllStructSetData($tRECTF, "X", 0) DllStructSetData($tRECTF, "Y", 0) Global Enum $iAdjustExposure = 0, $iAdjustDensity, $iAdjustContrast, $iAdjustHighlight, $iAdjustShadow, _ ;http://msdn.microsoft.com/en-us/library/windows/desktop/ms534098(v=vs.85).aspx $iAdjustMidtone, $iAdjustWhiteSaturation, $iAdjustBlackSaturation Global Enum $iCurveChannelAll = 0, $iCurveChannelRed, $iCurveChannelGreen, $iCurveChannelBlue ;http://msdn.microsoft.com/en-us/library/windows/desktop/ms534100(v=vs.85).aspx Global $iType = $iAdjustExposure, $iChannel = $iCurveChannelAll Global $bUpdatePreview = False Global $hGUI = GUICreate("GDI+ Color Transformer by UEZ v0.9.7 build 2016-04-23", 1200, 690, -1, -1, Default, $WS_EX_TOPMOST + $WS_EX_ACCEPTFILES) GUISetFont(12, 400, 0, "Times New Roman") GUISetBkColor(0xFFFFFF, $hGUI) Global $iTab = GUICtrlCreateTab(824, 232, 369, 393, $TCS_MULTILINE, $TCS_EX_FLATSEPARATORS) Global $iSlider_BWThreshold_Default = 50, $iSlider_BlurRadius_Default = 0, $iSlider_BCBrightness_Default = 0, $iSlider_BCContrast_Default = 0, _ $iSlider_CBCyanRed_Default = 0, $iSlider_CBMagentaGreen_Default = 0, $iSlider_CBYellowBlue_Default = 0, _ $iSlider_CMRed_Default = 100, $iSlider_CMGreen_Default = 100, $iSlider_CMBlue_Default = 100, $iSlider_SharpenRadius_Default = 0, $iSlider_SharpenAmount_Default = 0, _ $iSlider_HSLLightnLevel_Default = 0, $iSlider_HSLHueLevel_Default = 0, $iSlider_HSLSatLevel_Default = 0, _ $iSlider_LevelsShadow_Default = 0, $iSlider_LevelsHighlight_Default = 100, $iSlider_LevelsMidtone_Default = 0, _ $iSlider_TintHue_Default = 0, $iSlider_TintAmount_Default = 0, _ $iSlider_GSLumRed_Default = 31, $iSlider_GSLumGreen_Default = 61, $iSlider_GSLumBlue_Default = 8 Global $GDIP__RLUM = $iSlider_GSLumRed_Default / 100, $GDIP__GLUM = $iSlider_GSLumGreen_Default / 100, $GDIP__BLUM = $iSlider_GSLumBlue_Default / 100; ; Colors luminace Global $iTabSelection = 0, $iBGDefColor = 0xFFFFFF #Region Tabs #Region B/W Global $iBW = GUICtrlCreateTabItem("Black / White") Global $iLabel_BWThreshold = GUICtrlCreateLabel("Threshold", 837, 411, 93, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_BWThreshold = GUICtrlCreateSlider(837, 443, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetLimit(-1, 100, 0) GUICtrlSetData(-1, $iSlider_BWThreshold_Default) GUICtrlSetTip(-1, "Range is from 0 to 1") Global $hSlider_BWThreshold = GUICtrlGetHandle($iSlider_BWThreshold) Global $iInp_BWThreshold = GUICtrlCreateInput(StringFormat("%04.2f", $iSlider_BWThreshold_Default / 100), 1126, 455, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) #EndRegion B/W #Region Blur Global $iBlur = GUICtrlCreateTabItem("Blur") ;~ GUICtrlSetState(-1, $GUI_SHOW) Global $iCheckbox_BlurExpandEdge = GUICtrlCreateCheckbox("Expand Edge", 838, 381, 177, 25) GUICtrlSetFont(-1, 12, 400, 0, "Arial") GUICtrlSetTip(-1, "If set, the bitmap expands by an amount equal to the radius so that it can have soft edges." & @CRLF & _ "the bitmap remains the same size and the soft edges are clipped.") Global $iLabel_BlurRadius = GUICtrlCreateLabel("Radius", 838, 445, 64, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_BlurRadius = GUICtrlCreateSlider(838, 477, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetLimit(-1, 255, 0) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetTip(-1, "Range is from 0 to 255") GUICtrlSetData(-1, $iSlider_BlurRadius_Default) Global $hSlider_BlurRadius = GUICtrlGetHandle($iSlider_BlurRadius) Global $iInp_BlurRadius = GUICtrlCreateInput($iSlider_BlurRadius_Default, 1126, 489, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) #EndRegion Blur #Region BC Global $iBC = GUICtrlCreateTabItem("Brightness / Contrast") Global $iLabel_BCBrightness = GUICtrlCreateLabel("Brightness", 838, 377, 99, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_BCBrightness = GUICtrlCreateSlider(838, 409, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetLimit(-1, 255, -255) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetTip(-1, "Range is from -255 to 255") GUICtrlSetData(-1, $iSlider_BCBrightness_Default) Global $hSlider_BCBrightness = GUICtrlGetHandle($iSlider_BCBrightness) Global $iInp_BCBrightness = GUICtrlCreateInput($iSlider_BCBrightness_Default, 1126, 421, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) Global $iLabel_BCContrast = GUICtrlCreateLabel("Contrast", 838, 504, 80, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_BCContrast = GUICtrlCreateSlider(838, 541, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetLimit(-1, 100, -100) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetTip(-1, "Range is from -100 to 100") GUICtrlSetData(-1, $iSlider_BCContrast_Default) Global $hSlider_BCContrast = GUICtrlGetHandle($iSlider_BCContrast) Global $iInp_BCContrast = GUICtrlCreateInput($iSlider_BCContrast_Default, 1126, 553, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) #EndRegion BC #Region CB Global $iCB = GUICtrlCreateTabItem("Color Balance") Global $iLabel_CBCyanRed = GUICtrlCreateLabel("Cyan Red", 838, 355, 87, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_CBCyanRed = GUICtrlCreateSlider(838, 387, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetLimit(-1, 100, -100) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetData(-1, $iSlider_CBCyanRed_Default) GUICtrlSetTip(-1, "Range is from -100 to 100") Global $hSlider_CBCyanRed = GUICtrlGetHandle($iSlider_CBCyanRed) Global $iInp_CBCyanRed = GUICtrlCreateInput($iSlider_CBCyanRed_Default, 1126, 399, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) Global $iLabel_CBMagentaGreen = GUICtrlCreateLabel("Magenta Green", 838, 445, 139, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_CBMagentaGreen = GUICtrlCreateSlider(838, 477, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetLimit(-1, 100, -100) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetData(-1, $iSlider_CBMagentaGreen_Default) GUICtrlSetTip(-1, "Range is from -100 to 100") Global $hSlider_CBMagentaGreen = GUICtrlGetHandle($iSlider_CBMagentaGreen) Global $iInp_CBMagentaGreen = GUICtrlCreateInput($iSlider_CBMagentaGreen_Default, 1126, 489, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) Global $iLabel_CBYellowBlue = GUICtrlCreateLabel("Yellow Blue", 838, 535, 107, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_CBYellowBlue = GUICtrlCreateSlider(838, 567, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetLimit(-1, 100, -100) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetData(-1, $iSlider_CBYellowBlue_Default) GUICtrlSetTip(-1, "Range is from -100 to 100") Global $hSlider_CBYellowBlue = GUICtrlGetHandle($iSlider_CBYellowBlue) Global $iInp_CBYellowBlue = GUICtrlCreateInput($iSlider_CBYellowBlue_Default, 1126, 579, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) #EndRegion CB #Region CC Global $iCC = GUICtrlCreateTabItem("Color Curve") Global $iLabel_CCCurveAdjust = GUICtrlCreateLabel("Curve Adjustments", 838, 355, 171, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlCreateGroup("", 0, 0, 0, 0) Global $iRadio_CCExposure = GUICtrlCreateRadio("Exposure", 837, 387, 73, 17) GUICtrlSetFont(-1, 8, 400, 0, "Arial") GUICtrlSetState(-1, $GUI_CHECKED) Global $iRadio_CCDensity = GUICtrlCreateRadio("Density", 927, 387, 73, 17) GUICtrlSetFont(-1, 8, 400, 0, "Arial") Global $iRadio_CCContrast = GUICtrlCreateRadio("Contrast", 1017, 387, 73, 17) GUICtrlSetFont(-1, 8, 400, 0, "Arial") Global $iRadio_CCHighlight = GUICtrlCreateRadio("Highlight", 1107, 387, 65, 17) GUICtrlSetFont(-1, 8, 400, 0, "Arial") Global $iRadio_CCShadow = GUICtrlCreateRadio("Shadow", 837, 411, 73, 17) GUICtrlSetFont(-1, 8, 400, 0, "Arial") Global $iRadio_CCMidtone = GUICtrlCreateRadio("Midtone", 927, 411, 73, 17) GUICtrlSetFont(-1, 8, 400, 0, "Arial") Global $iRadio_CCWhiteSaturation = GUICtrlCreateRadio("White Satur.", 1017, 411, 81, 17) GUICtrlSetFont(-1, 8, 400, 0, "Arial") Global $iRadio_CCBlackSaturation = GUICtrlCreateRadio("Black Satur.", 1107, 411, 73, 17) GUICtrlSetFont(-1, 8, 400, 0, "Arial") Global $iLabel_CCCurveChannel = GUICtrlCreateLabel("Curve Channel", 838, 445, 132, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlCreateGroup("", -99, -99, 1, 1) GUICtrlCreateGroup("", 0, 0, 0, 0) Global $iRadio_CCCurveAllChannel = GUICtrlCreateRadio("All Channel", 837, 477, 73, 17) GUICtrlSetFont(-1, 8, 400, 0, "Arial") GUICtrlSetState(-1, $GUI_CHECKED) Global $iRadio_CCCurveRed = GUICtrlCreateRadio("Red", 927, 477, 73, 17) GUICtrlSetFont(-1, 8, 400, 0, "Arial") Global $iRadio_CCCurveGreen = GUICtrlCreateRadio("Green", 1017, 477, 73, 17) GUICtrlSetFont(-1, 8, 400, 0, "Arial") Global $iRadio_CCCurveBlue = GUICtrlCreateRadio("Blue", 1107, 477, 65, 17) GUICtrlSetFont(-1, 8, 400, 0, "Arial") GUICtrlCreateGroup("", -99, -99, 1, 1) Global $iLabel_CCValue = GUICtrlCreateLabel("Value", 838, 535, 54, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_CCValue = GUICtrlCreateSlider(838, 567, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetLimit(-1, 255, -255) GUICtrlSetData(-1, 0) GUICtrlSetTip(-1, "Range is from -255 to 255") Global $hSlider_CCValue = GUICtrlGetHandle($iSlider_CCValue) Global $iInp_CCValue = GUICtrlCreateInput(0, 1126, 579, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) #EndRegion CC #Region CLUT Global $iCL = GUICtrlCreateTabItem("Color LUT") Global $iLabel_CLUT = GUICtrlCreateLabel("Coming soon!", 838, 425, 340, 60) GUICtrlSetFont(-1, 34, 400, 0, "Arial Black", 4) GUICtrlSetBkColor(-1, 0xFFFFFF) #EndRegion CLUT #Region CM Global $iCM = GUICtrlCreateTabItem("Color Matrix") Global $iLabel_CMRed = GUICtrlCreateLabel("Red", 838, 355, 38, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_CMRed = GUICtrlCreateSlider(838, 387, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetLimit(-1, 100, 0) GUICtrlSetData(-1, $iSlider_CMRed_Default) GUICtrlSetTip(-1, "Range is from 0 to 1") Global $hSlider_CMRed = GUICtrlGetHandle($iSlider_CMRed) Global $iInp_CMRed = GUICtrlCreateInput(StringFormat("%04.2f", $iSlider_CMRed_Default / 100), 1126, 399, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) Global $iLabel_CMGreen = GUICtrlCreateLabel("Green", 838, 445, 57, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_CMGreen = GUICtrlCreateSlider(838, 477, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetLimit(-1, 100, 0) GUICtrlSetData(-1, $iSlider_CMGreen_Default) GUICtrlSetTip(-1, "Range is from 0 to 1") Global $hSlider_CMGreen = GUICtrlGetHandle($iSlider_CMGreen) Global $iInp_CMGreen = GUICtrlCreateInput(StringFormat("%04.2f", $iSlider_CMGreen_Default / 100), 1126, 489, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) Global $iLabel_CMBlue = GUICtrlCreateLabel("Blue", 838, 535, 43, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_CMBlue = GUICtrlCreateSlider(838, 567, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetLimit(-1, 100, 0) GUICtrlSetData(-1, $iSlider_CMBlue_Default) GUICtrlSetTip(-1, "Range is from 0 to 1") Global $hSlider_CMBlue = GUICtrlGetHandle($iSlider_CMBlue) Global $iInp_CMBlue = GUICtrlCreateInput(StringFormat("%04.2f", $iSlider_CMBlue_Default / 100), 1126, 579, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) #EndRegion CM #Region Greyscale Global $iGreyscale = GUICtrlCreateTabItem("Greyscale") Global $iLabel_GSLumRed = GUICtrlCreateLabel("Luminance Red", 838, 355, 138, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_GSLumRed = GUICtrlCreateSlider(838, 387, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetLimit(-1, 100, 0) GUICtrlSetData(-1, $iSlider_GSLumRed_Default) GUICtrlSetTip(-1, "Range is from 0 to 1") Global $hSlider_GSLumRed = GUICtrlGetHandle($iSlider_GSLumRed) Global $iInp_GSLumRed = GUICtrlCreateInput(StringFormat("%04.2f", $iSlider_GSLumRed_Default / 100), 1126, 399, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) Global $iLabel_GSLumGreen = GUICtrlCreateLabel("Luminance Green", 838, 445, 157, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_GSLumGreen = GUICtrlCreateSlider(838, 477, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetLimit(-1, 100, 0) GUICtrlSetData(-1, $iSlider_GSLumGreen_Default) GUICtrlSetTip(-1, "Range is from 0 to 1") Global $hSlider_GSLumGreen = GUICtrlGetHandle($iSlider_GSLumGreen) Global $iInp_GSLumGreen = GUICtrlCreateInput(StringFormat("%04.2f", $iSlider_GSLumGreen_Default / 100), 1126, 489, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) Global $iLabel_GSLumBlue = GUICtrlCreateLabel("Luminance Blue", 838, 535, 143, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_GSLumBlue = GUICtrlCreateSlider(838, 567, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetLimit(-1, 100, 0) GUICtrlSetData(-1, $iSlider_GSLumBlue_Default) GUICtrlSetTip(-1, "Range is from 0 to 1") Global $hSlider_GSLumBlue = GUICtrlGetHandle($iSlider_GSLumBlue) Global $iInp_GSLumBlue = GUICtrlCreateInput(StringFormat("%04.2f", $iSlider_GSLumBlue_Default / 100), 1126, 579, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) #EndRegion Greyscale #Region HSL Global $iHSL = GUICtrlCreateTabItem("Hue / Sat. / Lightn.") Global $iLabel_HSLHueLevel = GUICtrlCreateLabel("Hue Level", 838, 355, 92, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_HSLHueLevel = GUICtrlCreateSlider(838, 387, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetLimit(-1, 180, -180) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetData(-1, $iSlider_HSLHueLevel_Default) GUICtrlSetTip(-1, "Range is from -180 to 180") Global $hSlider_HSLHueLevel = GUICtrlGetHandle($iSlider_HSLHueLevel) Global $iInp_HSLHueLevel = GUICtrlCreateInput($iSlider_HSLHueLevel_Default, 1126, 399, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) Global $iLabel_HSLSatLevel = GUICtrlCreateLabel("Saturation Level", 838, 445, 150, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_HSLSatLevel = GUICtrlCreateSlider(838, 477, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetLimit(-1, 100, -100) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetData(-1, $iSlider_HSLSatLevel_Default) GUICtrlSetTip(-1, "Range is from -100 to 100") Global $hSlider_HSLSatLevel = GUICtrlGetHandle($iSlider_HSLSatLevel) Global $iInp_HSLSatLevel = GUICtrlCreateInput($iSlider_HSLSatLevel_Default, 1126, 489, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) Global $iLabel_HSLLightnLevel = GUICtrlCreateLabel("Lightness Level", 838, 535, 144, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_HSLLightnLevel = GUICtrlCreateSlider(838, 567, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetLimit(-1, 100, -100) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetLimit(-1, 100, -100) GUICtrlSetData(-1, $iSlider_HSLLightnLevel_Default) GUICtrlSetTip(-1, "Range is from -100 to 100") Global $hSlider_HSLLightnLevel = GUICtrlGetHandle($iSlider_HSLLightnLevel) Global $iInp_HSLLightnLevel = GUICtrlCreateInput($iSlider_HSLLightnLevel_Default, 1126, 579, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) #EndRegion HSL #Region Levels Global $iLevels = GUICtrlCreateTabItem("Levels") Global $iLabel_LevelsHighlight = GUICtrlCreateLabel("Highlight", 838, 355, 83, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_LevelsHighlight = GUICtrlCreateSlider(838, 387, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetLimit(-1, 100, 0) GUICtrlSetData(-1, $iSlider_LevelsHighlight_Default) GUICtrlSetTip(-1, "Range is from 0 to 100") Global $hSlider_LevelsHighlight = GUICtrlGetHandle($iSlider_LevelsHighlight) Global $iInp_LevelsHighlight = GUICtrlCreateInput($iSlider_LevelsHighlight_Default, 1126, 399, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) Global $iLabel_LevelsMidtone = GUICtrlCreateLabel("Midtone", 838, 445, 75, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_LevelsMidtone = GUICtrlCreateSlider(838, 477, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetLimit(-1, 100, -100) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetLimit(-1, 100, -100) GUICtrlSetData(-1, $iSlider_LevelsMidtone_Default) GUICtrlSetTip(-1, "Range is from -100 to 100") Global $hSlider_LevelsMidtone = GUICtrlGetHandle($iSlider_LevelsMidtone) Global $iInp_LevelsMidtone = GUICtrlCreateInput($iSlider_LevelsMidtone_Default, 1126, 489, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) Global $iLabel_LevelsShadow = GUICtrlCreateLabel("Shadow", 838, 535, 75, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_LevelsShadow = GUICtrlCreateSlider(838, 567, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetLimit(-1, 100, 0) GUICtrlSetData(-1, $iSlider_LevelsShadow_Default) GUICtrlSetTip(-1, "Range is from 0 to 100") Global $hSlider_LevelsShadow = GUICtrlGetHandle($iSlider_LevelsShadow) Global $iInp_LevelsShadow = GUICtrlCreateInput($iSlider_LevelsShadow_Default, 1126, 579, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) #EndRegion Levels #Region Negative Global $iNegative = GUICtrlCreateTabItem("Negative") Global $iLabel_Negative = GUICtrlCreateLabel("Nothing to configure", 838, 445, 340, 60) GUICtrlSetFont(-1, 23, 400, 0, "Arial Black", 4) GUICtrlSetBkColor(-1, 0xFFFFFF) #EndRegion Negative #Region Sharpen Global $iSharpen = GUICtrlCreateTabItem("Sharpen") Global $iLabel_SharpenRadius = GUICtrlCreateLabel("Radius", 838, 377, 64, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_SharpenRadius = GUICtrlCreateSlider(838, 409, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetLimit(-1, 255, 0) GUICtrlSetData(-1, $iSlider_SharpenRadius_Default) GUICtrlSetTip(-1, "Range is from 0 to 255") Global $hSlider_SharpenRadius = GUICtrlGetHandle($iSlider_SharpenRadius) Global $iInp_SharpenRadius = GUICtrlCreateInput($iSlider_SharpenRadius_Default, 1126, 421, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) Global $iLabelSharpenAmount = GUICtrlCreateLabel("Amount", 838, 504, 72, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_SharpenAmount = GUICtrlCreateSlider(838, 541, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetLimit(-1, 100, 0) GUICtrlSetData(-1, $iSlider_SharpenAmount_Default) GUICtrlSetTip(-1, "Range is from 0 to 100") Global $hSlider_SharpenAmount = GUICtrlGetHandle($iSlider_SharpenAmount) Global $iInp_SharpenAmount = GUICtrlCreateInput($iSlider_SharpenAmount_Default, 1126, 553, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) #EndRegion Sharpen #Region Tint Global $iTint = GUICtrlCreateTabItem("Tint") ;~ GUICtrlSetState(-1, $GUI_SHOW) Global $iLabel_TintHue = GUICtrlCreateLabel("Hue", 838, 377, 39, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_TintHue = GUICtrlCreateSlider(838, 409, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetLimit(-1, 180, -180) GUICtrlSetData(-1, $iSlider_TintHue_Default) GUICtrlSetTip(-1, "Range is from -180 to 180") Global $hSlider_TintHue = GUICtrlGetHandle($iSlider_TintHue) Global $iInp_TintHue = GUICtrlCreateInput($iSlider_TintHue_Default, 1126, 421, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) Global $iLabel_TintAmount = GUICtrlCreateLabel("Amount", 838, 504, 72, 27) GUICtrlSetFont(-1, 12, 400, 0, "Arial Black") GUICtrlSetBkColor(-1, 0xFFFFFF) Global $iSlider_TintAmount = GUICtrlCreateSlider(838, 541, 278, 45, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_BOTH, $TBS_ENABLESELRANGE)) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetLimit(-1, 100, -100) GUICtrlSetData(-1, $iSlider_TintAmount_Default) GUICtrlSetTip(-1, "Range is from -100 to 100") Global $hSlider_TintAmount = GUICtrlGetHandle($iSlider_TintAmount) Global $iInp_TintAmount = GUICtrlCreateInput($iSlider_TintAmount_Default, 1126, 553, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER, $ES_READONLY)) #EndRegion Tint GUICtrlCreateTabItem("") #EndRegion Tabs ;~ Global Const $STM_SETIMAGE = 0x0172; $IMAGE_BITMAP = 0 Global $hTmp = _GDIPlus_BitmapCreateFromMemory(_Logo(), True) Global $iPicLogo = GUICtrlCreatePic("", 8, 8, 1184, 196, BitOR($SS_CENTERIMAGE, $GUI_SS_DEFAULT_PIC, $WS_BORDER)) Global $hB = GUICtrlSendMsg($iPicLogo, $STM_SETIMAGE, $IMAGE_BITMAP, $hTmp) If $hB Then _WinAPI_DeleteObject($hB) _WinAPI_DeleteObject($hTmp) Global $iW_Prev = 800, $iH_Prev = 450 Global $iPicPreview = GUICtrlCreatePic("", 8, 232, $iW_Prev, $iH_Prev, BitOR($GUI_SS_DEFAULT_PIC, $WS_BORDER, $SS_CENTERIMAGE)) Global $hPicPreview = GUICtrlGetHandle($iPicPreview) Global $iBtnSave = GUICtrlCreateButton("&Save Image", 1117, 634, 75, 49, $BS_MULTILINE) GUICtrlSetState(-1, $GUI_DISABLE) GUICtrlSetTip(-1, "Press right mouse buttom to copy image to clipboard") Global $iBtnLoad = GUICtrlCreateButton("&Load Image", 1036, 634, 75, 49, $BS_MULTILINE) Global $iBtnApply = GUICtrlCreateButton("&Apply Effect", 825, 634, 75, 49, $BS_MULTILINE) GUICtrlSetState(-1, $GUI_DISABLE) Global $iBtnUndo = GUICtrlCreateButton("&Undo Effect", 905, 634, 75, 49, $BS_MULTILINE) GUICtrlSetState(-1, $GUI_DISABLE) Global $iLabelImg = GUICtrlCreateLabel(" Image Info:", 8, 214, 68, 16) GUICtrlSetFont(-1, 10, 400, 0, "Times New Roman", 4) GUICtrlSetColor(-1, 0xF0F0F0) GUICtrlSetBkColor(-1, 0x0) Global $i, $j = 89, $k = 256 For $i = 0 To 731 ;76 + 732 GUICtrlCreateLabel("", 76 + $i, 214, 1, 16) GUICtrlSetBkColor(-1, 0x10000 * Int($j * $i / $k) + 0x100 * Int($j * $i / $k) + Int($j * $i / $k)) Next Global $iLabelImgInfo = GUICtrlCreateLabel(" no image loaded", 76, 214, 732, 16) GUICtrlSetFont(-1, 10, 400, 0, "Times New Roman", 5) GUICtrlSetColor(-1, 0xB0F0B0) GUICtrlSetBkColor(-1, -2) Global $iLabel_BgColor = GUICtrlCreateLabel("Bg Color", 984, 634, 47, 19) GUICtrlSetFont(-1, 9, 400, 0, "Times New Roman") GUICtrlSetBkColor(-1, -2) Global $iBtnBgColor = GUICtrlCreateButton("", 992, 654, 32, 28, $WS_BORDER) GUICtrlSetBkColor(-1, $iBGDefColor) GUICtrlSetTip(-1, "Change image background color (used also for save format)." & @CRLF & "PNG file format is excluded by background color") Global Enum $iReset = 0x400, $iClipboard Global $hQMenu = _GUICtrlMenu_CreatePopup() _GUICtrlMenu_InsertMenuItem($hQMenu, 0, "Reset to default", $iReset) $hTmp = _GDIPlus_BitmapCreateFromMemory(Reset_Icon()) Global $hBmp_Reset = _GDIPlus_Convert2HBitmap($hTmp, $COLOR_MENU) _GUICtrlMenu_SetItemBmp($hQMenu, 0, $hBmp_Reset) _GDIPlus_BitmapDispose($hTmp) Global $hQMenu2 = _GUICtrlMenu_CreatePopup() _GUICtrlMenu_InsertMenuItem($hQMenu2, 0, "Copy image to clipboard", $iClipboard) Global $hBmp_Clipboard = _GDIPlus_BitmapCreateFromMemory(_Clipboard(), True) _GUICtrlMenu_SetItemBmp($hQMenu2, 0, $hBmp_Clipboard) GUISetState(@SW_SHOW) Global $hDLL_GDI32 = DllOpen("gdi32.dll") Global $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iW_Prev, "int", $iH_Prev, "int", 0, "int", $GDIP_PXF32ARGB, "ptr", 0, "int*", 0) Global $hHBitmap_Preview = _GDIPlus_BitmapCreateHBITMAPFromBitmap($aResult[6]) _GDIPlus_BitmapDispose($aResult[6]) Global $hDC = _WinAPI_GetWindowDC($hPicPreview) Global $hDC_backbuffer = _WinAPI_CreateCompatibleDC($hDC) Global $DC_obj = _WinAPI_SelectObject($hDC_backbuffer, $hHBitmap_Preview) Global $hGraphic = _GDIPlus_GraphicsCreateFromHDC($hDC_backbuffer) _GDIPlus_GraphicsClear($hGraphic, 0xFF000000 + $iBGDefColor) Global $tGUID = DllStructCreate($tagGUID) Global $hImage = 0, $hImage_tmp, $hBmp_Preview = 0, $hBmp_tmp = 0, $hBmp_Save = 0, $hBmp_Save_1bpp = 0, $hCtx_tmp, $hBmp_Undo, $hBmp_Empty, _ $iWidth, $iHeight, $aPixelFormat, $aImageRawFormat, $hEffect, $aAnim, $sPrefix, $sFile, $iBGColor = $iBGDefColor, _ $bDnD = False, $bStart = False, $bDrawFX = False, $t, $iOld GUIRegisterMsg($WM_HSCROLL, "WM_HSCROLL") GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") GUIRegisterMsg($WM_PAINT, "WM_PAINT") GUIRegisterMsg($WM_DROPFILES, "WM_DROPFILES") GUIRegisterMsg($WM_CONTEXTMENU, "WM_CONTEXTMENU") GUIRegisterMsg($WM_COMMAND, "WM_COMMAND") While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE GUIRegisterMsg($WM_HSCROLL, "") GUIRegisterMsg($WM_NOTIFY, "") GUIRegisterMsg($WM_PAINT, "") GUIRegisterMsg($WM_DROPFILES, "") GUIRegisterMsg($WM_CONTEXTMENU, "") GUIRegisterMsg($WM_COMMAND, "") If $hBmp_tmp Then _GDIPlus_GraphicsDispose($hCtx_tmp) _GDIPlus_BitmapDispose($hBmp_tmp) EndIf _WinAPI_DeleteObject($hBmp_Reset) _WinAPI_DeleteObject($hBmp_Clipboard) _GDIPlus_GraphicsDispose($hGraphic) _WinAPI_SelectObject($hDC_backbuffer, $DC_obj) _WinAPI_DeleteObject($hHBitmap_Preview) _WinAPI_ReleaseDC($hPicPreview, $hDC) _WinAPI_DeleteDC($hDC) If $hImage Then _GDIPlus_ImageDispose($hImage) GUIDelete() _GDIPlus_Shutdown() DllClose($hDLL_GDI32) Exit Case $iBtnApply If $hBmp_Undo Then _GDIPlus_BitmapDispose($hBmp_Undo) $hBmp_Undo = _GDIPlus_ImageClone($hImage) Switch $iTabSelection Case 0 _GDIPlus_BlackAndWhite($hImage, $hCtx_tmp, GUICtrlRead($iInp_BWThreshold), False) Case 7 _GDIPlus_Greyscale($hImage, $hCtx_tmp, False) EndSwitch _GDIPlus_BitmapDispose($hImage) $hImage = _GDIPlus_ImageClone($hBmp_tmp) $bUpdatePreview = True GUICtrlSetState($iBtnUndo, $GUI_ENABLE) GUICtrlSetState($iBtnSave, $GUI_ENABLE) ResetSettings() Case $iBtnUndo _GDIPlus_BitmapDispose($hImage) $hImage = _GDIPlus_ImageClone($hBmp_Undo) If $hBmp_tmp Then _GDIPlus_GraphicsDispose($hCtx_tmp) _GDIPlus_BitmapDispose($hBmp_tmp) EndIf $hBmp_tmp = _GDIPlus_ImageClone($hImage) $hCtx_tmp = _GDIPlus_ImageGetGraphicsContext($hBmp_tmp) $bUpdatePreview = True Case $iBtnBgColor $t = $iBGColor $iBGColor = _ChooseColor(2, 0xFF0000, 2, $hGUI) If @error Then $iBGColor = $t _GDIPlus_GraphicsClear($hGraphic, 0xFF000000 + $iBGColor) GUICtrlSetBkColor($iBtnBgColor, $iBGColor) $bUpdatePreview = True Case $iBtnLoad If Not $bDnD Then $sFile = FileOpenDialog("Load an image", "", "Images (*.jpg;*.bmp;*.png;*.gif;*.tif)|All (*.*)", 3, "", $hGUI) If @error Then ContinueLoop EndIf If $hImage Then _GDIPlus_ImageDispose($hImage) $hImage = _GDIPlus_ImageLoadFromFile($sFile) If Not $hImage Then ContinueLoop $iWidth = _GDIPlus_ImageGetWidth($hImage) $iHeight = _GDIPlus_ImageGetHeight($hImage) $aAnim = DllCall($ghGDIPDll, "uint", "GdipImageGetFrameDimensionsCount", "handle", $hImage, "int*", 0) DllCall($ghGDIPDll, "uint", "GdipImageGetFrameDimensionsList", "handle", $hImage, "struct*", $tGUID, "int", $aAnim[2]) $aAnim = DllCall($ghGDIPDll, "uint", "GdipImageGetFrameCount", "handle", $hImage, "struct*", $tGUID, "uint*", 0) $aPixelFormat = _GDIPlus_ImageGetPixelFormat($hImage) $aImageRawFormat = _GDIPlus_ImageGetRawFormat($hImage) $sPrefix = "" If $aAnim[3] > 1 Then $sPrefix = "animated " ;~ CopyImage2Gfx($hImage, $hGraphic, $hDC, $hDC_backbuffer, $iWidth, $iHeight) GUICtrlSetData($iLabelImgInfo, StringRegExpReplace($sFile, ".*\\(.*)", "$1") & ", " & $sPrefix & $aImageRawFormat[1] & ", " & $iWidth & "x" & $iHeight & ", " & $aPixelFormat[1] & ", " & Round(FileGetSize($sFile) / 1024, 2) & " kb") $bDnD = False $bStart = True $bUpdatePreview = True DllStructSetData($tRECTF, "Width", $iWidth) DllStructSetData($tRECTF, "Height", $iHeight) If $hBmp_tmp Then _GDIPlus_GraphicsDispose($hCtx_tmp) _GDIPlus_BitmapDispose($hBmp_tmp) EndIf $hBmp_tmp = _GDIPlus_ImageClone($hImage) $hCtx_tmp = _GDIPlus_ImageGetGraphicsContext($hBmp_tmp) GUICtrlSetState($iBtnApply, $GUI_ENABLE) If $hBmp_Undo Then _GDIPlus_BitmapDispose($hBmp_Undo) $hBmp_Undo = _GDIPlus_ImageClone($hImage) If $hBmp_Empty Then _GDIPlus_BitmapDispose($hBmp_Empty) $hBmp_Empty = _GDIPlus_BitmapCreateFromScan0($iWidth, $iHeight) $iOld = $iTabSelection For $iTabSelection = 0 To 12 ResetSettings() Next $iTabSelection = $iOld Case $iBtnSave $sFile = FileSaveDialog("Save Image", "", "Image (*.png;*.jpg;*.bmp;*.gif;*.tif)", 2, "", $hGUI) If @error Then ContinueLoop If $hBmp_tmp Then _GDIPlus_GraphicsDispose($hCtx_tmp) _GDIPlus_BitmapDispose($hBmp_tmp) EndIf $hBmp_tmp = _GDIPlus_ImageClone($hBmp_Empty) $hCtx_tmp = _GDIPlus_ImageGetGraphicsContext($hBmp_tmp) DllCall($ghGDIPDll, "uint", "GdipSetInterpolationMode", "handle", $hCtx_tmp, "int", 7) Switch $iTabSelection Case 0 ;Black & White DllCall($ghGDIPDll, "uint", "GdipSetInterpolationMode", "handle", $hCtx_tmp, "int", 5) _GDIPlus_BlackAndWhite($hImage, $hCtx_tmp, GUICtrlRead($iInp_BWThreshold), False) Case 1 ;Blur $hEffect = _GDIPlus_EffectCreateBlur(GUICtrlRead($iInp_BlurRadius), BitAND(GUICtrlRead($iCheckbox_BlurExpandEdge), $GUI_CHECKED)) Case 2 ;Brightness / Contrast $hEffect = _GDIPlus_EffectCreateBrightnessContrast(GUICtrlRead($iInp_BCBrightness), GUICtrlRead($iInp_BCContrast)) Case 3 ;Color Balance $hEffect = _GDIPlus_EffectCreateColorBalance(GUICtrlRead($iInp_CBCyanRed), GUICtrlRead($iInp_CBMagentaGreen), GUICtrlRead($iInp_CBYellowBlue)) Case 4 ;Color Curve $hEffect = _GDIPlus_EffectCreateColorCurve($iType, $iChannel, GUICtrlRead($iInp_CCValue)) Case 5 ;Color LUT Case 6 ;Color Matrix Local $tColorMatrix = DllStructCreate($tagGDIPCOLORMATRIX) DllStructSetData($tColorMatrix, "m", GUICtrlRead($iInp_CMRed), 1) DllStructSetData($tColorMatrix, "m", GUICtrlRead($iInp_CMGreen), 7) DllStructSetData($tColorMatrix, "m", GUICtrlRead($iInp_CMBlue), 13) DllStructSetData($tColorMatrix, "m", 1, 19) DllStructSetData($tColorMatrix, "m", 1, 25) $hEffect = _GDIPlus_EffectCreateColorMatrix($tColorMatrix) Case 7 ;Greyscale _GDIPlus_Greyscale($hImage, $hCtx_tmp, False) Case 8 ;Hue / Saturation / Lightness $hEffect = _GDIPlus_EffectCreateHueSaturationLightness(GUICtrlRead($iInp_HSLHueLevel), GUICtrlRead($iInp_HSLSatLevel), GUICtrlRead($iInp_HSLLightnLevel)) Case 9 ;Levels $hEffect = _GDIPlus_EffectCreateLevels(GUICtrlRead($iInp_LevelsHighlight), GUICtrlRead($iInp_LevelsMidtone), GUICtrlRead($iInp_LevelsShadow)) Case 10;Negative _GDIPlus_Negative($hImage, $hCtx_tmp) Case 11;Sharpen $hEffect = _GDIPlus_EffectCreateSharpen(GUICtrlRead($iInp_SharpenRadius), GUICtrlRead($iInp_SharpenAmount)) Case 12;Tint $hEffect = _GDIPlus_EffectCreateTint(GUICtrlRead($iInp_TintHue), GUICtrlRead($iInp_TintAmount)) EndSwitch If $iTabSelection <> 0 And $iTabSelection <> 7 Then _GDIPlus_BitmapApplyEffect($hImage, $hEffect) _GDIPlus_EffectDispose($hEffect) EndIf _GDIPlus_SaveBitmap($sFile, $hBmp_tmp, 90, $iBGColor) ;~ Switch _GDIPlus_ImageSaveToFile($hBmp_tmp, $sFile) ;~ Case 0 ;~ MsgBox(16 + 262144, "Error", "Image couldn't be saved!", 20, $hGUI) ;~ Case Else ;~ MsgBox(64 + 262144, "Information", "Image has been successfully saved!", 20, $hGUI) ;~ EndSwitch Case $iRadio_CCExposure, $iRadio_CCDensity GUICtrlSetLimit($iSlider_CCValue, 255, -255) GUICtrlSetData($iSlider_CCValue, 0) GUICtrlSetData($iInp_CCValue, 0) GUICtrlSetTip($iSlider_CCValue, "Range is from -255 to 255") If BitAND(GUICtrlRead($iRadio_CCExposure), $GUI_CHECKED) Then $iType = $iAdjustExposure Else $iType = $iAdjustDensity EndIf $bUpdatePreview = True Case $iRadio_CCBlackSaturation, $iRadio_CCWhiteSaturation If BitAND(GUICtrlRead($iRadio_CCBlackSaturation), $GUI_CHECKED) Then $iType = $iAdjustBlackSaturation GUICtrlSetLimit($iSlider_CCValue, 254, 0) GUICtrlSetData($iSlider_CCValue, 0) GUICtrlSetData($iInp_CCValue, 0) GUICtrlSetTip($iSlider_CCValue, "Range is from 0 to 254") Else $iType = $iAdjustWhiteSaturation GUICtrlSetLimit($iSlider_CCValue, 255, 1) GUICtrlSetData($iSlider_CCValue, 255) GUICtrlSetData($iInp_CCValue, 255) GUICtrlSetTip($iSlider_CCValue, "Range is from 1 to 255") EndIf $bUpdatePreview = True Case $iRadio_CCContrast, $iRadio_CCHighlight, $iRadio_CCShadow, $iRadio_CCMidtone GUICtrlSetLimit($iSlider_CCValue, 100, -100) GUICtrlSetData($iSlider_CCValue, 0) GUICtrlSetData($iInp_CCValue, 0) GUICtrlSetTip($iSlider_CCValue, "Range is from -100 to 100") If BitAND(GUICtrlRead($iRadio_CCBlackSaturation), $GUI_CHECKED) Then $iType = $iAdjustContrast ElseIf BitAND(GUICtrlRead($iRadio_CCHighlight), $GUI_CHECKED) Then $iType = $iAdjustHighlight ElseIf BitAND(GUICtrlRead($iRadio_CCShadow), $GUI_CHECKED) Then $iType = $iAdjustShadow Else $iType = $iAdjustMidtone EndIf $bUpdatePreview = True Case $iRadio_CCCurveAllChannel $iChannel = $iCurveChannelAll $bUpdatePreview = True Case $iRadio_CCCurveRed $iChannel = $iCurveChannelRed $bUpdatePreview = True Case $iRadio_CCCurveGreen $iChannel = $iCurveChannelGreen $bUpdatePreview = True Case $iRadio_CCCurveBlue $iChannel = $iCurveChannelBlue $bUpdatePreview = True Case $iCheckbox_BlurExpandEdge $bUpdatePreview = True Case $iTab Switch GUICtrlRead($iTab) Case 0 ;Black & White $iTabSelection = 0 Case 1 ;Blur $iTabSelection = 1 Case 2 ;Brightness / Contrast $iTabSelection = 2 Case 3 ;Color Balance $iTabSelection = 3 Case 4 ;Color Curve $iTabSelection = 4 Case 5 ;Color LUT $iTabSelection = 5 Case 6 ;Color Matrix $iTabSelection = 6 Case 7 ;Greyscale $iTabSelection = 7 Case 8 ;Hue / Saturation / Lightness $iTabSelection = 8 Case 9 ;Levels $iTabSelection = 9 Case 10;Negative $iTabSelection = 10 Case 11;Sharpen $iTabSelection = 11 Case 12;Tint $iTabSelection = 12 EndSwitch $bUpdatePreview = True EndSwitch If $bUpdatePreview And $bStart Then $bUpdatePreview = False DllCall($ghGDIPDll, "uint", "GdipSetInterpolationMode", "handle", $hGraphic, "int", 7) $hImage_tmp = _GDIPlus_ImageClone($hImage) Switch $iTabSelection Case 0 ;Black & White DllCall($ghGDIPDll, "uint", "GdipSetInterpolationMode", "handle", $hGraphic, "int", 5) _GDIPlus_BlackAndWhite($hImage_tmp, $hGraphic, GUICtrlRead($iInp_BWThreshold)) $bDrawFX = False Case 1 ;Blur $hEffect = _GDIPlus_EffectCreateBlur(GUICtrlRead($iInp_BlurRadius), BitAND(GUICtrlRead($iCheckbox_BlurExpandEdge), $GUI_CHECKED)) $bDrawFX = True Case 2 ;Brightness / Contrast $hEffect = _GDIPlus_EffectCreateBrightnessContrast(GUICtrlRead($iInp_BCBrightness), GUICtrlRead($iInp_BCContrast)) $bDrawFX = True Case 3 ;Color Balance $hEffect = _GDIPlus_EffectCreateColorBalance(GUICtrlRead($iInp_CBCyanRed), GUICtrlRead($iInp_CBMagentaGreen), GUICtrlRead($iInp_CBYellowBlue)) $bDrawFX = True Case 4 ;Color Curve $hEffect = _GDIPlus_EffectCreateColorCurve($iType, $iChannel, GUICtrlRead($iInp_CCValue)) $bDrawFX = True Case 5 ;Color LUT $bDrawFX = False Case 6 ;Color Matrix Local $tColorMatrix = DllStructCreate($tagGDIPCOLORMATRIX) DllStructSetData($tColorMatrix, "m", GUICtrlRead($iInp_CMRed), 1) DllStructSetData($tColorMatrix, "m", GUICtrlRead($iInp_CMGreen), 7) DllStructSetData($tColorMatrix, "m", GUICtrlRead($iInp_CMBlue), 13) DllStructSetData($tColorMatrix, "m", 1, 19) DllStructSetData($tColorMatrix, "m", 1, 25) $hEffect = _GDIPlus_EffectCreateColorMatrix($tColorMatrix) $bDrawFX = True Case 7 ;Greyscale _GDIPlus_Greyscale($hImage_tmp, $hGraphic) $bDrawFX = False Case 8 ;Hue / Saturation / Lightness $hEffect = _GDIPlus_EffectCreateHueSaturationLightness(GUICtrlRead($iInp_HSLHueLevel), GUICtrlRead($iInp_HSLSatLevel), GUICtrlRead($iInp_HSLLightnLevel)) $bDrawFX = True Case 9 ;Levels $hEffect = _GDIPlus_EffectCreateLevels(GUICtrlRead($iInp_LevelsHighlight), GUICtrlRead($iInp_LevelsMidtone), GUICtrlRead($iInp_LevelsShadow)) $bDrawFX = True Case 10;Negative _GDIPlus_Negative($hImage_tmp, $hGraphic) $bDrawFX = False Case 11;Sharpen $hEffect = _GDIPlus_EffectCreateSharpen(GUICtrlRead($iInp_SharpenRadius), GUICtrlRead($iInp_SharpenAmount)) $bDrawFX = True Case 12;Tint $hEffect = _GDIPlus_EffectCreateTint(GUICtrlRead($iInp_TintHue), GUICtrlRead($iInp_TintAmount)) $bDrawFX = True EndSwitch If $bDrawFX Then _GDIPlus_GraphicsClear($hCtx_tmp, 0xFF000000 + $iBGColor) _GDIPlus_BitmapApplyEffect($hImage_tmp, $hEffect) _GDIPlus_GraphicsDrawImageRect($hCtx_tmp, $hImage_tmp, 0, 0, $iWidth, $iHeight) _GDIPlus_EffectDispose($hEffect) CopyImage2Gfx($hBmp_tmp, $hGraphic, $hDC, $hDC_backbuffer, $iWidth, $iHeight) Else DllCall($hDLL_GDI32, "bool", "BitBlt", "handle", $hDC, "int", 2, "int", 2, "int", $iW_Prev - 4, "int", $iH_Prev - 4, "handle", $hDC_backbuffer, "int", 0, "int", 0, "dword", $SRCCOPY) EndIf _GDIPlus_ImageDispose($hImage_tmp) EndIf WEnd Func ResetSettings() Switch $iTabSelection Case 0 ;Black & White GUICtrlSetData($iSlider_BWThreshold, $iSlider_BWThreshold_Default) GUICtrlSetData($iInp_BWThreshold, StringFormat("%04.2f", $iSlider_BWThreshold_Default / 100)) $bUpdatePreview = True Case 1 ;Blur GUICtrlSetData($iSlider_BlurRadius, $iSlider_BlurRadius_Default) GUICtrlSetData($iInp_BlurRadius, $iSlider_BlurRadius_Default) GUICtrlSetState($iCheckbox_BlurExpandEdge, $GUI_UNCHECKED) $bUpdatePreview = True Case 2 ;Brightness / Contrast GUICtrlSetData($iSlider_BCBrightness, $iSlider_BCBrightness_Default) GUICtrlSetData($iInp_BCBrightness, $iSlider_BCBrightness_Default) GUICtrlSetData($iSlider_BCContrast, $iSlider_BCContrast_Default) GUICtrlSetData($iInp_BCContrast, $iSlider_BCContrast_Default) $bUpdatePreview = True Case 3 ;Color Balance GUICtrlSetData($iSlider_CBCyanRed, $iSlider_CBCyanRed_Default) GUICtrlSetData($iInp_CBCyanRed, $iSlider_CBCyanRed_Default) GUICtrlSetData($iSlider_CBMagentaGreen, $iSlider_CBMagentaGreen_Default) GUICtrlSetData($iInp_CBMagentaGreen, $iSlider_CBMagentaGreen_Default) GUICtrlSetData($iSlider_CBYellowBlue, $iSlider_CBYellowBlue_Default) GUICtrlSetData($iInp_CBYellowBlue, $iSlider_CBYellowBlue_Default) $bUpdatePreview = True Case 4 ;Color Curve GUICtrlSetData($iSlider_CCValue, 0) GUICtrlSetData($iInp_CCValue, 0) GUICtrlSetState($iRadio_CCExposure, $GUI_CHECKED) GUICtrlSetState($iRadio_CCCurveAllChannel, $GUI_CHECKED) $bUpdatePreview = True Case 5 ;Color LUT ;~ $bUpdatePreview = True Case 6 ;Color Matrix GUICtrlSetData($iSlider_CMRed, $iSlider_CMRed_Default) GUICtrlSetData($iInp_CMRed, StringFormat("%04.2f", $iSlider_CMRed_Default / 100)) GUICtrlSetData($iSlider_CMGreen, $iSlider_CMGreen_Default) GUICtrlSetData($iInp_CMGreen, StringFormat("%04.2f", $iSlider_CMGreen_Default / 100)) GUICtrlSetData($iSlider_CMBlue, $iSlider_CMBlue_Default) GUICtrlSetData($iInp_CMBlue, StringFormat("%04.2f", $iSlider_CMBlue_Default / 100)) $bUpdatePreview = True Case 7 ;Greyscale GUICtrlSetData($iSlider_GSLumRed, $iSlider_GSLumRed_Default) GUICtrlSetData($iInp_GSLumRed, StringFormat("%04.2f", $iSlider_GSLumRed_Default / 100)) GUICtrlSetData($iSlider_GSLumGreen, $iSlider_GSLumGreen_Default) GUICtrlSetData($iInp_GSLumGreen, StringFormat("%04.2f", $iSlider_GSLumGreen_Default / 100)) GUICtrlSetData($iSlider_GSLumBlue, $iSlider_GSLumBlue_Default) GUICtrlSetData($iInp_GSLumBlue, StringFormat("%04.2f", $iSlider_GSLumBlue_Default / 100)) $GDIP__RLUM = $iSlider_GSLumRed_Default / 100 $GDIP__GLUM = $iSlider_GSLumGreen_Default / 100 $GDIP__BLUM = $iSlider_GSLumBlue_Default / 100 $bUpdatePreview = True Case 8 ;Hue / Saturation / Lightness GUICtrlSetData($iSlider_HSLHueLevel, $iSlider_HSLHueLevel_Default) GUICtrlSetData($iInp_HSLHueLevel, $iSlider_HSLHueLevel_Default) GUICtrlSetData($iSlider_HSLSatLevel, $iSlider_HSLSatLevel_Default) GUICtrlSetData($iInp_HSLSatLevel, $iSlider_HSLSatLevel_Default) GUICtrlSetData($iSlider_HSLLightnLevel, $iSlider_HSLLightnLevel_Default) GUICtrlSetData($iInp_HSLLightnLevel, $iSlider_HSLLightnLevel_Default) $bUpdatePreview = True Case 9 ;Levels GUICtrlSetData($iSlider_LevelsHighlight, $iSlider_LevelsHighlight_Default) GUICtrlSetData($iInp_LevelsHighlight, $iSlider_LevelsHighlight_Default) GUICtrlSetData($iSlider_LevelsMidtone, $iSlider_LevelsMidtone_Default) GUICtrlSetData($iInp_LevelsMidtone, $iSlider_LevelsMidtone_Default) GUICtrlSetData($iSlider_LevelsShadow, $iSlider_LevelsShadow_Default) GUICtrlSetData($iInp_LevelsShadow, $iSlider_LevelsShadow_Default) $bUpdatePreview = True Case 10;Negative $bUpdatePreview = True Case 11;Sharpen GUICtrlSetData($iSlider_SharpenRadius, $iSlider_SharpenRadius_Default) GUICtrlSetData($iInp_SharpenRadius, $iSlider_SharpenRadius_Default) GUICtrlSetData($iSlider_SharpenAmount, $iSlider_SharpenAmount_Default) GUICtrlSetData($iInp_SharpenAmount, $iSlider_SharpenAmount_Default) $bUpdatePreview = True Case 12;Tint GUICtrlSetData($iSlider_TintHue, $iSlider_TintHue_Default) GUICtrlSetData($iInp_TintHue, $iSlider_TintHue_Default) GUICtrlSetData($iSlider_TintAmount, $iSlider_TintAmount_Default) GUICtrlSetData($iInp_TintAmount, $iSlider_TintAmount_Default) $bUpdatePreview = True EndSwitch EndFunc ;==>ResetSettings #Region GDI+ FX functions Func _GDIPlus_BlackAndWhite($hBitmap, $hGraphic, $iThreshold, $bUpdate = True) Local Const $hIA = _GDIPlus_ImageAttributesCreate() _GDIPlus_ImageAttributesSetThreshold($hIA, $iThreshold) Local $pBWMatrix = DllStructGetPtr(_GDIPlus_ColorMatrixCreateGrayScale()) _GDIPlus_ImageAttributesSetColorMatrix($hIA, $GDIP_COLORADJUSTTYPE_DEFAULT, True, $pBWMatrix) Local $iW = _GDIPlus_ImageGetWidth($hBitmap), $iH = _GDIPlus_ImageGetHeight($hBitmap) If $bUpdate Then CopyImage2Gfx($hBitmap, $hGraphic, $hDC, $hDC_backbuffer, $iW, $iH, $hIA) Else _GDIPlus_GraphicsClear($hGraphic, 0xFF000000 + $iBGColor) _GDIPlus_GraphicsDrawImageRectRect($hGraphic, $hBitmap, 0, 0, $iW, $iH, 0, 0, $iW, $iH, $hIA) EndIf _GDIPlus_ImageAttributesDispose($hIA) EndFunc ;==>_GDIPlus_BlackAndWhite Func _GDIPlus_Greyscale($hBitmap, $hGraphic, $bUpdate = True) Local $ii, $iJ, $tColorMatrix, $aLums[4] = [GUICtrlRead($iInp_GSLumRed), GUICtrlRead($iInp_GSLumGreen), GUICtrlRead($iInp_GSLumBlue), 0] $tColorMatrix = DllStructCreate($tagGDIPCOLORMATRIX) For $ii = 0 To 3 For $iJ = 1 To 3 DllStructSetData($tColorMatrix, "m", $aLums[$ii], $ii * 5 + $iJ) Next Next DllStructSetData($tColorMatrix, "m", 1, 19) DllStructSetData($tColorMatrix, "m", 1, 25) Local Const $hIA = _GDIPlus_ImageAttributesCreate() _GDIPlus_ImageAttributesSetColorMatrix($hIA, 0, True, $tColorMatrix) Local $iW = _GDIPlus_ImageGetWidth($hBitmap), $iH = _GDIPlus_ImageGetHeight($hBitmap) If $bUpdate Then CopyImage2Gfx($hBitmap, $hGraphic, $hDC, $hDC_backbuffer, $iW, $iH, $hIA) Else _GDIPlus_GraphicsClear($hGraphic, 0xFF000000 + $iBGColor) _GDIPlus_GraphicsDrawImageRectRect($hGraphic, $hBitmap, 0, 0, $iW, $iH, 0, 0, $iW, $iH, $hIA) EndIf _GDIPlus_ImageAttributesDispose($hIA) EndFunc ;==>_GDIPlus_Greyscale Func _GDIPlus_Negative(ByRef $hBitmap, ByRef $hGraphic) Local Const $hIA = _GDIPlus_ImageAttributesCreate() _GDIPlus_ImageAttributesSetColorMatrix($hIA, 0, True, _GDIPlus_ColorMatrixCreateNegative()) CopyImage2Gfx($hBitmap, $hGraphic, $hDC, $hDC_backbuffer, _GDIPlus_ImageGetWidth($hBitmap), _GDIPlus_ImageGetHeight($hBitmap), $hIA) _GDIPlus_ImageAttributesDispose($hIA) EndFunc ;==>_GDIPlus_Negative #EndRegion GDI+ FX functions #Region Message Functions Func WM_HSCROLL($hWnd, $Msg, $wParam, $lParam) #forceref $hWnd, $Msg, $wParam Switch $lParam Case $hSlider_BWThreshold GUICtrlSetData($iInp_BWThreshold, StringFormat("%04.2f", GUICtrlRead($iSlider_BWThreshold) / 100)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_BlurRadius GUICtrlSetData($iInp_BlurRadius, GUICtrlRead($iSlider_BlurRadius)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_BCBrightness GUICtrlSetData($iInp_BCBrightness, GUICtrlRead($iSlider_BCBrightness)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_BCContrast GUICtrlSetData($iInp_BCContrast, GUICtrlRead($iSlider_BCContrast)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_CBCyanRed GUICtrlSetData($iInp_CBCyanRed, GUICtrlRead($iSlider_CBCyanRed)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_CBMagentaGreen GUICtrlSetData($iInp_CBMagentaGreen, GUICtrlRead($iSlider_CBMagentaGreen)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_CBYellowBlue GUICtrlSetData($iInp_CBYellowBlue, GUICtrlRead($iSlider_CBYellowBlue)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_CCValue GUICtrlSetData($iInp_CCValue, GUICtrlRead($iSlider_CCValue)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_CMBlue GUICtrlSetData($iInp_CMBlue, StringFormat("%04.2f", GUICtrlRead($iSlider_CMBlue) / 100)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_CMGreen GUICtrlSetData($iInp_CMGreen, StringFormat("%04.2f", GUICtrlRead($iSlider_CMGreen) / 100)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_CMRed GUICtrlSetData($iInp_CMRed, StringFormat("%04.2f", GUICtrlRead($iSlider_CMRed) / 100)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_GSLumBlue GUICtrlSetData($iInp_GSLumBlue, StringFormat("%04.2f", GUICtrlRead($iSlider_GSLumBlue) / 100)) $GDIP__BLUM = GUICtrlRead($iSlider_GSLumBlue) / 100 $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_GSLumGreen GUICtrlSetData($iInp_GSLumGreen, StringFormat("%04.2f", GUICtrlRead($iSlider_GSLumGreen) / 100)) $GDIP__GLUM = GUICtrlRead($iSlider_GSLumGreen) / 100 $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_GSLumRed GUICtrlSetData($iInp_GSLumRed, StringFormat("%04.2f", GUICtrlRead($iSlider_GSLumRed) / 100)) $GDIP__RLUM = GUICtrlRead($iSlider_GSLumRed) / 100 $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_HSLHueLevel GUICtrlSetData($iInp_HSLHueLevel, GUICtrlRead($iSlider_HSLHueLevel)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_HSLLightnLevel GUICtrlSetData($iInp_HSLLightnLevel, GUICtrlRead($iSlider_HSLLightnLevel)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_HSLSatLevel GUICtrlSetData($iInp_HSLSatLevel, GUICtrlRead($iSlider_HSLSatLevel)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_LevelsHighlight GUICtrlSetData($iInp_LevelsHighlight, GUICtrlRead($iSlider_LevelsHighlight)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_LevelsMidtone GUICtrlSetData($iInp_LevelsMidtone, GUICtrlRead($iSlider_LevelsMidtone)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_LevelsShadow GUICtrlSetData($iInp_LevelsShadow, GUICtrlRead($iSlider_LevelsShadow)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_SharpenAmount GUICtrlSetData($iInp_SharpenAmount, GUICtrlRead($iSlider_SharpenAmount)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_SharpenRadius GUICtrlSetData($iInp_SharpenRadius, GUICtrlRead($iSlider_SharpenRadius)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_TintAmount GUICtrlSetData($iInp_TintAmount, GUICtrlRead($iSlider_TintAmount)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) Case $hSlider_TintHue GUICtrlSetData($iInp_TintHue, GUICtrlRead($iSlider_TintHue)) $bUpdatePreview = True If BitAND(GUICtrlGetState($iBtnSave), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($iBtnSave, $GUI_DISABLE) EndSwitch Return "GUI_RUNDEFMSG" EndFunc ;==>WM_HSCROLL Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam) #forceref $hWnd, $Msg, $lParam Switch $wParam Case $iReset ResetSettings() Case $iClipboard Local $hHBmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmp_tmp) Local $hClipboard_Bitmap = _WinAPI_CopyImage($hHBmp, 0, 0, 0, $LR_COPYDELETEORG + $LR_COPYRETURNORG) _ClipBoard_Open(HWnd($hGUI)) _ClipBoard_Empty() _ClipBoard_SetDataEx($hClipboard_Bitmap, $CF_BITMAP) If Not @error Then MsgBox(64 + 262144, "Information", "Image put to clipboard!", 10) Else MsgBox(16 + 262144, "Error", "An error has occured: " & @error, 10) EndIf _ClipBoard_Close() _WinAPI_DeleteObject($hHBmp) _WinAPI_DeleteObject($hClipboard_Bitmap) EndSwitch Return "GUI_RUNDEFMSG" EndFunc ;==>WM_COMMAND Func WM_CONTEXTMENU($hWnd, $Msg, $wParam, $lParam) #forceref $Msg, $wParam, $lParam Local $aCI = GUIGetCursorInfo(HWnd($hGUI)) If Not @error Then Switch $aCI[4] Case $iTab _GUICtrlMenu_TrackPopupMenu($hQMenu, $hWnd) Return True Case $iBtnSave _GUICtrlMenu_TrackPopupMenu($hQMenu2, $hWnd) Return True EndSwitch EndIf Return "GUI_RUNDEFMSG" EndFunc ;==>WM_CONTEXTMENU Func WM_PAINT($hWnd, $Msg, $wParam, $lParam) #forceref $hWnd, $Msg,$wParam, $lParam DllCall($hDLL_GDI32, "bool", "BitBlt", "handle", $hDC, "int", 2, "int", 2, "int", $iW_Prev - 4, "int", $iH_Prev - 4, "handle", $hDC_backbuffer, "int", 0, "int", 0, "dword", $SRCCOPY) Return "GUI_RUNDEFMSG" EndFunc ;==>WM_PAINT Func WM_NOTIFY($hWnd, $Msg, $wParam, $lParam) #forceref $hWnd, $Msg,$wParam, $lParam DllCall($hDLL_GDI32, "bool", "BitBlt", "handle", $hDC, "int", 2, "int", 2, "int", $iW_Prev - 4, "int", $iH_Prev - 4, "handle", $hDC_backbuffer, "int", 0, "int", 0, "dword", $SRCCOPY) Return "GUI_RUNDEFMSG" EndFunc ;==>WM_NOTIFY Func WM_DROPFILES($hWnd, $Msg, $wParam, $lParam) #forceref $hWnd, $Msg, $lParam Local $aRet = DllCall("shell32.dll", "int", "DragQueryFile", "int", $wParam, "int", -1, "ptr", 0, "int", 0) If @error Then Return SetError(1, 0, 0) Local $sDroppedFile, $tBuffer = DllStructCreate("char[256]") If $aRet[0] = 1 Then DllCall("shell32.dll", "int", "DragQueryFile", "int", $wParam, "int", 0, "ptr", DllStructGetPtr($tBuffer), "int", DllStructGetSize($tBuffer)) $sDroppedFile = DllStructGetData($tBuffer, 1) If StringInStr(FileGetAttrib($sDroppedFile), "D") Then DllCall("shell32.dll", "none", "DragFinish", "int", $wParam) Return MsgBox(16 + 262144, "Error", "This is not a file ;-)", 20, $hGUI) EndIf EndIf DllCall("shell32.dll", "none", "DragFinish", "int", $wParam) $sFile = $sDroppedFile $bDnD = True GUICtrlSendMsg($iBtnLoad, $BM_CLICK, 0, 0) Return "GUI_RUNDEFMSG" EndFunc ;==>WM_DROPFILES #EndRegion Message Functions #Region needed additional functions Func _GDIPlus_SaveBitmap($sFilename, $hBmp, $iJPGQual = 90, $iTpColor = 0) Local $bError = False, $bResult, $aResult, $hBmp_BG, $hBmp1bpp, $hCtxt1bpp; $hBmp8bpp, $hCtxt8bpp Local $sSaveTypes = "|jpg|bmp|gif|png|tif|", $sSaveType = "jpg" Local $sSuffix = StringRight($sFilename, 3) If StringInStr($sSaveTypes, $sSuffix) Then $sSaveType = $sSuffix Else $sFilename &= "." & $sSaveType EndIf If FileExists($sFilename) Then Local $iChoice = MsgBox(4 + 32 + 256 + 262144, "Warning", "'" & $sFilename & "' already exists!" & @CRLF & @CRLF & "Overwrite file?", 0, $hGUI) If $iChoice = 7 Then Return 0 FileDelete($sFilename) EndIf If Not $iTabSelection Then $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iWidth, "int", $iHeight, "int", 0, "int", $GDIP_PXF01INDEXED, "ptr", 0, "int*", 0) ;create empty 32 bit bitmap $hBmp1bpp = $aResult[6] $hCtxt1bpp = _GDIPlus_ImageGetGraphicsContext($hBmp1bpp) DllCall($ghGDIPDll, "uint", "GdipSetInterpolationMode", "handle", $hCtxt1bpp, "int", 5) _GDIPlus_GraphicsDrawImageRect($hCtxt1bpp, $hBmp, 0, 0, $iWidth, $iHeight) _GDIPlus_GraphicsDispose($hCtxt1bpp) $hBmp = $hBmp1bpp ;~ ElseIf $iTabSelection = 7 Then ;~ $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iWidth, "int", $iHeight, "int", 0, "int", $GDIP_PXF08INDEXED, "ptr", 0, "int*", 0) ;create empty 32 bit bitmap ;~ $hBmp8bpp = $aResult[6] ;~ $hCtxt8bpp = _GDIPlus_ImageGetGraphicsContext($hBmp8bpp) ;~ DllCall($ghGDIPDll, "uint", "GdipSetInterpolationMode", "handle", $hCtxt8bpp, "int", 0) ;~ _GDIPlus_GraphicsDrawImageRect($hCtxt8bpp, $hBmp, 0, 0, $iWidth, $iHeight) ;~ _GDIPlus_GraphicsDispose($hCtxt8bpp) ;~ $hBmp = $hBmp8bpp EndIf Switch $sSaveType Case "jpg" Local $sCLSID = _GDIPlus_EncodersGetCLSID("JPG") Local $tParams = _GDIPlus_ParamInit(1) Local $tData = DllStructCreate("int Quality") DllStructSetData($tData, "Quality", $iJPGQual) Local $pData = DllStructGetPtr($tData) _GDIPlus_ParamAdd($tParams, $GDIP_EPGQUALITY, 1, $GDIP_EPTLONG, $pData) Local $pParams = DllStructGetPtr($tParams) If $iTpColor Then $hBmp_BG = _GDIPlus_ChangeBGColor($hBmp, 0xFF000000 + $iTpColor) $bResult = _GDIPlus_ImageSaveToFileEx($hBmp_BG, $sFilename, $sCLSID, $pParams) _GDIPlus_BitmapDispose($hBmp_BG) Else $bResult = _GDIPlus_ImageSaveToFileEx($hBmp, $sFilename, $sCLSID, $pParams) EndIf If Not $bResult Then $bError = True Else $bError = False EndIf $tData = "" $tParams = "" Case Else If $iTpColor And $sSuffix <> "png" Then $hBmp_BG = _GDIPlus_ChangeBGColor($hBmp, 0xFF000000 + $iTpColor) $bResult = _GDIPlus_ImageSaveToFile($hBmp_BG, $sFilename) _GDIPlus_BitmapDispose($hBmp_BG) Else $bResult = _GDIPlus_ImageSaveToFile($hBmp, $sFilename) EndIf If Not $bResult Then $bError = True Else $bError = False EndIf EndSwitch If Not $iTabSelection Then _GDIPlus_BitmapDispose($hBmp) If $bError Then MsgBox(16 + 262144, "ERROR", "An error has occured - the image couldn't saved!", 30, $hGUI) Return 0 EndIf MsgBox(64 + 262144, "Information", "Image successfully saved to '" & $sFilename & "'", 10, $hGUI) Return 1 EndFunc ;==>_GDIPlus_SaveBitmap Func _GDIPlus_ChangeBGColor($hBitmap, $iBGColor) Local $iW_TP = _GDIPlus_ImageGetWidth($hBitmap), $iH_TP = _GDIPlus_ImageGetHeight($hBitmap) Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iW_TP, "int", $iH_TP, "int", 0, "int", 0x0026200A, "ptr", 0, "int*", 0) ;create empty 32 bit bitmap Local $hBmp_TP = $aResult[6] Local $hCtxt_TP = _GDIPlus_ImageGetGraphicsContext($hBmp_TP) _GDIPlus_GraphicsClear($hCtxt_TP, $iBGColor) _GDIPlus_GraphicsDrawImageRect($hCtxt_TP, $hBitmap, 0, 0, $iW_TP, $iH_TP) _GDIPlus_GraphicsDispose($hCtxt_TP) Return $hBmp_TP EndFunc ;==>_GDIPlus_ChangeBGColor Func CopyImage2Gfx($hBmp, $hGraphic, $hDC, $hDC_backbuffer, $bW, $bH, $hIA = 0) Local $f, $iXPos, $iYPos, $iImgW, $iImgH _GDIPlus_GraphicsClear($hGraphic, 0xFF000000 + $iBGColor) If $bW < $iW_Prev And $bH < $iH_Prev Then $iXPos = ($iW_Prev - $bW) / 2 $iYPos = ($iH_Prev - $bH) / 2 $iImgW = $bW $iImgH = $bH Else If $bW > $bH Then $f = $bW / $iW_Prev If ($bH / $f) > $iH_Prev Then $f = $bH / $iH_Prev Else $f = $bH / $iH_Prev EndIf $iImgW = Int($bW / $f) $iImgH = Int($bH / $f) $iXPos = ($iW_Prev - $iImgW) / 2 - 2 $iYPos = ($iH_Prev - $iImgH) / 2 - 2 EndIf If $hIA Then _GDIPlus_GraphicsDrawImageRectRect($hGraphic, $hBmp, 0, 0, $bW, $bH, $iXPos, $iYPos, $iImgW, $iImgH, $hIA) Else _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBmp, $iXPos, $iYPos, $iImgW, $iImgH) EndIf DllCall($hDLL_GDI32, "bool", "BitBlt", "handle", $hDC, "int", 2, "int", 2, "int", $iW_Prev - 4, "int", $iH_Prev - 4, "handle", $hDC_backbuffer, "int", 0, "int", 0, "dword", $SRCCOPY) EndFunc ;==>CopyImage2Gfx Func _GDIPlus_Convert2HBitmap($hBitmap, $iColor); removes alpha backround using system color and converts to gdi bitmap Local $iBGColor = _WinAPI_GetSysColor($iColor) $iBGColor = 0x10000 * BitAND($iBGColor, 0xFF) + BitAND($iBGColor, 0x00FF00) + BitShift($iBGColor, 16) Local $iWidth = _GDIPlus_ImageGetWidth($hBitmap), $iHeight = _GDIPlus_ImageGetHeight($hBitmap) Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iWidth, "int", $iHeight, "int", 0, "int", 0x0026200A, "ptr", 0, "int*", 0) Local $hBitmap_New = $aResult[6] Local $hCtx_new = _GDIPlus_ImageGetGraphicsContext($hBitmap_New) Local $hBrush = _GDIPlus_BrushCreateSolid(0xFF000000 + $iBGColor) _GDIPlus_GraphicsFillRect($hCtx_new, 0, 0, $iWidth, $iHeight, $hBrush) _GDIPlus_GraphicsDrawImageRect($hCtx_new, $hBitmap, 0, 0, $iWidth, $iHeight) Local $hHBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap_New) _GDIPlus_BrushDispose($hBrush) _GDIPlus_BitmapDispose($hBitmap_New) _GDIPlus_GraphicsDispose($hCtx_new) Return $hHBitmap EndFunc ;==>_GDIPlus_Convert2HBitmap ;Code below was generated by: 'File to Base64 String' Code Generator v1.12 Build 2013-05-17 Func Reset_Icon() Local $Reset_Icon $Reset_Icon &= "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACC0lEQVR42mNkIAKwxjMJM/9i8vjx9M86hkMM35HlGAlpZslmcFMxllssrMcidq7/Ydr3pX9nE2dANIOImD7HXCltAT9hUX4GEUkhhps7vj+/kHpBCq8B7BHMvPwezFUCnHylopI8zOxM7AyszGwMAvwCDPwK3Axz9Hf6/rv9fwtOA5itGIPlUvjXiMryMPDy8jFwMHMwcLJzMgjw8jNoK6gwrF9y/vGh2MNy+L3AwcDGYMRgoJMivdLQWUOBm4WbgYebh4HxNyPDP5FvDPNd92S92/N5OsFAtFqj8cDCVVeenY2D4fyxa3c4jkvclnDm9fzw4BvDishNjAQNCDhu/VbfREPo28/vDA8OvPq42mePQGRKLPfyOYu/EhWNQUdt3uiaawh//PKR4cdhln8zfJczo6vBa4DHJtPHZj66Mm/fvWf4tov5//yoNUwwuf///7MwMjL+wWuAzUyd97ZpJgJvnr5h2H/i9Ls7IS+FQeJrVq1nDAkL/E/QBYELvK+yeX3UYv/Ew7Dn7u4HDGdzjJ9VTXxHtBeCZwR1vOO9H8tjwyL15fC3R5/OftQ62//kK9EGgIDaZMmez4ovikV5JRmYtvBmXui+OQMkPmPxSsaM2PD/BA0AgfA6t9gzpqcX/WT6yiC6V0n3fN+NK/uOXmZ0stYlzgAQiOwOdb/14+yEs5z3/jOUMGjBxAESN7ER3OAlewAAAABJRU5ErkJggg==" Return Binary(_Base64Decode($Reset_Icon)) EndFunc ;==>Reset_Icon Func _Clipboard($bSaveBinary = False, $sSavePath = @ScriptDir) Local $Clipboard $Clipboard &= 'iVBORw0KGgoAAAANSUhEUgAAAAwAAAAQCAMAAAAVv241AAABBVBMVEX8/f/s7vD49vj5+vv4+fuQSBTh4eH4+vvk5ujt7u/t7vDj5efAwMDy8vP09fbS0tLc2tr49/j9/v/59/jw8PD7/f/Tizba2trDkFbQgSTg29OtfUTq2MDk5OTj4+Pk4uHPfyLk4+LdkTLSiTbSgiPLeyLj4+Tn5+e2il62mn/m5ube1cvs7u+zgU+5cCnk5ebWlEOufEHNzc3Fdyazbi7Ozs7MzMytcDiyczq2k2+vd0fj5OaxbzauflatajSvh2bk5eenZjKyknahYTGleVbv7Ozz8vPHxcOudkHz9PXw8fLl5uedXS6ZURuxcDaQRxSMRhSJRhaMTiOTXDSYaEWUXjeYTxv6l0DeAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAlElEQVR4Xj2M1a6EUAADe3CHdXd3d3eXq///KbtLgHlpJm0K7xtOUQKfhL/ZOrR1vdePpDPIho1CjOPi5Uo0iFCCgglPSkimXJZII+TyltBSER3BmjHVGuoNj9uEFo/oypTPhCEDDAVH7hhPnNkUM7vhyRyLpX0trrCW7WuywdbY7VVV007nyxU3ln2wz6/vn9+//xdk9BJOUsHn+gAAAABJRU5ErkJggg==' Local $bString = Binary(_Base64Decode($Clipboard)) If $bSaveBinary Then Local $hFile = FileOpen($sSavePath & "\clipboard_paper_16x16.png", 18) FileWrite($hFile, $bString) FileClose($hFile) EndIf Return $bString EndFunc ;==>_Clipboard Func _Logo($bSaveBinary = False, $sSavePath = @ScriptDir) Local $Logo $Logo &= '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' $Logo &= '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' $Logo &= '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' $Logo &= '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' $Logo &= '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' $Logo &= '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' $Logo &= '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' $Logo &= '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' $Logo &= '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' $Logo &= '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' $Logo &= 'Iw0cf2+J91bKyvIpfzF5zdwr8UwRH2pjlHdtr8cxTZfq4fFr8fXWWGNUHUPzUZgQ661ddTL2GsuOQzw/XRLrHavwrNgnEi7sp2VtNJqIGv2GjqIG6sa/60L3KPz41hjrGZA/frrQrmnxJ2RprPp4VHL+EmsEbMkEexT1nefzZZcPiWwxyFGyqCSDbj2VkjzG5uSzXJPGsFIvTWbKOwg8g+UPrPRQa2bsFJJjU0cCG8eHv624nlWRSYcQn0cydJf/ADhWJix8YWSRA+dei9uaSP7v5wqLIYbSK+ZRr1G/up5TNLM7gBjIRu/1/O3TBgl2IBsbHLvt10sMEWHwEKjKo+kYD1D21+NzTYjqZrL3CssMaxjgot+daTLo5frIzlbvFeLxCzLwmj94tQ0mDRreZL1dYr/Z857GT+ahpxaV2Z37Sb+CDK6xgmwzG2v5loQ3jVUMV6vzDE6JSz6JsoG82qOKNWwGFVQtz9K38vtrLCluJ3ntP5zDNDodFDrVXJ6fGvH4zIOEEeX1m9ZkTnna7a2Pp/4ebRWD25t9l6Z8b+DhOUzRHRkqV4jUW9lJ8rVlnj5j5lIv16/DJO6o5ocQYsdOzNJmOVUXyddteoDjXyjFuW0utBltZf8AzX/yLOM0Q+UedwrOkTTOTYKB7aDQ3VrAlGFiL+7wdJO1huG89lRyWK51DWO6gTAqa9eQZc3bVhqH/Ix8SrSSwMmR0jtmA+F9tRYuV2kYfREPw1bqWLJLNKwzZIkzG3Gi2HY802ZWFip6xyzzSxqZIoWKORrXVUbQ4yaPCsgzHWpvvCg+3/kfZRasbisZgpQrRqqaO0mpSfT5V6xzNdJpCGMbCxGtj/m5Skqh0O1SNVav/Yb/AP/EAC0QAQACAQMCBgICAwEBAQEAAAEAESExQVFhcRCBkaGxwdHwIOEwQPFQkGBw/9oACAEBAAE/If8A4tX4KSsrKS/4Ovgv+Kx8It/kuMJlJSAZf+40iZSA8asrKeAf9u5cv/ylgkI3gm8eadSdSG7wHeEbwjeV5g8w3eE7y2X40znS4ZFotVvgB/xLAgN0I3iOYbvA3Qt0t/msaSsth/nq8HlgcIgcxW85E60eSPJAO88ihBNIglofOH+xcphG8RzAd5ZB/wDHog7oW6NQj1tTvsecMjuZen5TgHZJ1SUrATr0ofofeStgQLKi0pXTEzYSWASahpyHoEv3KNsLZ+tX1L+8dfwj5Quzrqbnc2gboEDGKhmO8TCDmh5ifgWGtSsR48Qm/wCK1DEJGBarpGrDi2n3PYQzHGontn3HfHZ+URC9Z05pE7DYentv85fNpW6+XEASBYjrF/FfDFuhhyPaBrwHzF65bGtGY/8AMysZkvVh1SCDIEolb5I4MQzK+wfeUxMpC7b2J9z72PqD1lWsfcJoyOkfKymE7xEeiHbfZZ5hb9xhDDUBQE0f7FM5MuG5oPsGYUBFv7BdyxPtGZeXHrDYrHRln/jUQzLK2WgyrgIFfWlD9LQnGWhgIq19zSw9Ve8T5KA/EV8uo9JiFvfmhsUanpHFDFu5qz9P2IamLQztAxZ7L0cQTfZ7v02lY17/AAP3UMEY9M9e8GKI0Ojy/wDEEmblCXZBlMRu8FwOfa49FXk8XA0EKEDdEXrFVmGVUs/gsrQDwLVidrb/AHU4IwDD7AmLVxr+nMs1cflIN6lDsvPSVqIlssudC2676Svp5LXFUQRPMrAMxSxcItrRpB7rNzD6HpNNoMC1Hse8VhNEWoklYGFpcuX4hI+DNEN2WnuvN+InFqPdiRtVla4CaSEVhp0na12vtzMwxmaXUdYj11IUVeaErEoJcf4UiUlOYGEX4X/EL8GkSSvMCxwlRgJjcLpdWNQ/qqvutY2cOjGW8D3ZpDEzax0BsTTGUSsAwtLl+BPgIvwXL/hf8LlZXxXL8Qkf4LKkFHK0DVcEXDhw1BwdesrSBqaPglXugGD7ecAAANoitJWkOpGKrdzJ2/KaVqDWR08H01IH' $Logo &= '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' $Logo &= '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' $Logo &= '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' $Logo &= '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' $Logo &= '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' $Logo &= 'xAO2/f8AiLzHk2aaZmLs9Nn9tREyXaY9mkhkOnTD8nehMZVjpEPeU7UAXy5Cze5N0tiwc1c54f3RJDO7f5t4+omn5NDpu+KRqStGsjCt8xjHR1mpKxe0Y/3RAFgddqSyIgAOYZA2/gUl9Tv+aLAE0/pKzNTD+T8FRsVGCwd8vjxeVsRI4kMdpijYxbOOz9NRVy5sV7lu8663qSiAsGgfuXWmlwi3QbzzMe+1OybI76PJQ9oJpv2+6n63JOXDfxmNaJEmcuLbBob78VBGMATy3ex3vYrTsjnIu4WiO4/x7ZCN7j9FIQcITi7PbHQPRQIFJduaCxlwGxI0iLovlNfQA0mNEmHyzUhBG2/hLUFIRGCX47ZoseVr3GIIiyXzmeKZYlgM4mWY6HzpRrJFXzTCRn4/Qou1iEhabZi0RUGaOzL2i3n7hwskg5bf74olW8IDlIl2DfeKIgRgLdB8LD09A1w1Nz9xVkkdoHzbzepCiyBq3cTvHu5KYy0t181aopEDYpsYNr4x6QhgDneLWBc7HtkeINi3U+6jSSm4toAwuZ7RrSQxUKGL5DwUzOHJvTbZwjP7zUXaUZvr/p43xSiMYAnlunQ+bFPemMTkXYWiO4/zBBGPSUIC5cFY4SwXI6kXXc3es1ZIurPgj99qDwtix7H3f/Hfydj9OlBgpc/k+417ywxbJztM+KciSYHNi1uLW4/zllBSZ4GI3btqAihvq/jt/jmdDCYHPWogOqq5tEd6iblsW8v0Ne1I0P3V1om0NGFhgGMWIni3+RaW7Njr/wBC6rJ0z9JQmSQT+8+sgstQUcbxJxOU64/+HFRrrxt3tO8UBQ4jz6NDh3hPZ15/9F//xAAsEQEAAgECBAUEAgMBAAAAAAABABEhMUEQUZHwYXGhwdEggbHhMPFAUHBg/9oACAECAQE/EP8AkV1/kI1P0LWs1/0gOjL3rLWh5d3FGLerAc26sals49WALNPNHUKeeT3/ADFMdW364nTWvvjiIlnFajaWj1e+sU5v36wo3g9O/vM1o9e+n0G6q2N2jl/ClKMGPmA56ekKz4fEVOr1ZgTB69+v815Nu8D/AEe0YEU/4i4tWOuo97s0pEBTECbOU/J7M0eAchuROV2+OGQPL837cLIO66QUO9eN3gMvxPED3XAczDzhENoDoyzwSH4GWKhq3Pv8QW4dgrvveLeGIAtmO4HAcfBIE0MQs2aUd97RbUdJoqZauYLFxqjMyY9X9y46HX9Q/PNUahle2c4YILIY0LggK7+8BtYrj43qy3ZqV4cORvx2hyRh3EEauLVjvvyjW3sNvhBmgdYAtag6hvgg0ZhdhUAWzHcDgPofR279orOZ4OaY6xwOcKx4+0djvfhW1zseTwNXvGPyxQGMUOXzHEHXiLW934Poa81gbEw6nfj+pgj9o6FQAA2iveWkcWYIqp3mr8L9JdKS3ph+jXOc/M/niVpV5x0v5jRodf1AqbpK3/DvrLBQB6/ENJ4P5IKA37+YJwLY6VLUpoCGhuYnIz6TfNiMLDuueK6ITesyDnEXVXlr8xDIHX9Q2c9YBbYhKWUclss3zDpteftKDL7G3TMopt493AaTlj2ggiWtMP0YEW2anCofKYMYz7fuZm20K2/XgSMs0lZMk8veNUY6LcHVgIdnFlBGOKbY6F1Hp+fxDke9TheCbv5gqoIhyzMi+7jEU5/SqHmQMHN4gvz9g4Yy0YFl48IHcOzw91+I6+72YCrzzFQ8yZeJ/ULjtt4S1uRUpZs8/Y4KlQbC5gKwuX7Sqm+ftwQNeUyDmo0d8oQKzDEHh6y/g137QAu39/aEE294agBVz+k7Eat696QzluITEDaswK5glN5QyxnOBAooiF13+4gRI4IMirU5c/oqU1Jgk2mCqxmZ3X+ajGMwQK6wzUd0G0TAzLm5GdG+/tK2+iFUBCBBWe9Ppq8yFq34JBSCT2f3rwclakCcEGaQuiYgYpDQGHV4+yQ1LYlKguBTU0uaGvve' $Logo &= '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' $Logo &= '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' $Logo &= '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' $Logo &= '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' $Logo &= '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' $Logo &= 'TBe3QLqE/ZO+JMvytHBQbaB4gRzaDyFarq5h0CCiBCAGXllxW1Y9gQAUStVB1kQuEcEAwP4JcMuPiRbLYvixk6mjuM2Got7zVOmb+yFkaUNdkdTlYJxwZXToIP8AtbvUn9dHeK3msXdW/ELu1srqfjn4l1xtBMkRcPUI3T1KrCCcERUG9kU3A7JSQRpLa4c0+otolFBjBCGkUthHSAYH8n4CHdop2CIxB3RLU6MlbPFUoc5d2hxe/FKvywxL2o5R70NEoQ7WRRjTCAJUEy4si+iNmn1DbfUJs9RsgDpBTSZtIWgjjLzE1U89WrBOrc2je417azKqi9uAlmFSWl6hxyrkO0DsIVVzmWidTfemGtdDdI2QhQQ5AwGob6jkKYKFS9kjU4K9H5AX3mFyLZ7lqWzbS1FNJiGg+LDMNbJZXCnT6jeiGYJWqqbZMkaYStKlbSO6RDSAGkPWQuuoRwTAVGTxYSoUobtomNGXLP4hbAwnlHoVWFQ3JLKFbfUM6fUpqExVUYwjpAMD/AkB1JtEVtHjTppTshMCVCEBhRNBhCpS3qUi5ujWQMWP6uWxW8sdpzsgUJrZjoEqMfUpsJpJCgp8JEup8ATaEVEleIU2lfySEdICxfzsMaEd0EdLHSIUiYBTwIvKI89Zn0dgvRbvAMsNhvuGP7UXamq2SjDQYY2Stga0iOJXiCeKOsoVFp0NWVKjaVgTQlSo2g29gNvE6ZcV3jtK8QJtKiSvEK7Sv5ukuIsTJHCQZVaAN2Hu1hT24UGr2HM9Kkd9uOqSwWAnSBKjFeIU2lfFRtEcfEGU4lOIRXwqVCgdkFMQbb32VNNQQUyniqbOWfji/wA6Xafk1DW77qgxBBRDTSOaQQ0fGPmol2leIA2hSVG0rxCK+Kj0TDaVGOyVLNYS6QR0hxUS7RkSAbTsleIV2lf46lSpUqVoNrI1n6Tak2qbZANof6ioLrNgl3hL3H1GOn1GzGUlEoQ+EogVqBsBFtVgjUVS4K8QlCWUAsWMLlm1bwIhkFNPb+dzl2otoL0miJDmlACSw6kIpU4HWtZoZWWW4qDT/NUgWsijfw8O2BX+pUYIS8shfo9TZ0E6QpKjbaV4gf69Sv8AaSNtSU4geJUr/YqNoh2+QCaED+AcP0lYlk0hEhdX1BA9cRhsgwUcGLsuqGseUwQIjgdbD+FRpbVWrVzQL0BWgUA9GKiIJTYvZTrMzIs0CCTNDejNJbZzRDUA0A2P8yRtqSnEKSv9dI32leIRX/19Qk6F9L1AyrhWIo0GTCyQCNOBEtEPwVc5SZixS3LYXTTFUEeKJIghpVqlp+QY4rTK75yWNapxG0xkqVMk2ujTZmlEFQKtbf8A8HaPNCFiqjdVXlWO7hTIDcitK4LaWLC5wZYBNug9wvwVf6UW7pMJYQygqAoDj/8Ag3//2Q==' Local $bString = Binary(_Base64Decode($Logo)) If $bSaveBinary Then Local $hFile = FileOpen($sSavePath & "\GDI+ Color Transformer 07.2.2.1.jpg", 18) FileWrite($hFile, $bString) FileClose($hFile) EndIf Return $bString EndFunc ;==>_Logo Func _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 ;==>_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 #EndRegion needed additional functions Requirements: Vista or higher operating system! Souce Code is made for AutoIt version 3.3.8.1 only!
       
       
      Please report any bug if found (I'm sure you will  )
       
      Download: GDI+ Color Transformer v0.9.7 build 2016-04-23.7z  (previous downloads: 347)
       
      Br,
      UEZ
    • By UEZ
      I'm searching for a way to set an icon for a system menu entry in the console window. I can add / remove entries but I didn't find a way to set an icon for the entry I made.
      Example:
      #AutoIt3Wrapper_Change2CUI=y #include <GDIPlus.au3> #include <GUIConstantsEx.au3> #include <GuiMenu.au3> #include <WindowsConstants.au3> Global $id_Test = 5000 Global $hConsole = HWnd(DllCall("kernel32.dll", "hwnd", "GetConsoleWindow")[0]) If Not $hConsole Then Exit HotKeySet("{ESC}", "_Exit") Global $hSysmenu = _GUICtrlMenu_GetSystemMenu($hConsole) Global $iCount = _GUICtrlMenu_GetItemCount ($hSysmenu) _GUICtrlMenu_InsertMenuItem($hSysmenu, $iCount, "Test", $id_Test) _GDIPlus_Startup() $hBitmap_GDI = _GDIPlus_BitmapCreateFromMemory(_Test(), True) ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $hBitmap_GDI = ' & $hBitmap_GDI & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console $hBmp1 = _WinAPI_CreateSolidBitmap($hConsole, 0xFF0000, 16, 16) ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $hBmp1 = ' & $hBmp1 & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console $hBmp2 = _WinAPI_CreateSolidBitmap($hConsole, 0x00FF00, 16, 16) ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $hBmp2 = ' & $hBmp2 & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console ;ConsoleWrite(_GUICtrlMenu_SetItemBmp($hSysmenu, $id_Test, $hBitmap_GDI, False) & @CRLF) ConsoleWrite(_GUICtrlMenu_SetItemBitmaps($hSysmenu, $id_Test, $hBmp1, $hBmp2, False) & ", " & @error & @CRLF) ;_GUICtrlMenu_SetItemBmp($hSysmenu, $id_Test, 8, False) ;set the default close icon _GDIPlus_Shutdown() Do Sleep(1000) Until False Func _Exit() ConsoleWrite("Bye..." & @CRLF) _GUICtrlMenu_DeleteMenu ($hSysmenu, $id_Test, False) _WinAPI_DeleteObject($hBitmap_GDI) _WinAPI_DeleteObject($hBmp1) _WinAPI_DeleteObject($hBmp2) Exit EndFunc ;Code below was generated by: 'File to Base64 String' Code Generator v1.20 Build 2020-06-05 Func _Test($bSaveBinary = False, $sSavePath = @ScriptDir) Local $Test $Test &= 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA3XAAAN1wFCKJt4AAADKElEQVQ4yz2RT2gcdRTHP7+Z36y7yzZZdvJv22i0rBpiAwnWCMZrUCGIBxEvpQSEHAQhePLkyUKg6Em9iZCcahH0pFYxkIqiIdHKYmPUUHcDmU2TuJnZzc7s/H7PQ5M8ePAu7/M+X56y1hKGYY+IOEDqOI6TzWY1gFIKEcF1XRzHUWmaJnF8bHBy5pfbnz9fb0hBh2F4bm5ubjWKogudTqdVqVT0/Py853kehUKBQqHA2tqaVKtVfenS2P6HH396PDri9D9+cdC/8dkXNW2t9fb29spRFPmtVqtULBaVMYZ8Pk82m8X3farVKjdv3qCn+FbpnFuXfNpQkkwlX33z3RtaKYXW2mqtcV1XtNZks9kzQCaTIeNp4sSh8rAnzSe0HO5bt1arHR51y79pEcEYo05Aylp7OqOUIk0TRp+aYO5Ki3B3VR3s70pictzZGlC5jHW0UgprLVEU4Xke29vbLCwsoLXGcRRxYjk/2MtLz2X4/tvbaO3y9XoPlUe7CI7VAMYYPM+jXC5jrcUYAwipUeSzHhV/k59+bFK5OMytOxco9ezQTQ2A4ujoqDQ+Ph4sLS2JiNiDgwM5PDyQ3SCQ/5ptubv6rsy9XJIfvnxbNv/8W+7d+9deu/aeTE9PB2EYljSAiKje3l7SNCUIAkDQXp77f3zE4uJ1Xnv9KoWRK+zs1DlfHiCXy2OtBcA5AdDpdHBdl4F+n77BEdz2z3zw/iKvvHqVZ194h0wmz0B/Ca094jjmtE4NEBFarRa7jfvkHgqp/rrKxOQzjF6+wtY/u4g9Jo5TfL+EiGCtxVqLFhGUUhhjsNZgrcvqrU948rFhKlNvEkUdtNvBoFEqPVtUSqGUQiulaDabtNttPC/D5t3fqTU0Y5dfpNFogFhEOLsaxzHtdpsgCNT6+rrSSZIwOztrhoeH' $Test &= 'qdfrRmutJp6e4q+tKsbYs3in7+7r65OhoSE9MzNjkiRBt9ttkiRxjTHkcjl3bGxMPYhjSdP0rLvdLt1uF9d1BcDzPHdyclL0yspKuLGxcT0IgkeKxaINgsADXBFxAefEQB4ImNT3/W4Yhk6z2awtLy9H/wPnrsNEnFPl4QAAAABJRU5ErkJggg==' Local $bString = _WinAPI_Base64Decode($Test) If @error Then Return SetError(1, 0, 0) $bString = Binary($bString) If $bSaveBinary Then Local Const $hFile = FileOpen($sSavePath & "\AutoSave_16x16_04.png", 18) If @error Then Return SetError(2, 0, $bString) FileWrite($hFile, $bString) FileClose($hFile) EndIf Return $bString EndFunc ;==>_Test 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  
      You must compile and run it to see the menu entry in the console window.

       
      Any idea?
    • By Tony007
      Hi,
      is it possible to export only the area "$idOutput" with the TEXT as a PNG?
      Thanks
      #include <ButtonConstants.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> Example() Func Example() Local $hGUI = GUICreate("Test", 700, 700, -1, -1) Local $input1 = GUICtrlCreateInput("", 10, 10, 150, 20) Local $idButtonStart = GUICtrlCreateButton("Start", 200, 10, 50, 30) Local $idButtonClear = GUICtrlCreateButton("Clear", 260, 10, 50, 30) Local $idButtonExport = GUICtrlCreateButton("Export", 320, 10, 50, 30) Local $idOutput = GUICtrlCreateLabel("TEXT", 10, 50, 500, 500, BitOR($BS_PUSHLIKE, $SS_CENTER)) GUICtrlSetFont($idOutput, 45, 800, "", "Impact") GUISetState(@SW_SHOW, $hGUI) ; Run the GUI until the dialog is closed While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop Case $idButtonStart $ContentInput1 = GUICtrlRead($input1) GUICtrlSetData($idOutput, $ContentInput1) Case $idButtonClear GUICtrlSetData($input1, "") GUICtrlSetData($idOutput, "") Case $idButtonExport EndSwitch WEnd GUIDelete($hGUI) Exit EndFunc ;==>Example  
    • By Beege
      Heres a function for searching for a bitmap within another bitmap. The heart of it is written assembly (source included) and working pretty quick I feel. I have included an example which is pretty basic and should be easily enough for anyone to get the concept. 
      You will be given a small blue window that will take a screencapture of that size:

       
      It will then take a full screenshot and highlight all locations that it found

      Please let me know if you have any issues or questions. Thanks!
       
      Update 8/5/2019:
      Rewrote for fasmg. Added full source with everything needed to modify
      BmpSearch_8-5-2019.7z
      BmpSearch.zip
       
      GAMERS - Asking for help with ANY kind of game automation is against the forum rules. DON'T DO IT.
    • By UEZ
      Here a little tool to display the histogram of an image (inspired by this thread):
      )

      ;#AutoIt3Wrapper_Icon=Histogram1.ico #AutoIt3Wrapper_Compile_Both=y ;#AutoIt3Wrapper_Res_Field=CompanyName|UEZ Software Development ;#AutoIt3Wrapper_Res_Field=ProductName|GDI+ Show Histogram ;#AutoIt3Wrapper_Res_Field=ProductVersion|%AutoItVer% #AutoIt3Wrapper_Res_Fileversion=0.9.8.0 ;#AutoIt3Wrapper_Res_Field=Build|2015-07-10 #AutoIt3Wrapper_Res_LegalCopyright=UEZ Software Development #AutoIt3Wrapper_Res_Language=1033 ;#AutoIt3Wrapper_Res_Field=URL|http://www.autoitscript.com/forum/index.php?showtopic=147777 #AutoIt3Wrapper_Run_Au3Stripper=y #Au3Stripper_Parameters=/so /pe /rm #AutoIt3Wrapper_Run_After=del /f /q "%scriptdir%\%scriptfile%_stripped.au3" #AutoIt3Wrapper_UseUpx=y #AutoIt3Wrapper_UPX_Parameters=--best --lzma #AutoIt3Wrapper_Run_After=upx.exe --best --lzma "GDI+ Show Histogram_x64.exe" #AutoIt3Wrapper_UseX64=n #include <Constants.au3> #include <GUIConstantsEx.au3> #include <GDIPlus.au3> #include <WindowsConstants.au3> Opt("MustDeclareVars", 1) Opt("MouseCoordMode", 2) _GDIPlus_Startup() If @error Then Exit MsgBox(0x40010, "Error", "GDI+ Show Histogram can run on operating systems Vista or newer only!") Global $ghGDIPDll = $__g_hGDIPDll, $aRes Global Const $hFullScreen = WinGetHandle("[TITLE:Program Manager;CLASS:Progman]") Global Const $aFullScreen = WinGetPos($hFullScreen) Global Enum $HistogramFormatARGB, $HistogramFormatPARGB, $HistogramFormatRGB, $HistogramFormatGray, _ ;http://msdn.microsoft.com/en-us/library/windows/desktop/ms534129(v=vs.85).aspx $HistogramFormatB, $HistogramFormatG, $HistogramFormatR, $HistogramFormatA Global $tStructChannel0 = DllStructCreate("uint channel0[256]") Global $pStructChannel0 = DllStructGetPtr($tStructChannel0) Global $tStructChannel1 = DllStructCreate("uint channel1[256]") Global $pStructChannel1 = DllStructGetPtr($tStructChannel1) Global $tStructChannel2 = DllStructCreate("uint channel2[256]") Global $pStructChannel2 = DllStructGetPtr($tStructChannel2) Global $tStructChannel3 = DllStructCreate("uint channel3[256]") Global $pStructChannel3 = DllStructGetPtr($tStructChannel3) Global $s, $sFile, $hImage, $bImgLoaded = False, $aLuminosity[257], $aCRGB[257] Global Const $STM_SETIMAGE = 0x0172, $iLineJoinBevel = 1, $frY = 0.299, $fgY = 0.587, $fbY = 0.114 Global Const $hGUI = GUICreate("GDI+ Show Histogram v0.98 beta by UEZ build 2015-07-13", 468, 310, -1, -1, Default, Default) GUISetBkColor(0xFFFFFF, $hGUI) Global Const $sLabel_Titel_Txt = "GDI+ Show Histogram" Global Const $iPosX_Label = 20, $iPosY_Label = 12 Global Const $iLabel_Titel_Shadow = GUICtrlCreateLabel($sLabel_Titel_Txt, $iPosX_Label, $iPosY_Label, 429, 57) GUICtrlSetFont(-1, 30, 400, 0, "Comic Sans MS", 4) GUICtrlSetColor(-1, 0xC0C0D8) Global Const $iLabel_Titel = GUICtrlCreateLabel($sLabel_Titel_Txt, $iPosX_Label - 4, $iPosY_Label - 4, 429, 57) GUICtrlSetFont(-1, 30, 400, 0, "Comic Sans MS", 4) GUICtrlSetColor(-1, 0x0000C0) GUICtrlSetBkColor(-1, -2) Global Const $iPic_Histogram = GUICtrlCreatePic("", 20, 90, 255, 127, -1, $WS_EX_STATICEDGE) GUICtrlSetCursor(-1, 14) Global Const $iPic_ColorGradient = GUICtrlCreatePic("", 20, 220, 255, 24, -1, $WS_EX_STATICEDGE) Global Const $iGroup = GUICtrlCreateGroup("Channel", 290, 84, 160, 164) Global Const $iRadio_L = GUICtrlCreateRadio("Luminosit&y (gray)", 300, 100, 110, 20) GUICtrlSetTip(-1, $frY & "*R, " & $fgY & "*G, " & $fbY & "*B") GUICtrlSetState($iRadio_L, $GUI_CHECKED) Global Const $iRadio_C = GUICtrlCreateRadio("&cRGB", 300, 130, 60, 20) GUICtrlSetTip(-1, "Combined average of RGB values") Global Const $iRadio_R = GUICtrlCreateRadio("&Red", 300, 160, 60, 20) Global Const $iRadio_G = GUICtrlCreateRadio("&Green", 300, 190, 60, 20) Global Const $iRadio_B = GUICtrlCreateRadio("&Blue", 300, 220, 60, 20) GUICtrlCreateGroup("", -99, -99, 1, 1) Global Const $iButton_Save = GUICtrlCreateButton("&Save", 209, 265, 70, 30) GUICtrlSetTip(-1, "Click button to save all histogram images") GUICtrlSetState(-1, $GUI_DISABLE) Global Const $iButton_Load = GUICtrlCreateButton("&Load", 290, 265, 70, 30) GUICtrlSetTip(-1, "Click button to load an image") Global Const $iButton_Exit = GUICtrlCreateButton("E&xit", 390, 265, 60, 30) Global $sLabelCredit_Txt = "coded by UEZ'13" Global $aLabelCredit_Pos[StringLen($sLabelCredit_Txt)][4], $u, $iFS = 6.5, $iY = 280 For $u = 0 To UBound($aLabelCredit_Pos) - 1 $aLabelCredit_Pos[$u][0] = StringMid($sLabelCredit_Txt, $u + 1, 1) $aLabelCredit_Pos[$u][1] = 20 + $u * ($iFS - 0.25) $aLabelCredit_Pos[$u][2] = $iY $aLabelCredit_Pos[$u][3] = GUICtrlCreateLabel($aLabelCredit_Pos[$u][0], $aLabelCredit_Pos[$u][1], $aLabelCredit_Pos[$u][2], $iFS, $iFS * 1.8) GUICtrlSetFont(-1, $iFS, 400, 0, "Comic Sans MS", 2) GUICtrlSetColor(-1, 0x006000) Next Global $aLabelCredit_AnimPos[300] For $u = 0 To UBound($aLabelCredit_AnimPos) - 1 $aLabelCredit_AnimPos[$u] = $iY Next Global Const $fLimes = 2.2, $fStep = 0.1 Global $iPT = 0, $z = Int((UBound($aLabelCredit_AnimPos) - ($fLimes * $fStep * 100)) / 2) For $u = 0 To $fLimes Step $fStep $aLabelCredit_AnimPos[$z] = $iY + Sin($iPT * 4) * 10 $z += 1 $iPT += 0.075 Next Global $ihGui_PreviewSize = 256, $iBGColor = 0xF0F0F0 Global $hGui_Preview = GUICreate("", $ihGui_PreviewSize, $ihGui_PreviewSize + 58, -1, -1, $WS_POPUP + $WS_BORDER, $WS_EX_TOPMOST, $hGUI) Global $iPic_Preview = GUICtrlCreatePic("", 0, 0, $ihGui_PreviewSize, $ihGui_PreviewSize) Global $idLabel_Info = GUICtrlCreateLabel("", 0, $ihGui_PreviewSize, $ihGui_PreviewSize * 2, 58) GUICtrlSetFont(-1, 8.5, 400, 0, "Arial", 5) GUICtrlSetColor(-1, $iBGColor) GUICtrlSetBkColor(-1, 0x333333) Global Const $hTexture_Checkerboard = _GDIPlus_CreateCheckerboardTexture(8, 0xFFFBFBFB, 0xFFFFFFFF) Global $hHBmp_L = _GDIPlus_CreateColorGradient("L", 256, 24) Global $hHBmp_C = _GDIPlus_CreateColorGradient("C", 256, 24) Global $hHBmp_R = _GDIPlus_CreateColorGradient("R", 256, 24) Global $hHBmp_G = _GDIPlus_CreateColorGradient("G", 256, 24) Global $hHBmp_B = _GDIPlus_CreateColorGradient("B", 256, 24) Global Const $hHBmp_HL = _GDIPlus_BitmapCreateFromScan0(256, 127) Global Const $hCtxt_HL = _GDIPlus_ImageGetGraphicsContext($hHBmp_HL) Global Const $hHBmp_HC = _GDIPlus_BitmapCloneArea($hHBmp_HL, 0, 0, 256, 127, 0x0026200A) Global Const $hCtxt_HC = _GDIPlus_ImageGetGraphicsContext($hHBmp_HC) Global Const $hHBmp_HR = _GDIPlus_BitmapCloneArea($hHBmp_HL, 0, 0, 256, 127, 0x0026200A) Global Const $hCtxt_HR = _GDIPlus_ImageGetGraphicsContext($hHBmp_HR) Global Const $hHBmp_HG = _GDIPlus_BitmapCloneArea($hHBmp_HL, 0, 0, 256, 127, 0x0026200A) Global Const $hCtxt_HG = _GDIPlus_ImageGetGraphicsContext($hHBmp_HG) Global Const $hHBmp_HB = _GDIPlus_BitmapCloneArea($hHBmp_HL, 0, 0, 256, 127, 0x0026200A) Global Const $hCtxt_HB = _GDIPlus_ImageGetGraphicsContext($hHBmp_HB) _GDIPlus_GraphicsClear($hCtxt_HL, 0xFFFFFFFF) _hBmpToPicControl($iPic_ColorGradient, $hHBmp_L) Global $hB_H = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hHBmp_HL) _hBmpToPicControl($iPic_Histogram, $hB_H, 1) GUISetState(@SW_HIDE, $hGui_Preview) GUISetState(@SW_SHOW, $hGUI) ControlFocus($hGUI, "", $iButton_Load) Global $hPen_H = _GDIPlus_PenCreate() $s = "L" Global $iDummyL = GUICtrlCreateDummy(), $iDummyC = GUICtrlCreateDummy(), $iDummyR = GUICtrlCreateDummy(), $iDummyG = GUICtrlCreateDummy(), $iDummyB = GUICtrlCreateDummy() Global $iHistogramFormat, $hHBmp_Preview, $aPosCtrl, $aPosWin, $aMouseInfo, $aPos_hWnd, $imp, $iVal, $iMpos_oldx, $iMpos_oldy, $sType, $iPaletteType, $iPixelFormat Global $fAverage_L, $fAverage_cRGB, $iAverage_R, $iAverage_B, $iAverage_G, $o = 0 Global $bShow = False, $bHide = False, $bIsAlpha = False, $bIsGray = False Global Const $iEntries = 256 Global Const $tagCOLORPALETTE = "uint Flags;" & _ ; Palette flags "uint Count;" & _ ; Number of color entries "uint ARGB[" & $iEntries & "];" ; Palette color AdlibRegister("AnimateLabel", 60) While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE, $iButton_Exit AdlibUnRegister("AnimateLabel") GUIDelete($hGui_Preview) GUIDelete($hGUI) _WinAPI_DeleteObject($hHBmp_L) _WinAPI_DeleteObject($hHBmp_C) _WinAPI_DeleteObject($hHBmp_L) _WinAPI_DeleteObject($hHBmp_R) _WinAPI_DeleteObject($hHBmp_G) _WinAPI_DeleteObject($hHBmp_B) If $hHBmp_Preview Then _WinAPI_DeleteObject($hHBmp_Preview) _GDIPlus_PenDispose($hPen_H) _GDIPlus_BrushDispose($hTexture_Checkerboard) _GDIPlus_GraphicsDispose($hCtxt_HL) _GDIPlus_GraphicsDispose($hCtxt_HC) _GDIPlus_GraphicsDispose($hCtxt_HR) _GDIPlus_GraphicsDispose($hCtxt_HG) _GDIPlus_GraphicsDispose($hCtxt_HB) _GDIPlus_BitmapDispose($hHBmp_HL) _GDIPlus_BitmapDispose($hHBmp_HC) _GDIPlus_BitmapDispose($hHBmp_HR) _GDIPlus_BitmapDispose($hHBmp_HG) _GDIPlus_BitmapDispose($hHBmp_HB) _GDIPlus_Shutdown() $tStructChannel0 = 0 $tStructChannel1 = 0 $tStructChannel2 = 0 $tStructChannel3 = 0 Exit Case $iRadio_L, $iDummyL If $s <> "L" Then _hBmpToPicControl($iPic_ColorGradient, $hHBmp_L) If $bImgLoaded Then $hB_H = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hHBmp_HL) _hBmpToPicControl($iPic_Histogram, $hB_H, 1) EndIf $s = "L" EndIf Case $iRadio_C, $iDummyC If $s <> "C" Then _hBmpToPicControl($iPic_ColorGradient, $hHBmp_C) If $bImgLoaded Then $hB_H = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hHBmp_HC) _hBmpToPicControl($iPic_Histogram, $hB_H, 1) EndIf $s = "C" EndIf Case $iRadio_R, $iDummyR If $s <> "R" Then _hBmpToPicControl($iPic_ColorGradient, $hHBmp_R) If $bImgLoaded Then $hB_H = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hHBmp_HR) _hBmpToPicControl($iPic_Histogram, $hB_H, 1) EndIf $s = "R" EndIf Case $iRadio_G, $iDummyG If $s <> "G" Then _hBmpToPicControl($iPic_ColorGradient, $hHBmp_G) If $bImgLoaded Then $hB_H = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hHBmp_HG) _hBmpToPicControl($iPic_Histogram, $hB_H, 1) EndIf $s = "G" EndIf Case $iRadio_B, $iDummyB If $s <> "B" Then _hBmpToPicControl($iPic_ColorGradient, $hHBmp_B) If $bImgLoaded Then $hB_H = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hHBmp_HB) _hBmpToPicControl($iPic_Histogram, $hB_H, 1) EndIf $s = "B" EndIf Case $iButton_Load $sFile = FileOpenDialog("Select an image", "", "Images (*.jpg;*.png;*.bmp;*.gif)", 3) If @error Then ContinueCase If $bImgLoaded Then _GDIPlus_ImageDispose($hImage) $hImage = _GDIPlus_ImageLoadFromFile($sFile) If @error Then MsgBox(0x40010, "Error", "Unable to load image", 30) ContinueCase EndIf GUICtrlSetState($iButton_Save, $GUI_ENABLE) $aRes = _GDIPlus_ImageGetFlags($hImage) If BitAND($aRes[0], $GDIP_IMAGEFLAGS_HASALPHA) Then $bIsAlpha = True Else $bIsAlpha = False EndIf If BitAND($aRes[0], $GDIP_IMAGEFLAGS_COLORSPACE_GRAY) Then $bIsGray = True Else $bIsGray = False EndIf $hHBmp_Preview = _GetImage($sFile, $ihGui_PreviewSize, $iBGColor) _hBmpToPicControl($iPic_Preview, $hHBmp_Preview, 1) If Not $bIsAlpha Then $pStructChannel3 = 0 $iHistogramFormat = $HistogramFormatRGB Else $pStructChannel3 = DllStructGetPtr($tStructChannel3) $iHistogramFormat = $HistogramFormatARGB EndIf _GDIPlus_BitmapGetHistogram($hImage, $iHistogramFormat, _GDIPlus_BitmapGetHistogramSize($iHistogramFormat), $pStructChannel0, $pStructChannel1, $pStructChannel2, $pStructChannel3) _GDIPlus_CreateHistogram() $bImgLoaded = True If BitAND(GUICtrlRead($iRadio_L), $GUI_CHECKED) Then $s = "" GUICtrlSendToDummy($iDummyL) ElseIf BitAND(GUICtrlRead($iRadio_C), $GUI_CHECKED) Then $s = "" GUICtrlSendToDummy($iDummyC) ElseIf BitAND(GUICtrlRead($iRadio_R), $GUI_CHECKED) Then $s = "" GUICtrlSendToDummy($iDummyR) ElseIf BitAND(GUICtrlRead($iRadio_G), $GUI_CHECKED) Then $s = "" GUICtrlSendToDummy($iDummyG) Else $s = "" GUICtrlSendToDummy($iDummyB) EndIf Case $iButton_Save If $sFile = "" Then ContinueLoop $sType = "png" $o += _GDIPlus_ImageSaveToFile($hHBmp_HL, StringRegExpReplace($sFile, "(.*)\..*", "$1") & "_Luminosity." & $sType) $o += _GDIPlus_ImageSaveToFile($hHBmp_HC, StringRegExpReplace($sFile, "(.*)\..*", "$1") & "_cRGB." & $sType) $o += _GDIPlus_ImageSaveToFile($hHBmp_HR, StringRegExpReplace($sFile, "(.*)\..*", "$1") & "_Red." & $sType) $o += _GDIPlus_ImageSaveToFile($hHBmp_HG, StringRegExpReplace($sFile, "(.*)\..*", "$1") & "_Green." & $sType) $o += _GDIPlus_ImageSaveToFile($hHBmp_HB, StringRegExpReplace($sFile, "(.*)\..*", "$1") & "_Blue." & $sType) If $o = 5 Then MsgBox(64 + 262144, "Information", "Images properly saved to " & StringRegExpReplace($sFile, "(.*)\\.*", "$1"), 30, $hGUI) Else MsgBox(16 + 262144, "Error", "One or more images could not saved to " & StringRegExpReplace($sFile, "(.*)\\.*", "$1") & ".", 30, $hGUI) EndIf EndSwitch If WinActive($hGUI) Then $aMouseInfo = GUIGetCursorInfo($hGUI) Switch $aMouseInfo[4] Case $iPic_Histogram If $bImgLoaded Then $aPos_hWnd = WinGetPos($hGUI) $imp = Max(1, Min(256, -19 + $aMouseInfo[0])) Switch $s Case "L" $iVal = $aLuminosity[$imp] Case "C" $iVal = $aCRGB[$imp] Case "R" $iVal = DllStructGetData($tStructChannel0, "channel0", $imp) Case "G" $iVal = DllStructGetData($tStructChannel1, "channel1", $imp) Case "B" $iVal = DllStructGetData($tStructChannel2, "channel2", $imp) EndSwitch If $iMpos_oldx <> $aMouseInfo[0] Or $iMpos_oldy <> $aMouseInfo[1] Then ToolTip("Index: " & $imp & ", Value: " & Round($iVal, 0) & ", Average: " & Round($fAverage_L, 2), $aPos_hWnd[0] + $aMouseInfo[0] - 60, $aMouseInfo[1] + $aPos_hWnd[1] - 20) $iMpos_oldx = $aMouseInfo[0] $iMpos_oldy = $aMouseInfo[1] EndIf ShowPreview($iPic_Histogram) $bShow = True $bHide = False EndIf Case Else If Not $bHide Then GUISetState(@SW_HIDE, $hGui_Preview) $bHide = True ToolTip("") EndIf $bShow = False EndSwitch EndIf WEnd Func AnimateLabel() Local Static $v = Int((UBound($aLabelCredit_AnimPos) - ($fLimes * $fStep * 100)) / 2) Local $u For $u = 0 To UBound($aLabelCredit_Pos) - 1 GUICtrlSetPos($aLabelCredit_Pos[$u][3], $aLabelCredit_Pos[$u][1], $aLabelCredit_AnimPos[$v - $u]) Next If $v - $u < 0 Then $v = UBound($aLabelCredit_AnimPos) - 1 $v -= 1 EndFunc ;==>AnimateLabel Func Min($a, $b) If $a < $b Then Return $a Return $b EndFunc ;==>Min Func Max($a, $b) If $a > $b Then Return $a Return $b EndFunc ;==>Max Func ShowPreview($iCtrl) $aPosWin = WinGetPos($hGUI) $aPosCtrl = ControlGetPos($hGUI, "", $iCtrl) Local $iNewX, $iNewX1 = $aPosWin[0] - $ihGui_PreviewSize + 10, $iNewX2 = $aPosWin[0] + $aPosWin[2] - 10 $iNewX = $iNewX1 If $iNewX1 < $aFullScreen[0] Then $iNewX = $iNewX2 EndIf WinMove($hGui_Preview, "", $iNewX, $aPosWin[1] + 50) GUISetState(@SW_SHOWNOACTIVATE, $hGui_Preview) EndFunc ;==>ShowPreview Func _GetImage($sFile, $iWH, $iBkClr = 0xFFFFFF, $bCheckerboard_Bg = True) Local $hBmp1, $hBitmap, $hGraphic, $hImage, $iW, $iH, $aGS, $hBmp2, $aFTS $aFTS = FileGetTime($sFile) If @error Then Return SetError(1, 0, 0) $hBmp1 = _WinAPI_CreateBitmap($iWH, $iWH, 1, 32) $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hBmp1) $hGraphic = _GDIPlus_ImageGetGraphicsContext($hBitmap) _WinAPI_DeleteObject($hBmp1) $hImage = _GDIPlus_ImageLoadFromFile($sFile) $iW = _GDIPlus_ImageGetWidth($hImage) $iH = _GDIPlus_ImageGetHeight($hImage) GUICtrlSetData($idLabel_Info, StringRegExpReplace($sFile, ".*\\(.*)", "$1") & @LF & Round(FileGetSize($sFile) / 1024, 0) & " kb (" & $iW & " x " & $iH & ")" & @LF & $aFTS[0] & "/" & $aFTS[1] & "/" & $aFTS[2] & " " & $aFTS[3] & ":" & $aFTS[4] & ":" & $aFTS[5] & @LF & "Alpha: " & $bIsAlpha & ", Gray: " & $bIsGray) $aGS = _GetScale($iW, $iH, $iWH) Switch $bCheckerboard_Bg Case True ;~ _GDIPlus_GraphicsFillRect($hGraphic, 0, 0, $iWH, $iWH, $hTexture_Checkerboard) _GDIPlus_GraphicsClear($hGraphic, BitOR(0xFF000000, $iBkClr)) _GDIPlus_GraphicsFillRect($hGraphic, $aGS[0], $aGS[1], $aGS[2], $aGS[3], $hTexture_Checkerboard) Case False _GDIPlus_GraphicsClear($hGraphic, BitOR(0xFF000000, $iBkClr)) EndSwitch _GDIPlus_GraphicsDrawImageRect($hGraphic, $hImage, $aGS[0], $aGS[1], $aGS[2], $aGS[3]) _GDIPlus_ImageDispose($hImage) _GDIPlus_GraphicsDispose($hGraphic) $hBmp2 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap) _GDIPlus_BitmapDispose($hBitmap) Return $hBmp2 EndFunc ;==>_GetImage Func _GetScale($iW, $iH, $iWH) Local $aRet[4] If $iW <= $iWH And $iH <= $iWH Then $aRet[2] = $iW $aRet[3] = $iH $aRet[0] = ($iWH - $aRet[2]) / 2 $aRet[1] = ($iWH - $aRet[3]) / 2 ElseIf $iW > $iH Then $aRet[2] = $iWH $aRet[3] = $iH / ($iW / $iWH) $aRet[0] = 0 $aRet[1] = ($iWH - $aRet[3]) / 2 ElseIf $iW < $iH Then $aRet[2] = $iW / ($iH / $iWH) $aRet[3] = $iWH $aRet[0] = ($iWH - $aRet[2]) / 2 $aRet[1] = 0 ElseIf $iW = $iH Then $aRet[2] = $iWH $aRet[3] = $iWH $aRet[0] = 0 $aRet[1] = 0 EndIf Return $aRet EndFunc ;==>_GetScale Func _hBmpToPicControl($iCID, ByRef $hBmp, $iFlag = 0) Local $hOldBmp $hOldBmp = GUICtrlSendMsg($iCID, $STM_SETIMAGE, $IMAGE_BITMAP, $hBmp) If $hOldBmp Then _WinAPI_DeleteObject($hOldBmp) If $iFlag Then _WinAPI_DeleteObject($hBmp) EndFunc ;==>_hBmpToPicControl Func _GDIPlus_CreateHistogram($sRounding = "Ceiling") Local $iMaxL, $iMaxC, $iMaxR, $iMaxG, $iMaxB, $a, $r, $g, $b, $yR, $yG, $yB, $iRedAv, $iGreenAv, $iBlueAv For $i = 1 + $bIsAlpha To 256 If $bIsAlpha Then ;~ ConsoleWrite("Alpha: " & DllStructGetData($tStructChannel0, "channel0", $i) & @CRLF) $r = DllStructGetData($tStructChannel1, "channel1", $i) $yR = $r * $frY If DllStructGetData($tStructChannel1 , "channel1", $i) > $iMaxR Then $iMaxR = $r $g = DllStructGetData($tStructChannel2, "channel2", $i) $yG = $g * $fgY If DllStructGetData($tStructChannel2 , "channel2", $i) > $iMaxG Then $iMaxG = $g $b = DllStructGetData($tStructChannel3, "channel3", $i) $yB = $b * $fbY If DllStructGetData($tStructChannel3 , "channel3", $i) > $iMaxB Then $iMaxB = $b $fAverage_cRGB += $r + $g + $b $fAverage_L += $yR + $yG + $yB Else $r = DllStructGetData($tStructChannel0, "channel0", $i) $yR = $r * $frY If DllStructGetData($tStructChannel0 , "channel0", $i) > $iMaxR Then $iMaxR = $r $g = DllStructGetData($tStructChannel1, "channel1", $i) $yG = $g * $fgY If DllStructGetData($tStructChannel1 , "channel1", $i) > $iMaxG Then $iMaxG = $g $b = DllStructGetData($tStructChannel2, "channel2", $i) $yB = $b * $fbY If DllStructGetData($tStructChannel2 , "channel2", $i) > $iMaxB Then $iMaxB = $b EndIf $fAverage_cRGB += $r + $g + $b $fAverage_L += $yR + $yG + $yB $aLuminosity[$i] = $yR + $yG + $yB If $aLuminosity[$i] > $iMaxL Then $iMaxL = $aLuminosity[$i] $aCRGB[$i] = ($r + $g + $b) / 3 If $aCRGB[$i] > $iMaxC Then $iMaxC = $aCRGB[$i] Next $fAverage_cRGB /= 256 * 3 $fAverage_L /= 256 _GDIPlus_GraphicsClear($hCtxt_HL, 0xFFFFFFFF) _GDIPlus_GraphicsClear($hCtxt_HC, 0xFFFFFFFF) _GDIPlus_GraphicsClear($hCtxt_HR, 0xFFFFFFFF) _GDIPlus_GraphicsClear($hCtxt_HG, 0xFFFFFFFF) _GDIPlus_GraphicsClear($hCtxt_HB, 0xFFFFFFFF) Local $iDL = 1, $iDC = 1, $iDR = 1, $iDG = 1, $iDB = 1 Local $sRoundings = "Round,Ceiling,Floor," If Not StringInStr($sRoundings, $sRounding) Then $sRounding = "Ceiling" If $iMaxL > 128 Then ;~ $iDL = Ceiling($iMaxL / 128) $iDL = Execute($sRounding & "(" & $iMaxL / 128 & ")") Else $iDL = 1 / (128 / $iMaxL) EndIf If $iMaxC > 128 Then ;~ $iDC = Ceiling($iMaxC / 128) $iDC = Execute($sRounding & "(" & $iMaxC / 128 & ")") Else $iDC = 1 / (128 / $iMaxC) EndIf If $iMaxR > 128 Then ;~ $iDR = Ceiling($iMaxR / 128) $iDR = Execute($sRounding & "(" & $iMaxR / 128 & ")") Else $iDR = 1 / (128 / $iMaxR) EndIf If $iMaxG > 128 Then ;~ $iDG = Ceiling($iMaxG / 128) $iDG = Execute($sRounding & "(" & $iMaxG / 128 & ")") Else $iDG = 1 / (128 / $iMaxG) EndIf If $iMaxB > 128 Then ;~ $iDB = Ceiling($iMaxB / 128) $iDB = Execute($sRounding & "(" & $iMaxB / 128 & ")") Else $iDB = 1 / (128 / $iMaxB) EndIf For $i = 1 To 256 _GDIPlus_PenSetColor($hPen_H, 0xFF000000) _GDIPlus_GraphicsDrawLine($hCtxt_HL, $i - 1, 127, $i - 1, 127 - (Int($aLuminosity[$i] / $iDL)), $hPen_H) _GDIPlus_PenSetColor($hPen_H, 0xFF000000) _GDIPlus_GraphicsDrawLine($hCtxt_HC, $i - 1, 127, $i - 1, 127 - (Int($aCRGB[$i] / $iDC)), $hPen_H) _GDIPlus_PenSetColor($hPen_H, 0xFFB00000) If $bIsAlpha Then _GDIPlus_GraphicsDrawLine($hCtxt_HR, $i - 1, 127, $i - 1, 127 - (Int(DllStructGetData($tStructChannel1, "channel1", $i) / $iDR)), $hPen_H) _GDIPlus_PenSetColor($hPen_H, 0xFF00B000) _GDIPlus_GraphicsDrawLine($hCtxt_HG, $i - 1, 127, $i - 1, 127 - (Int(DllStructGetData($tStructChannel2, "channel2", $i) / $iDG)), $hPen_H) _GDIPlus_PenSetColor($hPen_H, 0xFF0000B0) _GDIPlus_GraphicsDrawLine($hCtxt_HB, $i - 1, 127, $i - 1, 127 - (Int(DllStructGetData($tStructChannel3, "channel3", $i) / $iDB)), $hPen_H) Else _GDIPlus_GraphicsDrawLine($hCtxt_HR, $i - 1, 127, $i - 1, 127 - (Int(DllStructGetData($tStructChannel0, "channel0", $i) / $iDR)), $hPen_H) _GDIPlus_PenSetColor($hPen_H, 0xFF00B000) _GDIPlus_GraphicsDrawLine($hCtxt_HG, $i - 1, 127, $i - 1, 127 - (Int(DllStructGetData($tStructChannel1, "channel1", $i) / $iDG)), $hPen_H) _GDIPlus_PenSetColor($hPen_H, 0xFF0000B0) _GDIPlus_GraphicsDrawLine($hCtxt_HB, $i - 1, 127, $i - 1, 127 - (Int(DllStructGetData($tStructChannel2, "channel2", $i) / $iDB)), $hPen_H) EndIf Next EndFunc ;==>_GDIPlus_CreateHistogram Func _GDIPlus_CreateColorGradient($sColorChannel, $iW, $iH, $bHBitmap = True) Local $hBitmap = _GDIPlus_BitmapCreateFromScan0($iW, $iH) Local $hCtxt = _GDIPlus_ImageGetGraphicsContext($hBitmap) ;~ _GDIPlus_GraphicsSetSmoothingMode($hCtxt, 2) Local $hPen = _GDIPlus_PenCreate() _GDIPlus_PenSetLineJoin($hPen, $iLineJoinBevel) Local $i, $c For $i = 0 To $iW $c = Hex($i, 2) Switch $sColorChannel Case "L" _GDIPlus_PenSetColor($hPen, "0xFF" & $c & $c & $c) Case "C" _GDIPlus_PenSetColor($hPen, "0xFF" & $c & $c & $c) Case "R" _GDIPlus_PenSetColor($hPen, "0xFF" & $c & "0000") Case "G" _GDIPlus_PenSetColor($hPen, "0xFF00" & $c & "00") Case "B" _GDIPlus_PenSetColor($hPen, "0xFF0000" & $c) EndSwitch _GDIPlus_GraphicsDrawLine($hCtxt, $i, 0, $i, $iH, $hPen) Next _GDIPlus_GraphicsDispose($hCtxt) _GDIPlus_PenDispose($hPen) If $bHBitmap Then Local $hHBmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap) _GDIPlus_BitmapDispose($hBitmap) Return $hHBmp EndIf Return $hBitmap EndFunc ;==>_GDIPlus_CreateColorGradient Func _GDIPlus_CreateCheckerboardTexture($iSquareSize = 80, $iCol1 = 0xFFECECEC, $iCol2 = 0xFFDFDFDF) Local $hPatternBitmap = _GDIPlus_BitmapCreateFromScan0(2 * $iSquareSize, 2 * $iSquareSize) Local $hCtxt = _GDIPlus_ImageGetGraphicsContext($hPatternBitmap) Local $hBrush0 = _GDIPlus_BrushCreateSolid($iCol1) Local $hBrush1 = _GDIPlus_BrushCreateSolid($iCol2) _GDIPlus_GraphicsFillRect($hCtxt, 0, 0, $iSquareSize, $iSquareSize, $hBrush0) _GDIPlus_GraphicsFillRect($hCtxt, $iSquareSize, 0, $iSquareSize, $iSquareSize, $hBrush1) _GDIPlus_GraphicsFillRect($hCtxt, 0, $iSquareSize, $iSquareSize, $iSquareSize, $hBrush1) _GDIPlus_GraphicsFillRect($hCtxt, $iSquareSize, $iSquareSize, $iSquareSize, $iSquareSize, $hBrush0) Local $hTexture = _GDIPlus_TextureCreate($hPatternBitmap) _GDIPlus_GraphicsDispose($hCtxt) _GDIPlus_BitmapDispose($hPatternBitmap) _GDIPlus_BitmapDispose($hBrush0) _GDIPlus_BitmapDispose($hBrush1) Return $hTexture EndFunc ;==>_CreatePatternTexture  
      GdipBitmapGetHistogram(), GdipBitmapGetHistogramSize() and 2 more GDI+ functions requires GDI+ v1.1 which means this will only run on Vista or higher operating systems.
      I hope the values are correct especially the value for luminosity.
      Br,
      UEZ
×
×
  • Create New...