Jump to content

[trancexx GIF UDF] Prevent $WS_EX_LAYOUTRTL from flipping images


EKY32
 Share

Go to solution Solved by UEZ,

Recommended Posts

Hello, all the images in the GUI or ListView are being inverted (flipped) when I use $WS_EX_LAYOUTRTL, is there anyway to avoid that please? at least for specific image controls.

THANKS.

#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include "D:\AutoIt3\Samples\GIF\GIFAnimation.au3"

$Form1 = GUICreate("My RTL GUI", 435, 167, 192, 124, default, $WS_EX_LAYOUTRTL)
$Pic1 = _GUICtrlCreateGIF("animation.gif", 1, 144, 40, 145, 49)
$Label1 = GUICtrlCreateLabel("This image should not be flipped", 136, 112, 156, 17)
GUISetState(@SW_SHOW)


While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit

    EndSwitch
WEnd
Edited by EKY32

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

Link to comment
Share on other sites

I'm sorry UEZ, forgot to mention that this is happening when I use GIFAnimation UDF made by trancexx.

MSa8FT.png

Everything is fine with PNG and other formats using the same UDF, but GIF images are being flipped.

Thanks.

Edited by EKY32

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

Link to comment
Share on other sites

  • Solution

I stopped working on this:

_GDIPlus_GIFAnim.au3

;coded by UEZ build 2014-06-10
;requires 3.3.11.5+

#include-once
#include <GDIPlus.au3>
#include <Memory.au3>

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

_GDIPlus_GIFAnim Example Play Anim.au3

#AutoIt3Wrapper_UseX64=n

#include <Array.au3>
#include <WindowsConstants.au3>
#include "_GDIPlus_GIFAnim.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("GIF Anim UDF Example", $iW, $iH)
Global Const $iPic = GUICtrlCreatePic("", 0, 0, $iW, $iH)
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("PlayAnimPreview", 10)

Do
    If GUIGetMsg() = -3 Then ;$GUI_EVENT_CLOSE = -3
        AdlibUnRegister("PlayAnimPreview")
        _GDIPlus_BitmapDispose($hGIFImage)
        _GDIPlus_Shutdown()
        GUIDelete()
        $binGIFAnim = 0
        Exit
    EndIf
Until False

Func PlayAnimPreview()
    AdlibUnRegister("PlayAnimPreview")
    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($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("PlayAnimPreview", 10)
EndFunc   ;==>PlayAnimPreview


;Code below was generated by: 'File to Base64 String' Code Generator v1.15 Build 2014-04-30

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 &= 'qGOOG/S4QQcbuAhfDMNdll1bNAIA2oY3ArDjjj76KOQRJBrZ3102hqVkch9KiAWF/LmU2FocaslbeyC+SCSYVy6gyljQcdlimkPCeNuB2LX5JgdxshcinRNmR2GeM7qZ3nFyAjdnFnQ1aiVNSbZ15p+LYuEoeWGu09+k71UqQ2pghnogcedBtKWfU84AqqihUmBhEA7e1+mfUbBaohmnfkcprVDYqtUOseo6q5raMMipovoVm0OwsgJngAHEFsusb38+G23/LtM2m4K1dSqrXnRzcuutarmy6Cy03VJkX7jojrtpbBFE8Oy89M5LYLoJ8RZvvfyi66W734LGbbzx1kDvvQAbi8DABBtsL6DuOshwwZ4BcDDE40qMLsER3HPxv9LmOnHHM23rb7IhizayqdyCjK3IGze8mMktoxwPzClwjNfHNid0sc7dmoywMzTHTPFTNV8LrMVGk4xT0vgKITQAQD99stK4Mhzt1C77HPPWTA/98sr4ct0zI1NXvWzYGBNN59FLQ03Re3BbLfYr99a9ttxu0+103FdHbUTef9vd9s1+g833y35xq3jgcyfguOBmY710qoZ3jbYKnu4NOd4AaLa4Wud3by7655mfjcVqDwwrOCXP6g1S6K0ja7nJspeRn+ZLo7m571DsrvoRywVPZwMNWN6fbYMfn/zrCVMCAQR+aaZ8xABMX/0D12cMYufR4wR8+LAGR/7lswQRAgAh+QQJAAAUACwqAA4ATABoAAAG/0CKcEgkAo7I5LHIbDqf0KhTSQVIr9jstMrVer9PbhdM/gYCx0JBrCy7r+f0mo1828NItb5w3quTTBOCg4SFE3dNSX58AYuARYaRg4hEcUoEmASWY0KShJRPm0iZmmhiRJ6ToE2iSWevplSohatwsUqwrXVDhrVSunRtkIdlH8YfICBawMG7s27HyMpZogzW19icvMRfxsnJ0VjV2OTandxe3t/hWVQLC0kDA+bbn1Hq3/nfWO7wSPL0ztmDgk9fPn7/Brx7J++drCeCsBRMxuRglHgKFzb098hJxCsTpxGxKOXIOwcoHSz059BKlIFFQpIsQvEigJMpV5r0JwUmEf+Z+5rUhLLzwIGVOp1BRPdT2lCaIr0UPYq05ZKXTIcUdPJUy86qVl32zLrV11ewHbEyKevm0ZEGDXYKmCsg7NWxI4N2lbrrbdybC+jW5agUykchFvciTOoX7tmWCiIrYPPMLOCwcB1fXnhE8uRT23xROCtBQuO/RlMfSOL5LMqrHw/fIW0aQGbUqlcjab35tcvYWdtuLk0FgfHjCZIr7/fuwYPIRwTdpUS7+HHjypcrWekcOgDpYqkDcF66fO3r17OrT3DE/NwkjMMLJ2/+PHrs67W7FwCfc+Ey7UkQ1n3p5ZcdFbzVV5sdAQ5IIH4GJoegZAGaNx0ZDfrzYIEGBgP/Fk9vZHjEhshF6CFa8oEhIgAkQqjeEQYYcOEQAakIQGkttYhAhwDEOKMQNX6x04jHbbDBg+sdkZyPKYpmBGBEGmckki8CsKSMTTq5onFHGGmkBmCG6aWXSrKXpZOj3Sighgh06WWYYo65QZk/opkmjoRlkEES9yVppZl2JqJmWHryiZ6fEp6p5WZHFOpSlCUe+GedaJ7V6J6PsnholYkGyoSlSkHqYqKdevpkfE/2ySmgphbxUKqbSlpqqzQKAyuH2s1K6xWi7rgqpbt+qimupLIabEnDRpprAkwea5OqsjKLpbNEJTuqds1SuwW0VWar7a2xdjvtt+ASi+245PYa/0EEMa4XI5O6Oqsuuwa4+y6digYKKZPrrkvFu1jGu+u+WPYbwb/3Tprvotfx2+90MCYssKkEH2EwxD1KbGyrFQNwcZYR4xtsxx9vAe/G+ibrsL+KRnwysKCQ/HDLGb+8MCIuFzwzQjZTXLPOLPMcMMqLrnzwzbX27GnIHu/cTsYicwx10zALqnTKDlct7NV2Ml3y01xXOvXXQkftc6JB8xX2omgfLeTU'
    $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 &= '3IupAGQIAQQ0IcdvACUpLN30A0+/AMmtxklv5XPWAAECzTXGLIQAAAA7'
    $GIF_Anim = _WinAPI_Base64Decode($GIF_Anim)
    Local $tSource = DllStructCreate('byte[' & BinaryLen($GIF_Anim) & ']')
    DllStructSetData($tSource, 1, $GIF_Anim)
    Local $tDecompress
    _WinAPI_LZNTDecompress($tSource, $tDecompress, 17546)
    $tSource = 0
    Local $bString = Binary(DllStructGetData($tDecompress, 1))
    If $bSaveBinary Then
        Local $hFile = FileOpen($sSavePath & "\BruceLee_128x128.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

Func _WinAPI_LZNTDecompress(ByRef $tInput, ByRef $tOutput, $iBufferSize)
    $tOutput = DllStructCreate("byte[" & $iBufferSize & "]")
    If @error Then Return SetError(1, 0, 0)
    Local $aRet = DllCall("ntdll.dll", "uint", "RtlDecompressBuffer", "ushort", 0x0002, "struct*", $tOutput, "ulong", $iBufferSize, "struct*", $tInput, "ulong", DllStructGetSize($tInput), "ulong*", 0)
    If @error Then Return SetError(2, 0, 0)
    If $aRet[0] Then Return SetError(3, $aRet[0], 0)
    Return $aRet[6]
EndFunc   ;==>_WinAPI_LZNTDecompress

It seems to work with RTL.

Edit: EKY32, did you remember this topic: ;)

 

Br,

UEZ

Edited by UEZ

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

Selection of finest graphical examples at Codepen.io

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

Link to comment
Share on other sites

Create an account or sign in to comment

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

Create an account

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

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

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