Jump to content
Sign in to follow this  
SmOke_N

GDIPlus Snippets

Recommended Posts

SmOke_N

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 &= '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 &= '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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 &= '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
  • Like 1

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.

Share this post


Link to post
Share on other sites
SmOke_N

-Reserved-


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.

Share this post


Link to post
Share on other sites
SmOke_N

-Reserved-


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.

Share this post


Link to post
Share on other sites
SmOke_N

-Reserved-


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.

Share this post


Link to post
Share on other sites
jaberwacky

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 &= '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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 &= '5Lf/4tw7i2WWWxVyQnbX2O5M/zsHXa/+cbamJQmA6tlqFct2uttYoSSY5bnkIxWs0mMu7PfJ535y+HDvY+ZgZjv+NUJi7NeLmZkZezwazXbZJsE0Oe3g5o5OKmijhtJmmfd17477nBswGFXDUk/PLsXr3TKsr49/+ILr/O0rzr33vnN/cqv76sir7pYffN8FCFrHoMfFvg///U+CV8Bi/6x9eXu3CQD1XuPbWf0ZGetnZJE7FvVzVJWalZWV3q9H7L6P+6peIWOJdB02jyzD4zHs6zXHrQm0oeKlw4f1+A6sECZHQCnYEtAGT5vXA5VpJIUuWoNmD3p6y3DGf3zW2tRlNVErpN1y6AfuK+cCQlpYwNH8s7IpLCroKRzq9gftMlWI04kCGvq3vLw8cuhtXQAgpM27+d4SGQWhwM1QWl4TulbMWo82PsNOkMm4DjhHGqQ78RVTdduGnXKj8Jx0lFRF0/BaAlpQ9Sw9OkJ/CUdfOap3RIPWRemisu/IzQdf/PJjd9uJn7iv/my3BbF3Fl3v8y/t1+cq2r1pYWk0e8djj4P3tIPhw2Ut5Lo14kmfNwOAkKb1Yeuq+lvlRR8VrIraRamWnF631v+zluHDsRsslQkGVdEIaFY9C/rHtrhjcXAZ0wa96jI0qHVX/sH1qmVqa35wuhfO5LbH7nfusUsuXPVbnhXyqqAnfAPanwAYaaTXF1WqymgB6jVLHQxVeDzdlvDHoREtTltnluVs69pW0aI6VM+0myKnLbOqqCmEjXrCqy2aGvKnCpnWmrlvT9nas1f/zgWoXYDSmryy24+6/gYdHQIAqlTZR39LtKwZa1pusq42YBN25us1Xa/tFs7Sr69qaY8qBmlHpzIJAc2qZwpWeU8I1l+EBbX0OyA96fWXaU/OZI3ZP15y7pGHnWjtmUZulHjAugJNqUFJ6/P0OBVF199GAKCpAqq2KRzoZ7BGeSSz0PQ5qfGaMd3PiVhnlgzuHdZuVjs7CWa+aqJCLi1OT/Usp6Cmy+Az0mw0R2rHZ//as18/9mhnu3NxFedxBrMdSt7HSW1ITasOe8dkvX09yScznAGATe/PvHHLKmcZRj7ZiKQGtCTLbmfGbjAF4qQAFDsvq6LVZS1ad4LXnmXd8WlBbciOz/6glqw9UzirYLqxKoCZThawoYZZ11jY165e9DiFnGzQlnYmACio1elsYu2mX1ehZALHZqiIEVCY8Kxpf2exFmvRus2qnvmDmtKxJjUHjOYoXEjIcgEIXADgaRfauKE4+egChQclC4UqRGhtXKoCtGY4rsYkaTi8XvcmZFeo7re9fg+uWnpOFJqsKlrnwgcXKisfKwTV8S9af8nabNBKAADruAyvzvhbkzaA1nv80ig2r83mpBXOWoR1Gpsx9DHWCQx53tebpwt0WldBUzLVOquqK1MKYQOCmhI4YyEAgApaaJdB4cs+2udCg5NafGUst6nx2Ax/O3PSq2iRK58WkNcjlVtQ08J2pXDtrGl3Ww8AoAX3Fe129F/32XPnXMF0u3WoYnrHZoSHM/+OztYENPW9q6me+Xd8Kqhp00KrAQCsveVfl6WQUESgUeFA1z3w9hRQTDG3WzHdh0HtTBubUTBlFWWW1gQ0JX9VzyYNAADW8kqFiWT+pi6hLUwFvpHHPCmg6PYUVvKsmun6Sm7r+St5FhxVSCmry6WsoszSgk0Cdrj24CcdAAAIOg1A4aXv2MOhJxnozxR+VCms+a59tTorq+jpsbSdu+UHtCbt3AQAAJj4HZ1R2eeXhQAAAGhDdonKrJ5NUmsTAABA2aWKExciVysAAACIyhpM6+3fAmChc00BYPdu2VW0qKTBtAx/BTByp5SOy9HU8AAA0JjBtVEJozVGVs8A4I2/esPJr3625OoKAMOLyxxcG5UwmHbiq2cAAIAqWpmDayNGawAAANQr00SVjtawIXBDFwgDYEjkhls3uG1bt7m1tGZt75N73RMPPK6Lfq1L/6910dcla93W'
    $Speedometer &= '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'
    $Speedometer &= 'fuNqfxYAAADAk0sydf6SzQFxEWvQ1Dst41BRXVJJdVDpUGvTaggAABDI1i4Jiy1LBaxB868/q77Xe2bpTI02DgAAAAKZ//ZEmSqHgGbrz5oCAABAI76y2L1l1t27476Q6RK2Di1TixMAAAC+cV+xyx0BDQAAQC1KLZuqJJAFtziTs6OadhQTAABg2r+WcT24c2cBOce/Di0ooGlOmS1+KwMAAADncka+8zc94QwAAAA5n20euVoBAABAlOeAWgAAAIRnq8i3/szlAgAAAMpWyljOIypn/RkAAACUrZSx6rwGDQAAAPUPaAAAAKxDi8rbIAAAAIB77r7b+USlbRAAAACAThLwbhSI6rVBAAAAgI0CkRsOAAAAbBIAAABAVOkGAQAAAHZy+gPa53/4fazdBcUBAADgRAFlLjdE163xyaefups7OGM3xN4n97pNmzYp/fW+dtI2FHz04UcdfTz6ytFYH/W9XLt2zZ06dcrJnj17nCR/ljj68tFv/l99z9luzyy+sxjb7aVNTU256elpe7y/t7fjxG53wgEAwEaB14+9rh2dbpDOhQ8uuLXhQUFklA23bhgYKjZv3twLNA/u3KkbrF1wU1DaNbsrdjl46+TJsb7H+Rfn3cLCgsvLkSNH3MG5g26iAQAAZQQrwngqaKok+ULOwOralStXehe5GUji6oObPQC67af27cvrdnVd+hCfWToz8PtRKj506JDLWXKdzQlpAADAH9AUpEbxDVbLGtxmZmY0UbfQ4KZWrAJVEYb0j9cdzghpAACwUSDyf3F6iG0YC25ag6WwofCk1qNap9u2blPFq1eBev/d95KKXYBCw5Luu+7vsDVnhYa0egMAAMoyyjRav6+Mo6yj3/t011THvDs41QItkFXcjL/ilr0lm2wG0PUpdCqY6noHHsGgz589d65/LZnuj+5nsnkgXWUMYtdffwAAQHlDr//KFFc//Fd3+vKSG+b8+fPqgvU2Wtrxmp4W58OPPuJGUdWrdBbc+m8/ThbrD7vPtlNzsMW3F90Q8Wr4Sz0uWsg3ziaK48ePu1EOHDigUOf9i1b79KXDhy2opb+moo0YAAAQxhS0VlZWktfp2I1J/0+yk3P1evwVNKW+STxwNPWg+NfUqUI1tC2pYJSMHEmqdf2jNkLYpoLRkq/Rbc89PxeXWU0DAABWLFEXTR3EVBgLKDr1ZS9V0tIBLXwHZ/VzRDItwLMHZ+0IjHhEezFe0xq16pvngfffX7/ywhkAALQol5eXLYgVwt8F62bewdkcCmfZApG1ebXAT/3jSgOo2q1qxbYCAEALzb1LjayI4F+83j+kXsHEXhdtSU5S6NCfJwPqMxQcgjbQ6TbqWRULp0yl13B/QPOzBW2pRXDV2L1l1lXCdlFWOu5CT6xWAAB2AvrHRVkRwRfwQgsZcTI4fYzXQHWrFOz0uhm7AAqe4g2f/uHxsaueAu/ITl+3f92VvmiMNGuJz1MaLNq9O+5zUmFI0xOm+IAGAKBqFh7ydD2lFirUbVLIC2bBU2MqrEqYkYbW6/7UgYpcyaQIZTCtOR8Q0GxBvEfm4KYnhK67iOCmQFmF6ne1Wku60QCAo4D0OhOwvqnQ022SgDG0jajbrNNrr20srJ46kP2jvdaeyRml7njONJ5CyVq7Hy9euuiuf3m9t5NR4zFUHlUKth2V2U+Cz+Fsy9RF92nN77POMMu1V97oFicAoOjqk8JZ9tcu+3zGge32+QKpkqYiUOiatiqXaY28T92+XqiCVFzyzkvdZipxq+LWN1ukkAdaTzgFxgHsPtnv7aB1/zsVu8+er6WCBgAYsk5q5Lgmd5Nel4JeH20QvFqGSdcrNXpLf66qVZZF+K54uq+1HgTvGbQ/ctRGN6AaU2Jws/VtyY6L6enpGo768Mv6pNX33Z4KGgAw6sEWsac7PnptzLFFZ9fpH1Y/qlCRvXpm4cVez+21zRMGg+a36vYKCmj2/SS7XYfkg9iNoVv7aoytbwtpg8ZD'
    $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 &= 'X6UP8dIEMzcGEEELhaL6MLQIyC+lsXqL/smC1GqvMe3oP+VipnTpwAiXOz63AgDwOLdIAb5SUgPXjti0irTtT3y9cnPSVM/pQ2QNoZjYS6h1DNpA9wi0NlKd+sI23V3yp19c12uc8zVNvXgo3K73NColCQBw4sSJUeuEHquC73DgTXRCrqp/DetVP/Q51cGp1GIqtaru1NRaqcPpJ55+2h2FEYcC3f/5nXeIlGWkgZ3aRKA1M0xdaUR1cLRnaeEuxwzaMeb0+2lpwkR7ghAAVC8VRFP2OnTnL//S+poUS1qbQvNAsMqQuFunduvf7747RW3t4efuU3Nunc5MRyXBLgNObSLQWhumXj/0mx5rJDW/5HC0FjiddsMipFNgzffjk+VSAUCkDU7ROV3oa18iKdXQJHG2vpWPn1NlIPJak2+any/9nBKgq/jyp77UmRKlIBBcBt76kQ2pEWhtDVNXfZXrC2pgr50+VWNRn3Q9RjDwy3mN6XqM/FTvz994o1s4AGDT2FRnZz/Wl8w/E1+jJboevfe/Trz36D8x8dWXylIce+qDXXnoFG5yGDoCzamux6eYXkWdTnXWrjfzienXf/uNL/oFOX2XFpQ65SgVrKicpgkEVJvhlIJD+U6NLNmCAwBTURmM+1quunnPmoFQynXDcEp5bjzOyW4CCDRSna43a9TZPh0q199qvNeZR67o7+0I3HDRpL+bblsxtBoAPP1FlOgir+VLxog5uxTYuX/W1Kb2kVWzdvFBazDVqROT6xjK+JtJYERD7c2IM0ehipxIdVFI4Kn2ThdsTKgWZhkXJQD1QRJKJUSSD+KRdbqQINS6U6X5rdXImdb9cNBWoEL/NtdrWUpqE4HmVGcxA1sJEQmSxHy2reOVvb1oYXBplA7dVACYJOAuTAkj3bTO6iZxVsu8VoIsPK8Eoed/Jg+kEjGK5G1MY9RrL77aH3p/PqRXRnt8IrVJirPhVKdy08r/V683A4vWMi7fHpS8bADAQkyYp459XAX2qld1pGyCddbzgG2RoVpX3YvgVxayMrm1rjdv3uzMohujtNfFynu031Z1LJDo1WuQT93CQKDponr8ZVFXp6JeuRu5v5ALFAnPnD5ddkSIh9T2q4bZdu527TJZ1iw6ALo2V4oku717vSgwXirXw7EfmrnR/MdVUbQNQnVnsfo+re+qTS7aFHFo1mYQ0BvLzv6t/W5Tkbuzol4SCTn+ZkRwSnaOenH2fy++UxMAnHk40mNRkasQtdKaeihdNs4KyIfBiibb3ivW9JlMNEzV9dbM/TsXbh6QCbEF/lJBoDlPrQtAF2XGwpJRbwYAgEDLjZwHnIK0837iObNTohKRnlwSPzhKOETY4A5SC9Mq+6R99ELWRpDiXPysTqc6MxYVn76q1ZsBAIDTaelshsRUsVF5IY3JQd0iVX+H2FB5CTdH+yaz1Kg4a5Muzirtyjp9qYhRan/APK+YONMi0KDhIAAAA7IrkT9eKt/mo0mRppSmAhiRDl7Vq01qqaE9HYG2YdYbyosPsd546fLLO7FQbXv1ZhaUOlm0AwCAo1mVUUdmtfReLMtSCImTluc6K4Ch1xiLfmqfyi5V0h7uFDMCbZNQO649aRKngXBK0RdCp6L2wtjuLtXoJA0SVgq3MQCAQelaQ7VxS7wcvk1m53NYKNSPoPm5w/v168p/fzZBb/7ztpFvZMSfRC2WGjQJRDm4fSDrjSG1Ax4X1SK2/qjcWQoAQMd56RmXDc26nNEBwb9HQROnNhFoWG80jD1o6DAFAID2AwlxqxAsNUhxGn3QqkfTF2exX/i4OHPnDOlOAACifQ2Y2mraTqx5QG4JSTcF7dUWZwi0rapH0xegPvlD2hO4Y3WrAABgML0O6drbGhoPpYhZzL7EgZJIlkj/f5vqzhBodqaW9Ya+AJU6IOu7VOvxmy7SAADAokaRqSB+9N+NoHRmtGlCAQcFHp7cq5QBUpZIe7T2agTaVmHrDeW29YVuU8j4'
    $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

Share this post


Link to post
Share on other sites
SmOke_N

@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.

Share this post


Link to post
Share on other sites
UEZ

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!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites
iamtheky

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.


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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

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

Create an account

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

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Similar Content

    • timmy2
      By timmy2
      The following script, thanks largely to @UEZ, displays the attached PNG image on the Windows Desktop.

      It perfectly renders the sticky note's shadow over whatever's in the background.
      But here's the catch: I would like to add a line of text, fetched from a variable and using a font of my choice, atop the sticky note. It needs to be part of the same GUI because the sticky note can be dragged and placed anywhere on the screen.
      Will someone here show me how to add just the additional code needed to accomplish my goal? I have tried sporadically for two years to merge in code from scripts that use GDI+ calls to display text over alpha channels but the challenge has proven beyond me.
      #include <ButtonConstants.au3> #include <MsgBoxConstants.au3> #include <StructureConstants.au3> #include <WinAPIConstants.au3> #include <GDIPlus.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <WinAPISysWin.au3> _GDIPlus_Startup() Global Const $SC_DRAGMOVE = 0xF012 Global $iW, $iH, $hImage, $hBitmap, $hGUI $hImage = _GDIPlus_BitmapCreateFromFile("Using-Note.png") $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage) $iW = _GDIPlus_ImageGetWidth($hImage) $iH = _GDIPlus_ImageGetHeight($hImage) $hGUI = GUICreate("", $iW, $iH, -1, -1, $WS_POPUP, BitOR($WS_EX_LAYERED,$WS_EX_TOPMOST)) GUISetState() _WinAPI_BitmapDisplayTransparentInGUI($hBitmap, $hGUI) GUIRegisterMsg($WM_LBUTTONDOWN, "_WM_LBUTTONDOWN") Do Until GUIGetMsg() = $GUI_EVENT_CLOSE _WinAPI_DeleteObject($hBitmap) _GDIPlus_BitmapDispose($hImage) _GDIPlus_Shutdown() GUIDelete() Func _WinAPI_BitmapDisplayTransparentInGUI(ByRef $hHBitmap, ByRef $hGUI, $iOpacity = 0xFF, $bReleaseGDI = True) If Not BitAND(GUIGetStyle($hGUI)[1], $WS_EX_LAYERED) = $WS_EX_LAYERED Then Return SetError(1, 0, 0) Local $tDim = DllStructCreate($tagBITMAP) If Not _WinAPI_GetObject($hHBitmap, DllStructGetSize($tDim), DllStructGetPtr($tDim)) Then Return SetError(2, 0, 0) Local $tSize = DllStructCreate($tagSIZE), $tSource = DllStructCreate($tagPOINT), $tBlend = DllStructCreate($tagBLENDFUNCTION) Local Const $hScrDC = _WinAPI_GetDC(0), $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC), $hOld = _WinAPI_SelectObject($hMemDC, $hHBitmap) $tSize.X = $tDim.bmWidth $tSize.Y = $tDim.bmHeight $tBlend.Alpha = $iOpacity $tBlend.Format = 1 _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, DllStructGetPtr($tSize), $hMemDC, DllStructGetPtr($tSource), 0, DllStructGetPtr($tBlend), $ULW_ALPHA) _WinAPI_ReleaseDC(0, $hScrDC) _WinAPI_SelectObject($hMemDC, $hOld) _WinAPI_DeleteDC($hMemDC) If $bReleaseGDI Then _WinAPI_DeleteObject($hHBitmap) Return True EndFunc Func _WM_LBUTTONDOWN($hWnd, $iMsg, $wParam, $lParam) _SendMessage($hGUI, $WM_SYSCOMMAND, $SC_DRAGMOVE, 0) EndFunc ;==>_WM_LBUTTONDOWN  
    • odaylton
      By odaylton
      Hello everyone ,
      Text translated from Portuguese by google - please apologize for any errors

      Once again I need a light from the gurus of this wonderful website
      I am fanatic by combobox for its usability but I am not able to uncertain images within lists ...
      I know uncertain icons, and cursors but I am not able to insert gif or jpg images.
      1) How to solve this ...
      2) will the path is to convert gif into bmp and then uncertain ... how to do that?
      #include <GUIConstantsEx.au3> #include <GuiImageList.au3> #include <GuiListView.au3> #include <WinAPI.au3> #include <WindowsConstants.au3> ;dados de mouse #include <WinAPIRes.au3> ;COMBO #include <GuiComboBoxEx.au3> ;Fonts #include <FontConstants.au3> ;obter imagem de arquivo #include <GDIPlus.au3> #include <WinAPIGdi.au3> Example() Func Example() Local $hGUI, $hImage, $hCombo, $hFont Local $idListview, $hImage Local $sWow64 = "" Local $Pasta = "C:\WINDOWS\Cursors\3dgarro.cur" Local $PastaROMs = @MyDocumentsDir & "\Stella\ROMs\" ;com barra no final $hGUI = GUICreate("ImageList", 500, 310) GUISetFont(14, 400, 0, "Arial") ;<<<<<<<<<<this does not work for _GUICtrlComboBoxEx_Create $hCombo = _GUICtrlComboBoxEx_Create($hGUI, "", 2, 2, 494, 200) ;GUICtrlSetFont($hCombo, 14, 400, 0, "Arial");<<<<<<<<<<It does not work ; ;Create a handle to a font object $hFont = _WinAPI_CreateFont(30, 0, 0, 0, 400, False, False, False, $DEFAULT_CHARSET, $OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $DEFAULT_QUALITY, 0, 'Arial') ;Pass the handle to _WinAPI_SetFont _WinAPI_SetFont($hCombo, $hFont) $idListview = GUICtrlCreateListView("", 2, 50, 494, 250, BitOR($LVS_SHOWSELALWAYS, $LVS_NOSORTHEADER, $LVS_REPORT)) _GUICtrlListView_SetExtendedListViewStyle($idListview, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES, $LVS_EX_DOUBLEBUFFER)) GUISetState(@SW_SHOW) ; Initialize GDI+ library _GDIPlus_Startup() ; Load images $hImage = _GUIImageList_Create(120, 70, 6, 2) ;32,32,5,5) ; $DadosCombo = "Escolha|" & _GUIImageList_Add($hImage, _GUICtrlComboBoxEx_CreateSolidBitMap($hCombo, 0x0000FF, 120, 70)) ;Local $aCursors[] = [32650, 32512, 32515, 32649, 32651, 32513, 32648, 32646, 32643, 32645, 32642, 32644, 32516, 32514] For $i = 1 To 10 $sFile = FileOpenDialog("Please select an image", $PastaROMs, "Image (*.jpg;*.png;*.bmp;*.gif;*.tif)", BitOR($FD_PATHMUSTEXIST, $FD_FILEMUSTEXIST)) If @error Then Exit MsgBox(BitOR($MB_TOPMOST, $MB_ICONERROR), "Error", "No image file has been selected", 30) $a = _GDIPlus_BitmapCreateFromFile ($sFile);<<<<< ok If @error Or Not $hImage Then MsgBox(BitOR($MB_TOPMOST, $MB_ICONERROR), "Error", "This file isn't supported by GDIPlus!") Else $b=_GUIImageList_Add($hImage, $a);<<<<<< Return -1 $DadosCombo &= "|" & $i & "_img_princ.gif""|" & $b EndIf Next _GUICtrlListView_SetImageList($idListview, $hImage, 1) _GUICtrlComboBoxEx_SetImageList($hCombo, $hImage) ; Add columns _GUICtrlListView_AddColumn($idListview, "Icons - Mouses", 350) ; Add items $a = StringSplit($DadosCombo, "|") For $i = 1 To $a[0] Step 2 _GUICtrlListView_AddItem($idListview, $a[$i], $a[$i + 1]) _GUICtrlComboBoxEx_AddString($hCombo, $a[$i], $a[$i + 1], $a[$i + 1]) Next ;AutoIt_Debugger_Command:Disable_Debug ; Loop until the user exits. Do Until GUIGetMsg() = $GUI_EVENT_CLOSE GUIDelete() ;AutoIt_Debugger_Command:Enable_Debug EndFunc ;==>Example tks
    • Xandy
      By Xandy
      I have a bunch of SDL_Surfaces loaded into memory.  I want to list them in a ComboBox.
      Using this code, I can load images to the combobox from file but not from existing SDL_Surface memory
      CODE ISN"T MEANT TO RUN
      ; Create combobox pic list example $aControl[$iControl_id][$eControl_data] = _GUICtrlComboBoxEx_Create($gui, $data_value, $data_x, $data_y, $data_w, $data_h, $CBS_DROPDOWNLIST) ; Image List for ComboboxEx Local $hImage = _GUIImageList_Create($gTile_w, $gTile_h, 6) ; Fill hImage with SDL_Surfaces stored in memory: aNPC_surf[scale][type][way][frame] For $i = 0 To 1 ; This works but only from file: ;_GUIImageList_AddBitmap($hImage, $gFolder_graphics & $gaWorld_info[$player.iWorld_cur][$eWi_filename] & "Tiles\" & $i & ".bmp") ; I've broken up a sprite sheet and want to insert into combobox from memory ;_GUIImageList_Add($hImage, $aNPC_surf[1][1][1][$i]) _GUIImageList_Add($hImage, _GDIPlus_BitmapCreateFromMemory($aNPC_surf[1][1][1][$i]), True) ;_GDIPlus_BitmapCreateFromMemory($aNPC_surf[1][1][1][$i]) ; Add the index number to combobox item _GUICtrlComboBoxEx_AddString($aControl[$eNPC_iPic_type][$eControl_data], $i, $i, $i) Next ; Set hImage list to combobox control _GUICtrlComboBoxEx_SetImageList($aControl[$eNPC_iPic_type][$eControl_data], $hImage) Anyone know if I can convert from SDL_Surface to hBitmap?  Maybe I'm doing something else wrong.
       
      I've seen hBitmap converted to SDL_Surface but I don't really understand it yet: 
       
      My full script can be found here:
       
    • SimTheNo1
      By SimTheNo1
      I am busy with building a solution for change monitoring of VOIP call program and to be properly automated means among others need for some limited OCR functionality. Current works of others are way too much overkill for this case what makes the need to build it myself. But to do it properly I significantly have to increase my knowledge about digital graphics management.
      For now I already have discovered here and there some mind blowing  Autoit miracles what can be achieved with Windows own possibilities to manipulate that what is output to the monitor. And as far I can judge there are 2 options to process graphics without use of any external libraries like ImageMagick, FreeImage and so on. These are:
       WinAPI  GDIPlus It is for me quite obvious to have various holes in general understanding of graphics and it is once more very clear what advantages gives consistent general study in 1 or another official institutions like University.  Cause there you are introduced into certain domain of knowledge in a way which usually has been perfected over long period of time. So you are not overloaded by stuff which requires a certain amount of information to be initially clear for you. For example, before starting to solve physics you first learn to read, count and so on and then move to subjects like physics.
      Though in my case opportunity to study in such educational system I had only for 8 years, from my 7th to 15th year of age in the country that was falling apart now Ukraine but used to be USSR, was all what it was. After have immigrated to Netherlands possibilities to study further haven't occur. And this therefor causes often various implications when going deep in that or another field of practical knowledge acquiring for any needed physical result, like programming to perform enormous amount of tasks. In this particular case automating VOIP call program.
      Anyway, right now I think the best direction to move is to concentrate on as basic as possible image management and if someone would maybe explain in general what is a pixel will definitely help. Particularly I am very curious about how to do picture manipulations in Autoit. Especially would help a lot to produce eventually following functions:
      createImage($imageFileName, $width, $height, $color) readImagePixel($imageFileName, $x, $y)  writeImagePixel($imageFileName, $x, $y) I do not know exactly how image is handled in computer but preferably above mentioned functions should deal with so far possible origin of graphics creation on computer. But nevertheless I definitely would love to hear any proposition for solution.
      The problem with explaining screenshots:
       VOIPConnect full Window  Part of Window with control to monitor for changes  Exact location of area where actual changes occur and have to be processed  It comes down to a rectangle of approximately 51 pixel wide and 7 pixel high. In fact if I get to learn as far as to be able exactly read, write and compare 2 images consistently across different computers I could narrow down then even further the area to watch as little as a square of 2-5 pixels wide. 
      To finish here is last detail about particularly no need for ultra fast solution at all. This because it is needed only once when it is first run on a new computer and to have to wait few minutes while it is being set instead of just a few seconds make no sence.
      This is it and what I too think to do beside this very particular case is to purify out beautiful generic Autoit functions for core image manipulation by using WinAPI or/and GDIPlus. 
    • UritOR
      By UritOR
      Hi all,
      I'm trying to find how to draw an image (create a label in mspaint) and save it as .bmp. And set it to be a wallpaper
      I also need to know what wallpaper is use now, for restore it when the script is closed.
      What is the best way to do it? Do I need Gdi+ for it?  I use this code (which I found here in forum) to set a .bmp file as wallpaper:
      Func _ChangeWallpaper($sFile,$iType) ; Changes the wallpaper to $sFilename using $iType as: ; 1 Tiled ; 2 Centered ; 3 Stretched ; any other value (usually 0) unchanged ; ; Returns ; 0 if everything is allright. ; -1 if $sFile does not exist. @error is set to 1 ; -2 if £sFile is not a .bmp file. @error is set to 2 If Not FileExists($sFile) Then SetError(1) Return -1 EndIf If StringTrimLeft($sFile,StringInStr($sFile,'.',0,-1)) <> 'bmp' Then SetError(2) Return -2 EndIf Select Case $iType = 1 RegWrite('HKCU\Control Panel\Desktop','TileWallpaper','reg_sz','1') RegWrite('HKCU\Control Panel\Desktop','WallpaperStyle','reg_sz','0') Case $iType = 2 RegWrite('HKCU\Control Panel\Desktop','TileWallpaper','reg_sz','0') RegWrite('HKCU\Control Panel\Desktop','WallpaperStyle','reg_sz','0') Case $iType = 3 RegWrite('HKCU\Control Panel\Desktop','TileWallpaper','reg_sz','0') RegWrite('HKCU\Control Panel\Desktop','WallpaperStyle','reg_sz','2') Case Else EndSelect RegWrite('HKCU\Control Panel\Desktop','Wallpaper','reg_sz',$sFile) DllCall("User32.dll","int","SystemParametersInfo","int",20,"int",0,"str",$sFile,"int",0) Return 0 EndFunc  
      The flow that I understand should be:
      1) Check what wallpaper is in use now. I can find the path to it by going to registry  key named "wallpaper" here :[HKEY_CURRENT_USER\Control Panel\Desktop]
      2) Create a file mspaint
      3) Create a label with its properties (size,color) in this file
      3) Save this file in some temporary directory
      4) Set a created file as a wallpaper using the above code
      5) When the script is closed restore the old wallpaper.
       
      So again, my question is how to create a .bmp file with label in it?
×