Jump to content
Sign in to follow this  
EKY32

GIF Animation On Button

Recommended Posts

EKY32

Hello, I found a code by dear UEZ some where for this for PNG.

I was wondering if I can get some help to attach an animated GIF file to button control.

Thank you.

;coded by UEZ 2012
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <GDIPlus.au3>

_GDIPlus_Startup()
;~ Global Const $IMAGE_BITMAP = 0
Global Const $STM_SETIMAGE = 0x0172
Global $msg
Global Const $hGUI = GUICreate("Test", 600, 250)
Global Const $idLogo = GUICtrlCreatePic("", 215, 20, 169, 68)
Global Const $idButton = GUICtrlCreateButton("", 266, 150, 78 , 81, $BS_BITMAP)
Global Const $hButton = GUICtrlGetHandle($idButton)
Global $hBmp, $hBmp_Logo, $hBmp_Button
If @OSBuild < 6000 Then
    $hBmp = _GDIPlus_ImageLoadFromFile("n6Q1zAEteVB.gif")
    $hBmp_Logo = ConvertBitmap($hBmp)
    _GDIPlus_BitmapDispose($hBmp)
Else
    $hBmp = _GDIPlus_ImageLoadFromFile("n6Q1zAEteVB.gif")
    $hBmp_Logo = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmp)
    _GDIPlus_BitmapDispose($hBmp)
EndIf
_WinAPI_DeleteObject(GUICtrlSendMsg($idLogo, $STM_SETIMAGE, $IMAGE_BITMAP, $hBmp_Logo))

If @OSBuild < 6000 Then
        $hBmp =  _GDIPlus_ImageLoadFromFile("n6Q1zAEteVB.gif")
        $hBmp_Button = ConvertBitmap($hBmp)
        _GDIPlus_BitmapDispose($hBmp)
    Else
        $hBmp = _GDIPlus_ImageLoadFromFile("n6Q1zAEteVB.gif")
        $hBmp_Button =  _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmp)
EndIf
_WinAPI_DeleteObject(_SendMessage($hButton, $BM_SETIMAGE, $IMAGE_BITMAP, $hBmp_Button))
;~ _WinAPI_UpdateWindow($hButton)
GUISetState()


While True
    Switch GUIGetMsg()
        Case $idLogo
            MsgBox(0, "Information", "Image was clicked!")
        Case $idButton
            MsgBox(0, "Information", "Button was clicked!")
        Case $GUI_EVENT_CLOSE
            _WinAPI_DeleteObject($hBmp_Logo)
            _WinAPI_DeleteObject($hBmp_Button)
            GUIDelete($hGUI)
            _GDIPlus_Shutdown()
            Exit
    EndSwitch
WEnd

Func ConvertBitmap($hBitmap)
    Local $iButtonColor = _WinAPI_GetSysColor($COLOR_BTNFACE)
    $iButtonColor = 0x10000 * BitAND($iButtonColor, 0xFF) + BitAND($iButtonColor, 0x00FF00) + BitShift($iButtonColor, 16)
    Local $iWidth = _GDIPlus_ImageGetWidth($hBitmap), $iHeight = _GDIPlus_ImageGetHeight($hBitmap)
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iWidth, "int", $iHeight, "int", 0, "int", 0x0026200A, "ptr", 0, "int*", 0)
    Local $hBitmap_New = $aResult[6]
    Local $hCtx_new = _GDIPlus_ImageGetGraphicsContext($hBitmap_New)
    Local $hBrush = _GDIPlus_BrushCreateSolid(0xFF000000 + $iButtonColor)
    _GDIPlus_GraphicsFillRect($hCtx_new, 0, 0, $iWidth, $iHeight, $hBrush)
    _GDIPlus_GraphicsDrawImageRect($hCtx_new, $hBitmap, 0, 0, $iWidth, $iHeight)
    Local $hHBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap_New)
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_BitmapDispose($hBitmap_New)
    _GDIPlus_GraphicsDispose($hCtx_new)
    Return $hHBitmap
EndFunc

[font="'trebuchet ms', helvetica, sans-serif;"]Please mark the answer of your question if you found it.[/font]

Share this post


Link to post
Share on other sites
t1ck3ts

Just a reminder, that

Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iWidth, "int", $iHeight, "int", 0, "int", 0x0026200A, "ptr", 0, "int*", 0)

has changed to

Local $aResult = DllCall($__g_hGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iWidth, "int", $iHeight, "int", 0, "int", 0x0026200A, "ptr", 0, "int*", 0)

Share this post


Link to post
Share on other sites
EKY32

Thank you, should that change anything? coz it didn't.


[font="'trebuchet ms', helvetica, sans-serif;"]Please mark the answer of your question if you found it.[/font]

Share this post


Link to post
Share on other sites
UEZ

Try this:

 

 

#include <GuiButton.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <GDIPlus.au3>
#include <Memory.au3>

_GDIPlus_Startup()
Global $binGIFAnim = _GIF_Anim()
Global $hGIFImage = _GDIPlus_BitmapCreateFromMemory($binGIFAnim)
Global Const $iW = _GDIPlus_ImageGetWidth($hGIFImage), $iH = _GDIPlus_ImageGetHeight($hGIFImage)
Global Const $hGUI = GUICreate("Animated GIF Button", 320, 160)
Global Const $iLbl = GUICtrlCreateLabel("Animated GIF Button", 0, 0, 320, 100, $SS_CENTER)
GUICtrlSetFont(-1, 20)
Global Const $iBtn = GUICtrlCreateButton("", 320 - $iW - 20, 160 - $iH - 20, $iW + 10, $iH + 10, $BS_BITMAP)
GUISetState()

Global  $iCurrentFrame = 0
Global Const $iAnimDimCount = _GDIPlus_GIFAnimGetFrameDimensionsCount($hGIFImage)
Global Const $tGUID = _GDIPlus_GIFAnimGetFrameDimensionsList($hGIFImage, $iAnimDimCount)
Global Const $iAnimFrameCount =  _GDIPlus_GIFAnimGetFrameCount($hGIFImage, $tGUID)
Global Const $aFrameDelays = _GDIPlus_GIFAnimGetFrameDelays($hGIFImage, $iAnimFrameCount)

AdlibRegister("PlayBtnAnim", 20)

Do
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            AdlibUnRegister("PlayBtnAnim")
            _GDIPlus_BitmapDispose($hGIFImage)
            _GDIPlus_Shutdown()
            GUIDelete()
            $binGIFAnim = 0
            Exit
        Case $iBtn
            MsgBox(0, "Info", "Button was pressed!", 30)
    EndSwitch
Until False

Func PlayBtnAnim()
    AdlibUnRegister("PlayBtnAnim")
    Local $iDelay = $aFrameDelays[$iCurrentFrame]
    Local Static $iTimerCurrentFrame = TimerInit()
    _GDIPlus_GIFAnimSelectActiveFrame($hGIFImage, $tGUID, $iCurrentFrame)
    Local $hBmp = _GDIPlus_BitmapCreateFromScan0($iW, $iH)
    Local $hGfx = _GDIPlus_ImageGetGraphicsContext($hBmp)
    _GDIPlus_GraphicsClear($hGfx, 0xFFFFFFFF)
    _GDIPlus_GraphicsDrawImageRect($hGfx, $hGIFImage, 0, 0, $iW, $iH)
    Local $hBitmap_GDI = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmp)
;~  _WinAPI_DeleteObject(GUICtrlSendMsg($iPic, 0x0172 , 0, $hBitmap_GDI)) ;$STM_SETIMAGE = 0x0172, $IMAGE_BITMAP = 0
    _WinAPI_DeleteObject(GUICtrlSendMsg($iBtn, $BM_SETIMAGE, $IMAGE_BITMAP, $hBitmap_GDI))
    _WinAPI_DeleteObject($hBitmap_GDI)
    _GDIPlus_GraphicsDispose($hGfx)
    _GDIPlus_BitmapDispose($hBmp)
    If TimerDiff($iTimerCurrentFrame) > $iDelay Then
        $iCurrentFrame += 1
        $iTimerCurrentFrame = TimerInit()
    EndIf
    If $iCurrentFrame > UBound($aFrameDelays) - 1 Then $iCurrentFrame = 0
    AdlibRegister("PlayBtnAnim", 10)
EndFunc   ;==>PlayBtnAnim



;Code below was generated by: 'File to Base64 String' Code Generator v1.18 Build 2014-08-02

Func _GIF_Anim($bSaveBinary = False, $sSavePath = @ScriptDir)
    Local $GIF_Anim
    $GIF_Anim &= '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'
    $GIF_Anim &= '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'
    $GIF_Anim &= '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'
    $GIF_Anim &= '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'
    $GIF_Anim &= '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'
    $GIF_Anim &= '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'
    $GIF_Anim &= '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'
    $GIF_Anim &= '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'
    $GIF_Anim &= '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'
    $GIF_Anim &= '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'
    $GIF_Anim &= 'wQYSKfTEQl4WQCgQAfzeloqWfsLuQKHFXEAAIfkEBQQA3AAsEAAEAB4AHQAACP8AuQkcKFCOAYIIEyokyCtBDwIJki2cmDBZgUUwMgQqcJCiRwUgzEDQAoZQAo8eD/TRQkWAAAyRRKCcKCmGCZcjKASQMHNhgg8USgigYmESgJ4KNQxwIQaBCg5BjiJNeGuHgAxUCDyQOpUgAGEKQq0axLWrVwBoy5pdy7btxF61iqFVmLZngjEcEKmaO3BXAU8JyKI8hoNFFAgf5M7VcGfFmDgE+E5sgkcoNxi0+AbBgAAKFhwX1CZUlgLCCBQgLvHFpGIEFBKEdolOmADHi0ZGJF/IYeGEDE6zFU5TUk2ywFeeILpdvtbIDi+jgk91QOPEgjgJpPeUZMHlFkjGzR4cYCGUwqfwXS+AcIEBBCz0Xa2gOvCr7vK09tkGBAAh+QQFBADcACwOAAQAHwAcAAAI/wC5CRwosBSuBAomEFzIsOFAa0R0ELpBKYHDiw1XgcBAYUwGELAwiuRWCgieFVQQbHEhaSTGPZvIYBFQZQG3TS4vlor0AoIAAVLICAGQ06GCQCy2CFBxp0FRh8V8LHjRJlAook8bWmogqUcDAFizMgRLVqzZs2jTqr0QYRBYtQJHcZgRwNfbhWTvYqyVaKYFSGUHNojUyMeewA4TvKEiYAsIxLYak2AzQK9DBzEoILCQCbEmDIy1gHgQ9qIkEDEC6EI8CsOCESkelcboYQJigXICmGmxKEHYS2nOOhKlwBfBUDdgIGgClxusDycQmCBh2WyCFghGkDAEp3rWW3pmYhXhcdvskD6JeNieffZCq7zNucFXGxAAIfkEBQQA3AAsDAADACAAHAAACP8AuQkcSJBbKWUeCipcyFAgLEmZMiVg1LCiwiUDArmIYyOIxY/cLmnikMLEAguNBAYDuVLhBUgtTEgRYAKPApAVXwXAQIWbgBN4QuFsWKwHBikjRnzp4GBoQ1QfVKhY4YKANqcMS6ECYcGEJ15YGwKw1QCWmrBo06pdy7atxQm+AMh1e20TDRAE5AJom2DDAikuEuhVqHeuRQIqFlCx4MIwwQKPKmFy3FDTBhILMCigzM0VBghYMAjeW5FPpBsdPA0mOGOLAAFjdhhO4sAXwwvAOAuMpAIBAhWcSEN1gUET6aG2QLBYs6OCwAsgFkRZIEPJcZzMZtUiWGsGidcZHOgdxkm6VCMUWVQcYjZ+6N5XO3TssN4+bOHrbVezDQgAOw=='
    Local $bString = Binary(_WinAPI_Base64Decode($GIF_Anim))
    If $bSaveBinary Then
        Local $hFile = FileOpen($sSavePath & "\animated-gif-showcase-emilio-gomaris_50x50.gif", 18)
        FileWrite($hFile, $bString)
        FileClose($hFile)
    EndIf
    Return  $bString
EndFunc   ;==>_GIF_Anim

Func _WinAPI_Base64Decode($sB64String)
    Local $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "ptr", 0, "dword*", 0, "ptr", 0, "ptr", 0)
    If @error Or Not $aCrypt[0] Then Return SetError(1, 0, "")
    Local $bBuffer = DllStructCreate("byte[" & $aCrypt[5] & "]")
    $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "struct*", $bBuffer, "dword*", $aCrypt[5], "ptr", 0, "ptr", 0)
    If @error Or Not $aCrypt[0] Then Return SetError(2, 0, "")
    Return DllStructGetData($bBuffer, 1)
EndFunc   ;==>_WinAPI_Base64Decode

#region _GDIPlus_GIFAnim (unfinished)
;coded by UEZ build 2014-06-10
;requires 3.3.11.5+

;_GDIPlus_BitmapConvertTo8Bit
;_GDIPlus_GIFAnimCreateFile
;_GDIPlus_GIFAnimExtractAllFrames
;_GDIPlus_GIFAnimGetFrameCount
;_GDIPlus_GIFAnimGetFrameDelays
;_GDIPlus_GIFAnimGetFrameDelaysFromBinFile
;_GDIPlus_GIFAnimGetFrameDimensionsCount
;_GDIPlus_GIFAnimGetFrameDimensionsList
;_GDIPlus_GIFAnimSelectActiveFrame
;_GDIPlus_ImageGetPropertyItem
;_GDIPlus_ImageSaveAdd
;_GDIPlus_ImageSaveAddImage

; #FUNCTION# ====================================================================================================================
; Name ..........: _GDIPlus_GIFAnimGetFrameDimensionsCount
; Description ...: Gets the number of frame dimensions in this Image object.
; Syntax ........: _GDIPlus_GIFAnimGetFrameDimensionsCount($hImage)
; Parameters ....: $hImage              - A handle to an image / bitmap object
; Return values .: The number of frame dimensions in this Image object.
; Author ........: UEZ
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........:
; ===============================================================================================================================
Func _GDIPlus_GIFAnimGetFrameDimensionsCount($hImage)
    Local Const $aResult = DllCall($__g_hGDIPDll, "int", "GdipImageGetFrameDimensionsCount", "handle", $hImage, "ulong*", 0)
    If @error Then Return SetError(@error, @extended, 0)
    If $aResult[0] Then Return SetError(10, $aResult[0], 0)
    Return $aResult[2]
EndFunc   ;==>_GDIPlus_GIFAnimGetFrameDimensionsCount

; #FUNCTION# ====================================================================================================================
; Name ..........: _GDIPlus_GIFAnimGetFrameDimensionsList
; Description ...: Gets the identifiers for the frame dimensions of this Image object which fills the GUID struct.
; Syntax ........: _GDIPlus_GIFAnimGetFrameDimensionsList($hImage, $iFramesCount)
; Parameters ....: $hImage              - A handle to an image / bitmap object
;                  $iFramesCount        - An integer value.
; Return values .: tagGUID struct
; Author ........: UEZ
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........:
; ===============================================================================================================================
Func _GDIPlus_GIFAnimGetFrameDimensionsList($hImage, $iFramesCount)
    Local Const $tGUID = DllStructCreate($tagGUID)
    Local Const $aResult = DllCall($__g_hGDIPDll, "int", "GdipImageGetFrameDimensionsList", "handle", $hImage, "struct*", $tGUID, "uint", $iFramesCount)
    If @error Then Return SetError(@error, @extended, 0)
    If $aResult[0] Then Return SetError(10, $aResult[0], 0)
    Return $tGUID
EndFunc   ;==>_GDIPlus_GIFAnimGetFrameDimensionsList

; #FUNCTION# ====================================================================================================================
; Name ..........: _GDIPlus_GIFAnimGetFrameCount
; Description ...: Gets the frame count of the loaded gif by passing the GUID struct
; Syntax ........: _GDIPlus_GIFAnimGetFrameCount($hImage, $tGUID)
; Parameters ....: $hImage              - A handle to an image / bitmap object
;                  $tGUID               - A struct to a GUID that specifies the frame dimension.
; Return values .: The amount of frames from a GIF animated image handle
; Author ........: UEZ
; Modified ......:
; Remarks .......:
; Related .......: _GDIPlus_ImageLoadFromFile _GDIPlus_BitmapCreateFromFile
; Link ..........:
; ===============================================================================================================================
Func _GDIPlus_GIFAnimGetFrameCount($hImage, $tGUID)
    Local Const $aResult = DllCall($__g_hGDIPDll, "int", "GdipImageGetFrameCount", "handle", $hImage, "struct*", $tGUID, "ptr*", 0)
    If @error Then Return SetError(@error, @extended, 0)
    If $aResult[0] Then Return SetError(10, $aResult[0], 0)
    Return $aResult[3]
EndFunc   ;==>_GDIPlus_GIFAnimGetFrameCount

;Set the active frame by passing the GUID struct and current frame
; #FUNCTION# ====================================================================================================================
; Name ..........: _GDIPlus_GIFAnimSelectActiveFrame
; Description ...: Selects the frame in this Image object specified by passing the GUID struct and current frame.
; Syntax ........: _GDIPlus_GIFAnimSelectActiveFrame($hImage, $tGUID, $iCurrentFrame)
; Parameters ....: $hImage              - A handle to an image / bitmap object
;                  $tGUID               - A struct to a GUID that specifies the frame dimension.
;                  $iCurrentFrame       - An integer value.
; Return values .: True or False on errors
; Author ........: UEZ
; Modified ......:
; Remarks .......:
; Related .......: _GDIPlus_ImageLoadFromFile _GDIPlus_BitmapCreateFromFile
; Link ..........:
; ===============================================================================================================================
Func _GDIPlus_GIFAnimSelectActiveFrame($hImage, $tGUID, $iCurrentFrame)
    Local Const $aResult = DllCall($__g_hGDIPDll, "int", "GdipImageSelectActiveFrame", "handle", $hImage, "struct*", $tGUID, "uint", $iCurrentFrame)
    If @error Then Return SetError(@error, @extended, 0)
    If $aResult[0] Then Return SetError(10, $aResult[0], 0)
    Return True
EndFunc   ;==>_GDIPlus_GIFAnimSelectActiveFrame

; #FUNCTION# ====================================================================================================================
; Name ..........: _GDIPlus_GIFAnimGetFrameDelays
; Description ...: Gets the delay of each frame from an image handle
; Syntax ........: _GDIPlus_GIFAnimGetFrameDelays($hImage, $iAnimFrameCount)
; Parameters ....: $hImage              - A handle to an image / bitmap object
;                  $iAnimFrameCount     - An integer value.
; Return values .: An array with the information about the delay of each frame or the error code
; Author ........: UEZ
; Modified ......:
; Remarks .......: If frame delays cannot be read try _GDIPlus_GIFAnimGetFrameDelaysFromBinFile instead
; Related .......: _GDIPlus_ImageLoadFromFile _GDIPlus_BitmapCreateFromFile _GDIPlus_ImageGetPropertyItem
; Link ..........:
; ===============================================================================================================================
Func _GDIPlus_GIFAnimGetFrameDelays($hImage, $iAnimFrameCount)
    If $iAnimFrameCount < 2 Then Return SetError(1, 0, 0)
    Local Const $GDIP_PROPERTYTAGFRAMEDELAY = 0x5100
    Local $tPropItem = _GDIPlus_ImageGetPropertyItem($hImage, $GDIP_PROPERTYTAGFRAMEDELAY)
    If IsDllStruct($tPropItem) Then
        Local $iType = $tPropItem.type, $iLength, $tVal
        If $iType Then
            $iLength = $tPropItem.length
            Switch $iType
                Case 1
                    $tVal = DllStructCreate("byte delay[" & $iLength & "]", $tPropItem.value)
                Case 3
                    $tVal = DllStructCreate("short delay[" & Ceiling($iLength / 2) & "]", $tPropItem.value)
                Case 4
                    $tVal = DllStructCreate("long delay[" & Ceiling($iLength / 4) & "]", $tPropItem.value)
                Case Else
                    Return SetError(3, 0, 0)
            EndSwitch
            Local $aFrameDelays[Int($iAnimFrameCount)], $i
            For $i = 0 To UBound($aFrameDelays) - 1
                $aFrameDelays[$i] = $tVal.delay(($i + 1)) * 10
;~              ConsoleWrite($i & ": "& $aFrameDelays[$i] & @CRLF)
            Next
        EndIf
        Return $aFrameDelays
    EndIf
    Return SetError(2, 0, 0)
EndFunc   ;==>_GDIPlus_GIFAnimGetFrameDelays

; #FUNCTION# ====================================================================================================================
; Name ..........: _GDIPlus_ImageGetPropertyItem
; Description ...: Gets a specified property item (piece of metadata) from this Image object.
; Syntax ........: _GDIPlus_ImageGetPropertyItem($hImage, $iPropID)
; Parameters ....: $hImage              - A handle to an image object.
;                  $iPropID             - An integer that identifies the property item to be retrieved.
; Return values .: $tagGDIPPROPERTYITEM structure or 0 on errors
; Author ........: UEZ
; Modified ......:
; Remarks .......:
; Related .......: _GDIPlus_ImageLoadFromFile _GDIPlus_ImageLoadFromStream
; Link ..........: Property Item Descriptions -> http://msdn.microsoft.com/en-us/library/windows/desktop/ms534416(v=vs.85).aspx
; ===============================================================================================================================
Func _GDIPlus_ImageGetPropertyItem($hImage, $iPropID)
    Local $aResult = DllCall($__g_hGDIPDll, "int", "GdipGetPropertyItemSize", "handle", $hImage, "uint", $iPropID, "ulong*", 0)
    If @error Then Return SetError(@error, @extended, 0)
    If $aResult[0] Then Return SetError(10, $aResult[0], 0)
    Local Static $tBuffer ;why static? because otherwise it would crash when running it as x64 exe (workaround)
    $tBuffer = DllStructCreate("byte[" & $aResult[3] & "]")
    $aResult = DllCall($__g_hGDIPDll, "int", "GdipGetPropertyItem", "handle", $hImage, "uint", $iPropID, "ulong", $aResult[3], "struct*", $tBuffer)
    If @error Then Return SetError(@error, @extended, 0)
    If $aResult[0] Then Return SetError(11, $aResult[0], 0)
    Local Const $tagGDIPPROPERTYITEM = "uint id;ulong length;word type;ptr value"
    Local $tPropertyItem = DllStructCreate($tagGDIPPROPERTYITEM, DllStructGetPtr($tBuffer))
    If @error Then Return SetError(20, $aResult[0], 0)
    Return $tPropertyItem
EndFunc   ;==>_GDIPlus_ImageGetPropertyItem

; #FUNCTION# ====================================================================================================================
; Name ..........: _GDIPlus_GIFAnimGetFrameDelaysFromBinFile
; Description ...: Gets the delay of each frame from a binary gif file
; Syntax ........: _GDIPlus_GIFAnimGetFrameDelaysFromBinFile($binGIF, $iAnimFrameCount[, $iDelay = 10])
; Parameters ....: $binGIF              - A binary string with the GIF anim.
;                  $iAnimFrameCount     - An integer value.
; Return values .: An array with the information about the delay of each frame or the error code
; Author ........: UEZ
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........:
; ===============================================================================================================================
Func _GDIPlus_GIFAnimGetFrameDelaysFromBinFile($binGIF, $iAnimFrameCount)
    If Not IsBinary($binGIF) Then Return SetError(1, 0, 0)
    If $iAnimFrameCount < 2 Then Return SetError(2, 0, 0)
    Local $aFrameDelays = StringRegExp($binGIF, "(?i)0021F904[[:xdigit:]]{2}([[:xdigit:]]{4})", 3)
    If @error Then Return SetError(3, 0, 0)
    Local Const $iDelay = 10
    For $i = 0 To UBound($aFrameDelays) - 1
        $aFrameDelays[$i] = $iDelay * Dec(StringRegExpReplace($aFrameDelays[$i], "([[:xdigit:]]{2})([[:xdigit:]]{2})", "$2$1"))
    Next
    If UBound($aFrameDelays) <> $iAnimFrameCount Then ReDim $aFrameDelays[$iAnimFrameCount]
    Return $aFrameDelays
EndFunc   ;==>_GDIPlus_GIFAnimGetFrameDelaysFromBinFile

; #FUNCTION# ====================================================================================================================
; Name ..........: _GDIPlus_GIFAnimExtractAllFrames
; Description ...: Extracts all frames from a GIF animation file with the option to resize the frames
; Syntax ........: _GDIPlus_GIFAnimExtractAllFrames($hImage, $sFilename[, $iJPGQual = 85[, $iW = 0[, $iH = 0[, $iResizeQual = 7[,
;                  $bReverse = False]]]]])
; Parameters ....: $hImage              - A handle to an image / bitmap object
;                  $sFilename           - A string value. Folders will be created if not existing.
;                  $iJPGQual            - [optional] An integer value. Default is 85.
;                  $iW                  - [optional] An integer value. Default is 0.
;                  $iH                  - [optional] An integer value. Default is 0.
;                  $iResizeQual         - [optional] An integer value. Default is 2.
;                  $bReverse            - [optional] A binary value. Default is False.
; Return values .: True or False on errors
; Author ........: UEZ
; Modified ......:
; Remarks .......: All frames will be extracted whereas the filename will be <filename>_XX.<ext>. XX is the amount of frames. If
;                  $bReverse is set True then the frames will be saved in reverse order. If $iW and $iH are zero then no resizing will be done.
; Related .......: _GDIPlus_EncodersGetCLSID _GDIPlus_ParamInit _GDIPlus_BitmapCreateFromScan0 _GDIPlus_GraphicsSetInterpolationMode _GDIPlus_ImageSaveToFile
; Link ..........:
; ===============================================================================================================================
Func _GDIPlus_GIFAnimExtractAllFrames($hImage, $sFilename, $iJPGQual = 85, $iW = 0, $iH = 0, $iResizeQual = 2, $bReverse = False)
    If $sFilename = "" Then Return SetError(1, @error, 0)
    Local Const $iAnimDimCount = _GDIPlus_GIFAnimGetFrameDimensionsCount($hImage)
    If @error Then Return SetError(2, @error, 0)
    Local Const $tGUID = _GDIPlus_GIFAnimGetFrameDimensionsList($hImage, $iAnimDimCount)
    If @error Then Return SetError(3, @error, 0)
    Local Const $iAnimFrameCount = _GDIPlus_GIFAnimGetFrameCount($hImage, $tGUID)
    If @error Then Return SetError(4, @error, 0)
    Local $sPath = StringRegExpReplace($sFilename, "(.+)\\.+", "$1")
    If StringLen($sPath) > 2 Then
        If Not FileExists($sPath) Then DirCreate($sPath)
    EndIf
    Local $sPrefixList = "jpg,png,bmp,gif,tif,", $sSuffix = StringRight($sFilename, 3)
    If Not StringInStr($sPrefixList, $sSuffix) Or StringMid($sFilename, StringLen($sFilename) - 3, 1) <> "." Then
        $sSuffix = "png"
        $sFilename &= ".png"
    EndIf
    Switch $sSuffix
        Case "jpg"
            Local $sCLSID = _GDIPlus_EncodersGetCLSID("JPG")
            Local $tParams = _GDIPlus_ParamInit(1)
            Local $tData = DllStructCreate("int Quality")
            Local $pData = DllStructGetPtr($tData)
            Local $pParams = DllStructGetPtr($tParams)
            $tData.Quality = $iJPGQual
            _GDIPlus_ParamAdd($tParams, $GDIP_EPGQUALITY, 1, $GDIP_EPTLONG, $pData)
    EndSwitch
    Local $sPrefix = StringTrimRight($sFilename, 4), $hFrame, $iCurrentFrame = 0, $i, $iRet, $hBitmap, $hGfx, $bError = False, $bResize = False
    If ($iW > 0) And ($iH > 0) And ($iW <> _GDIPlus_ImageGetWidth($hImage)) And ($iH <> _GDIPlus_ImageGetHeight($hImage)) Then
        $bResize = True
        $hBitmap = _GDIPlus_BitmapCreateFromScan0($iW, $iH)
        $hGfx = _GDIPlus_ImageGetGraphicsContext($hBitmap)
        _GDIPlus_GraphicsSetInterpolationMode($hGfx, $iResizeQual)
    EndIf
    Local $iFrame
    For $i = 0 To $iAnimFrameCount
        If $bReverse Then
            $iFrame = $iAnimFrameCount - $i
        Else
            $iFrame = $i
        EndIf
        _GDIPlus_GIFAnimSelectActiveFrame($hImage, $tGUID, $i)
        Switch $bResize
            Case False
                $hFrame = $hImage
            Case Else
                _GDIPlus_GraphicsClear($hGfx, 0x00000000)
                _GDIPlus_GraphicsDrawImageRect($hGfx, $hImage, 0, 0, $iW, $iH)
                $hFrame = $hBitmap
        EndSwitch
        Switch $sSuffix
            Case "jpg"
                $iRet = _GDIPlus_ImageSaveToFileEx($hFrame, $sPrefix & "_" & StringFormat("%0" & StringLen(Int($iAnimFrameCount)) & "i." & $sSuffix, $iFrame), $sCLSID, $pParams)
                If Not $iRet Then $bError = True
            Case Else
                $iRet = _GDIPlus_ImageSaveToFile($hFrame, $sPrefix & "_" & StringFormat("%0" & StringLen(Int($iAnimFrameCount)) & "i." & $sSuffix, $iFrame))
                If Not $iRet Then $bError = True
        EndSwitch
    Next
    If $bResize Then
        _GDIPlus_GraphicsDispose($hGfx)
        _GDIPlus_BitmapDispose($hBitmap)
    EndIf
    Return $bError
EndFunc   ;==>_GDIPlus_GIFAnimExtractAllFrames

; #FUNCTION# ====================================================================================================================
; Name ..........: _GDIPlus_GIFAnimCreateFile
; Description ...: Creates a GIF animation file
; Syntax ........: _GDIPlus_GIFAnimCreateFile($aImages, $sFilename[, $iDelay = 100])
; Parameters ....: $aImages             - An array of image handles (animation frames).
;                  $sFilename           - The filename of the GIF animation.
;                  $iDelay              - [optional] An integer value. Default is 100 ms per frame.
; Return values .: True or False on errors
; Author ........: UEZ
; Modified ......:
; Remarks .......: Vista or a higher operating system is required to create a GIF animation!
; Related .......: _GDIPlus_EncodersGetCLSID _GDIPlus_ParamInit _GDIPlus_ParamAdd _GDIPlus_ImageSaveToFileEx
; Link ..........:
; ===============================================================================================================================
Func _GDIPlus_GIFAnimCreateFile($aImages, $sFilename, $iDelay = 100)
    Local Const $GDIP_EVTFrameDimensionTime = 21
    Local $sCLSID = _GDIPlus_EncodersGetCLSID("GIF")
    Local $tMultiFrameParam = DllStructCreate("int;")

    DllStructSetData($tMultiFrameParam, 1, $GDIP_EVTMULTIFRAME)
    Local $tParams = _GDIPlus_ParamInit(1)
    _GDIPlus_ParamAdd($tParams, $GDIP_EPGSAVEFLAG, 1, $GDIP_EPTLONG, DllStructGetPtr($tMultiFrameParam))

    Local $hStream = _WinAPI_CreateStreamOnHGlobal()
    Local $tGUID = _WinAPI_GUIDFromString($sCLSID)
    _GDIPlus_ImageSaveToStream($aImages[1], $hStream, DllStructGetPtr($tGUID), DllStructGetPtr($tParams))

    DllStructSetData($tMultiFrameParam, 1, $GDIP_EVTFRAMEDIMENSIONTIME)
    $tParams = _GDIPlus_ParamInit(1)
    _GDIPlus_ParamAdd($tParams, $GDIP_EPGSAVEFLAG, 1, $GDIP_EPTLONG, DllStructGetPtr($tMultiFrameParam))

    Local $i
    For $i = 2 To $aImages[0] - 1
        _GDIPlus_ImageSaveAddImage($aImages[1], $aImages[$i], $tParams)
    Next

    DllStructSetData($tParams, 1, $GDIP_EVTLASTFRAME)
    $tParams = _GDIPlus_ParamInit(1)
    _GDIPlus_ParamAdd($tParams, $GDIP_EPGSAVEFLAG, 1, $GDIP_EPTLONG, DllStructGetPtr($tMultiFrameParam))
    _GDIPlus_ImageSaveAddImage($aImages[1], $aImages[$i], $tParams)

    DllStructSetData($tParams, 1, $GDIP_EVTFLUSH)
    $tParams = _GDIPlus_ParamInit(1)
    _GDIPlus_ParamAdd($tParams, $GDIP_EPGSAVEFLAG, 1, $GDIP_EPTLONG, DllStructGetPtr($tMultiFrameParam))
    _GDIPlus_ImageSaveAdd($aImages[$i], $tParams)

    Local $hMemory = _WinAPI_GetHGlobalFromStream($hStream)
    Local $iMemSize = _MemGlobalSize($hMemory)
    Local $pMem = _MemGlobalLock($hMemory)
    Local $tData = DllStructCreate("byte[" & $iMemSize & "]", $pMem)
    Local $bData = DllStructGetData($tData, 1)
    _WinAPI_ReleaseStream($hStream)
    _MemGlobalFree($hMemory)

    $bData = StringRegExpReplace($bData, "(?i)(0021F904[[:xdigit:]]{2})[[:xdigit:]]{4}", "${1}" & StringRegExpReplace(Hex(Int($iDelay / 10), 4), "([[:xdigit:]]{2})([[:xdigit:]]{2})", "$2$1"))
    Local $iExtended  = @extended

    Local $hFile = FileOpen($sFilename, 2)
    If @error Then Return SetError(2, 0, False)
    FileWrite($hFile, Binary($bData))
    FileClose($hFile)

    If Not $iExtended Then Return SetError(1, 0, False)
    Return SetExtended($iExtended, True)
EndFunc

Func _GDIPlus_GIFAnimCreateFileFromImageFiles($aFrames, $sGIFFileName, $bReplay = True)
    Local $tagGIFHeader = "byte Header[6];byte Width[2];byte Height[2];byte PackedField[1];byte BackgroundColorIndex[1];byte PixelAspectRatio[1];"
    Local $tGIFHeader_1frame = DllStructCreate($tagGIFHeader & "byte ColorTable[768];")
    Local $hFile = _WinAPI_CreateFile($aFrames[0][0], 2, 2), $nBytes
    _WinAPI_ReadFile($hFile, DllStructGetPtr($tGIFHeader_1frame), DllStructGetSize($tGIFHeader_1frame), $nBytes)
    _WinAPI_CloseHandle($hFile)
    Local $iColorTableSize = 3 * 2^(BitAND($tGIFHeader_1frame.PackedField, 7) + 1)
    Local $tGIFHeader_File = DllStructCreate($tagGIFHeader & "byte ColorTable[" & $iColorTableSize & "];byte ApplicationBlockExtension[18]")
    $tGIFHeader_File.Header = $tGIFHeader_1frame.Header
    $tGIFHeader_File.Width = $tGIFHeader_1frame.Width
    $tGIFHeader_File.Height = $tGIFHeader_1frame.Height
    $tGIFHeader_File.PackedField = $tGIFHeader_1frame.PackedField
    $tGIFHeader_File.BackgroundColorIndex = $tGIFHeader_1frame.BackgroundColorIndex
    $tGIFHeader_File.PixelAspectRatio = $tGIFHeader_1frame.PixelAspectRatio
    $tGIFHeader_File.ColorTable = BinaryMid($tGIFHeader_1frame.ColorTable, 1, $iColorTableSize)
    $tGIFHeader_File.ApplicationBlockExtension = Binary("0x21FF0B4E45545343415045322E3003010000")
    Local $bGIFHeader, $i, $b, $p, $d
    For $i = 1 To 8
        $bGIFHeader &= StringTrimLeft(DllStructGetData($tGIFHeader_File, $i), 2)
    Next

    For $i = 0 To UBound($aFrames) - 1
        $b = Binary(FileRead($aFrames[$i][0]))
        $p = Floor(StringInStr($b, "0021F904") / 2)
        $d = Hex(Dec($aFrames[$i][1] / 10), 4)
        If Not $p Then ContinueLoop
        $bGIFHeader &= StringMid(StringRegExpReplace(BinaryMid($b, $p, BinaryLen($b) - $p - 1), "(?i)0021F904([[:xdigit:]]{2})([[:xdigit:]]{4})(.*)", "0021F904${1}" & StringRight($d, 2) & StringLeft($d, 2) & "$3"), 3)
    Next

    $hFile = FileOpen($sGIFFileName, 18)
    FileWrite($hFile, Binary("0x" & $bGIFHeader & "3B"))
    FileClose($hFile)
EndFunc

; #FUNCTION# ====================================================================================================================
; Name ..........: _GDIPlus_BitmapConvertTo8Bit
; Description ...: Converts a bitmap to a 8-bit image
; Syntax ........: _GDIPlus_BitmapConvertTo8Bit(Byref $hBitmap[, $iColorCount = 253[,$iDitherType = $GDIP_DitherTypeDualSpiral8x8[,
;                  $iPaletteType = $GDIP_PaletteTypeFixedHalftone252,[$bUseTransparentColor = True]]]])
; Parameters ....: $hBitmap              - A handle to an image / bitmap object
;                  $iColorCount          - [optional] An integer value. Default is 253.
;                  $iDitherType          - [optional] An integer value. Default is $GDIP_DitherTypeDualSpiral8x8. -> http://msdn.microsoft.com/en-us/library/ms534106(v=vs.85).aspx
;                  $iPaletteType         - [optional] An integer value. Default is $GDIP_PaletteTypeFixedHalftone252 . -> http://msdn.microsoft.com/en-us/library/ms534159(v=vs.85).aspx
;                  $bUseTransparentColor - [optional]  A binary value. Default is True.
; Return values .: True or False on errors
; Author ........: UEZ
; Modified ......:
; Remarks .......: Vista or a higher operating system is required
; Related .......: _GDIPlus_PaletteInitialize _GDIPlus_BitmapConvertFormat _GDIPlus_ImageLoadFromFile _GDIPlus_BitmapCreateFromScan0
; Link ..........: http://msdn.microsoft.com/en-us/library/windows/desktop/ms534106(v=vs.85).aspx)
; ===============================================================================================================================
Func _GDIPlus_BitmapConvertTo8Bit(ByRef $hBitmap, $iColorCount = 253, $iDitherType = $GDIP_DitherTypeDualSpiral8x8, $iPaletteType = $GDIP_PaletteTypeFixedHalftone252, $bUseTransparentColor = True)
    $iColorCount = ($iColorCount > 2^8) ? 2^8 - 3 : $iColorCount
    Local $tPalette = _GDIPlus_PaletteInitialize($iColorCount, $iPaletteType, 0, $bUseTransparentColor, $hBitmap)
    If @error Then Return SetError(1, @error, 0)
    Local $iRet = _GDIPlus_BitmapConvertFormat($hBitmap, $GDIP_PXF08INDEXED, $iDitherType, $iPaletteType, $tPalette)
    If @error Then Return SetError(2, @error, 0)
    Return $iRet
EndFunc   ;==>_GDIPlus_BitmapConvertTo8Bit

Func _GDIPlus_BitmapConvertToXBit(ByRef $hBitmap, $iColorCount = 16, $iPixelFormat = $GDIP_PXF04INDEXED, $iDitherType = $GDIP_DitherTypeDualSpiral8x8, $iPaletteType = $GDIP_PaletteTypeFixedHalftone252, $bUseTransparentColor = False)
    Switch $iPixelFormat
        Case $GDIP_PXF08INDEXED
            $iColorCount = ($iColorCount > 2^8) ? 2^8 : $iColorCount
        Case $GDIP_PXF04INDEXED
            $iColorCount = ($iColorCount > 2^4) ? 2^4 : $iColorCount
        Case $GDIP_PXF01INDEXED
            $iPaletteType = $GDIP_PaletteTypeFixedBW
            $iColorCount = 2
        Case Else
            $iPixelFormat = $GDIP_PXF04INDEXED
            $iColorCount = 16
            $iDitherType = $GDIP_DitherTypeDualSpiral8x8
            $iPaletteType = $GDIP_PaletteTypeFixedHalftone252
    EndSwitch
    Local $tPalette = _GDIPlus_PaletteInitialize($iColorCount, $iPaletteType, $iColorCount, $bUseTransparentColor, $hBitmap)
    If @error Then Return SetError(1, @error, 0)
    Local $iRet = _GDIPlus_BitmapConvertFormat($hBitmap, $iPixelFormat, $iDitherType, $iPaletteType, $tPalette)
    If @error Then Return SetError(2, @error, 0)
    Return $iRet
EndFunc   ;==>_GDIPlus_BitmapConvertToXBit

; #FUNCTION# ====================================================================================================================
; Name ..........: _GDIPlus_ImageSaveAddImage
; Description ...: Adds a frame to a file or stream specified in a previous call to the _GDIP_SaveImageToFile or _GDIP_SaveImageToStream functions.
; Syntax ........: _GDIPlus_ImageSaveAddImage($hImage, $hImageFrame, $tParams)
; Parameters ....: $hImage              - A handle to an image object.
;                  $hImageFrame         - A handle to an image object that holds the frame to be added.
;                  $tParams             - A dll struct to an EncoderParameters structure that holds parameters required by the image encoder
;                                         used by the save-add operation.
; Return values .: True or False on errors
; Author ........: UEZ
; Modified ......:
; Remarks .......:
; Related .......: _GDIPlus_ImageSaveAdd _GDIPlus_ParamInit _GDIP_SaveImageToFile _GDIP_SaveImageToStream _GDIPlus_ImageLoadFromFile _GDIPlus_BitmapCreateFromScan0
; ===============================================================================================================================
Func _GDIPlus_ImageSaveAddImage($hImage, $hImageFrame, $tParams)
    Local $aResult = DllCall($__g_hGDIPDll, "int", "GdipSaveAddImage", "handle", $hImage, "handle", $hImageFrame, "struct*", $tParams)
    If @error Then Return SetError(@error, @extended, False)
    If $aResult[0] Then Return SetError(10, $aResult[0], False)
    Return True
EndFunc   ;==>_GDIPlus_ImageSaveAddImage

; #FUNCTION# ====================================================================================================================
; Name ..........: _GDIPlus_ImageSaveAdd
; Description ...: Adds a frame to a file or stream specified in a previous call to the _GDIP_SaveImageToFile or _GDIP_SaveImageToStream functions.
;                  Use this method to save selected frames from a multiple-frame image to another multiple-frame image.
; Syntax ........: _GDIPlus_ImageSaveAdd($hImage, $tParams)
; Parameters ....: $hImage              - A handle to an image object.
;                  $tParams             - A dll struct to a encoder parameter list structure ($tagGDIPENCODERPARAMS).
; Return values .: True or False on errors
; Author ........: UEZ
; Modified ......:
; Remarks .......:
; Related .......: _GDIP_SaveImageToFile _GDIP_SaveImageToStream _GDIPlus_ParamInit _GDIPlus_ImageLoadFromFile _GDIPlus_BitmapCreateFromScan0
; ===============================================================================================================================
Func _GDIPlus_ImageSaveAdd($hImage, $tParams)
    Local $aResult
    $aResult = DllCall($__g_hGDIPDll, "int", "GdipSaveAdd", "handle", $hImage, "struct*", $tParams)
    If @error Then Return SetError(@error, @extended, False)
    If $aResult[0] Then Return SetError(10, $aResult[0], False)
    Return True
EndFunc   ;==>_GDIPlus_ImageSaveAdd
#EndRegion

It plays a GIF anim from the memory in the button control. The _GDIPlus_GIFAnim UDF is unfinished yet and not fully tested!

Br,

UEZ

Edited by UEZ
  • Like 1

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

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  

×