Jump to content
Sign in to follow this  

Recommended Posts

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 &= 'gdEYf4PQPJwDR8bmnv/aUr2lvUprmhiDJtY1I9asrDjLd1uVLxzrBpn9HIizDcNzIvwmFmfhtaWulk4kH5WGtZY196i6aaJAE61muDRZLAqY+4vVRSuP4gwrRmQl5TnGFEq8RoleqrhNpcKWTuWzXll7cXma6SkKNIlrBZFlVICZ1EVTmGF9yhJW6W4MfO5c3cfdnxNn1v23XvWxguu8NFK+KG15axqPRU40O4vlM+iXx0K1ZcH0uCbWFgOktY8rPrVahI0xKl9AVfXj4gcR0VGR04x4oVFdltwDY49DQjeJgXt+5NSp5r3bt4/tKMHPeT+kbFFaWrSx5hWeN4ybyIrH4/3H9/dYt772nUvL75udQxRoJgK0G96i58JSfJNhEUNcsrmvURfNMhgFGlFjzeqOE97/jDIlQ7IpEYgr74+gbMgsw8A4jDtL2ParVFHatec3xbY7616RDM52fKw4JDNXOFSSQMABYLEjCQSii1OGJgKwCGKRYGFBpFVgRSsfiyYIsZUlThhfA5I/ED1kPPK8CCxiDrFc8f3GxCOHk4y/L8nFCxcaKVCUtkBLp9yEEQ4ey/vX5SkKNPto0sSXTbBvjBHuqe7Gh2ArbUXrk9HJqVVGiZtpRQxiCmtT9gaIJYrnxQLH53zu3Lnl993DAhefKV8Zn1gbnth/Ardmew0JLs+1toF1raa1RvWxrtZQVqNXPBzjnzV73h0IRBenLs02EWAxQAwR8xWdWgsvdlha1i5f8NLBwXh1qBRpbDyMk9HcqFwdFlhC2Jj5fsD9jmkNQ6CG+xsTYV73cXkXF5OH+oNyqEkdaHR5akETXZrpyvyHrFKlXZ0IrnqsaIq0UWKL2JSyY9ICk1jDuO9J7s/s4T7joGjsLGOCw2RGqQ/mGAeGubg8RYFmk3NaieRZNsIpLpxAq3F1cgLNOG3XiQS3OhaHDVtdCxRULoxFaVknqssyxbU55FCKy5O1fUtdnqJA06VJdhAuyA269TiBVheAj/icXXcBS3ew+W5SxOPeIj5u5Xw4zmU0oLr7NGPMMdJ3nSh52MC1ubFewfwea/u7b97atsK2okDTpdkvGDbf1fnNr3xja7oLEGzb1I6lO3pbxRgDXIzPwxeb81D3FrXN+lJXyx7HCONjQlKdMUiqybeyhuLitbs8xSQBYVOgVQjm7+Tkz3d1skCWrzUWJzHMvS6apIvWZn6u+cVlmYcyUSZkeqwUTQ7CwzBmvCZjk9haDp7P/OCZGjOIRQua8WbEV40mzuJFgYVv6lY59uhUmAVxNiGU78BNtQp+3r0QD7izRsWitNvQ0gk3LB6GyAMxRrIU1jT6Kc8gLk20oNkVIBcWviDKwkbGfVTeXYD/s21WNMkfZ0M/c8YLY4vryH+vDVs6BVdiwd6giylbTFVWikMUaIqzlMl8QlcnGxVWhGIBuT88OKAu2lqWmK3D4G/GV26fzUVrbWWMdsdyoqYer11HBqnlXNa2UuJR4DOvwLXJmoOAmuL9YQ6xN5QUaaKL05MkNXES8TGTuzqJBeP0WGNdNO6VTRLri9YzyzMkxk4uI76GIg1XIfO5QusZSVMI+lKuVtblUvXSRIFmMkDbsqmGBZ+Fp6IYL6wjxwmzyjdJwV1fdOzU/9wSSk0wr5nfK0VcKdcmiUiHOhhMLBZDvTRE2kRZxaJAMxmAQFBM5YUtQJF7KBBcnYVi0aoVZpJuv0Nh5ckbvIexQ620jYmptsk7z8lzyzhChPmNRa14S6c4WYoxgEWr2NqMUCWreDuTB2Tv3vv3mu1AcUZhQsRZpYHbKzOWSghJ0s5JN6/PjWkG3joV91txf+fOnbZhOZa1lV/XhXgcXm/oPfO74f7D4+rGmDGMCKIK18DypUnOnz/f7D++P4arVRRoJgOw8FRLHLhdpCSCiEiBQ2GUZBKSUepKwNlc8oDo4lSchWSAyuG0WMzVKSJSfyP0okldZ86c2WB7KFGgmam5NfFTmPJXZXXOBhGRdPu4aj0H'
    $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 &= '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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

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

-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

-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

-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

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 &= '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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 &= '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 &= '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 LaCastiglione

Share this post


Link to post
Share on other sites

@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

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

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  

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • 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
    • 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  
    • 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
×
×
  • Create New...