EKY32 Posted December 16, 2014 Posted December 16, 2014 (edited) 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 December 16, 2014 by EKY32 [font="'trebuchet ms', helvetica, sans-serif;"]Please mark the answer of your question if you found it.[/font]
UEZ Posted December 16, 2014 Posted December 16, 2014 For me it looks ok - no image flipping.Br,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!¯\_(ツ)_/¯ ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ
EKY32 Posted December 16, 2014 Author Posted December 16, 2014 (edited) I'm sorry UEZ, forgot to mention that this is happening when I use GIFAnimation UDF made by trancexx. Everything is fine with PNG and other formats using the same UDF, but GIF images are being flipped. Thanks. Edited December 16, 2014 by EKY32 [font="'trebuchet ms', helvetica, sans-serif;"]Please mark the answer of your question if you found it.[/font]
EKY32 Posted December 17, 2014 Author Posted December 17, 2014 Is there any other Gif UDF that don't cause this problem, please? [font="'trebuchet ms', helvetica, sans-serif;"]Please mark the answer of your question if you found it.[/font]
Solution UEZ Posted December 17, 2014 Solution Posted December 17, 2014 (edited) I stopped working on this:_GDIPlus_GIFAnim.au3expandcollapse popup;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.au3expandcollapse popup#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 &= '+gOuw86w7AAm0K56lUxu1QAK1a2QVTumwQBrNXzkxX9IsAAvT0Bvr/RNUACv8vXYZ6/99gDcd+/99+CHLyD++PMEAQFFCTIDsEQCRVQAdAAAAgByhI+py+0PowCctNqLs968+wAPhuJIluaJpgDqyrbuC8fyTADX9o3n+s73/gAPDAqHxKLxiABMKpfMpvMJjQBKp9Sq9YrNagC33K73Cw6LxwDksvmMTqvX7AC2+w2Py+f0ugD9js/r9/y+/wAPGCg4SFhoeACImKi4yNjo+AwoURCtYAgKABQAACwGAAwAWABqAAAABf8gJY5kAGmeaJoCbOuyAGosz3RNvThgAO98T+ZAnW9IAEQFc8VkMRBgABUKR5dyumM6AKFRGHUrcz2/AAUm+Cnlmk3eALF4XD6frS+CAJwAB7rd9dacAN4M3t99OEyDAIEvf2Z5LoSJAC2HXIxZZVptAI41kJGTQpSVADN5DJ+goXY3AC0LpgtanDKeAKGtoy6nqEKqADM4pi4DA68AABISsam0MbayACy5u72/s8EqALgDsbm3hiMsAMgLDg7Ay0YtANCn3Tg/vL7WANjK2isAptfXAMnRIiymvfISANnnJ/Dk7Kf4AJnx8/Tm7KFJALfgwIFYyYDBAEJYT+A7ggYRAO5rNK0UQ2UTADJqvMCxI0dHAPhMCRCQMGC4AGQkNP9u9NgRACRBkSQnNqyIAJKCyowsOzZoAJDRJcyaXQBcANNyc0JOjjt7AB7CNxKoMKHlAFKuPHpUxEcuACFlShtYUyVVAKpWL5jJGg3cAL2Xskx4ZUnLAKBbtwniyo17AIQDB3cl1npsAPsW7ly5de+mAE2Bk+0dFwgSACP4y7gxY7szAEUU3nu4heLFAI4zP+YQeYRSADeILyvWHNeAAOnTc82q+HwmALRozJpPowa8ADXG1S0sXr+OAH16FI/bVHLrAL7M27TvHqyTAAgfnph3Zx/JAIssZ+7cJFbrAEGZi9a8qTX2AKfaiWfujhuAAAIFz88mFq5BAMPuvxs2sKD7AF25efT11SNgAO9+O3z5AND3AAcL552nmn7rAAGQQf8GLLTnAKAG8UW4AX3pANlXIH7kVXQZAAsLNvgghBJOAJhAhmO1MM9IAFkk2KFl/qUWAOCI+U3hwokCAKS4n4IMsiieAIsCqpLVTtT8ANMLZDhm8h6PADDS8mMDQQpJAOSKDx1JW4+cAGTlwk4SmUJkADhS0kdlJVa2AIBllltq2OKUAEkG48KFWQzUACVt56xZYJslAEzXXGMVLkWRAA12wiaXcTHqAJknl2eWZsCgAA5t8yagiRLRACdjjDbqw6N/AEUqKQ+UzmXpAKU09HknkohKAOqpn16mySkzAABox9h8pp6qACh1f7Eaqj19AEYQgWy49vbiAKzL1HprrrjKABponKkqBqitALbiIJuwrhKaANixyCqr65ecAE4Hbf+yyrCwAOyuw6pZ7LOHAAKAbAQKAbAtALWNWhvuuDNpABsuuomqywK7ANa5y+yl8oobAO137gIKrzb5ANKL6rmtCtTvALr7dmruuwXTALrwteQGai+3AKIuPG/CNUz8AG+vFuuLLZ8dAG8McMcf76BxAMPEQjvrybx6AAcxoix3OyDJABgr7C/KDtNXADLIN7dcos4RAGMaMs7EAg3zANA+e2d0tzG7ACrszrUgLbOeAEvzzHDSoL0IAGieTZ/K6tYSAEvdLCmsihxOAM9Tu1Q20XWKAI0vAA88gLbNAFenXVncc0edAHe8cD9Q6soLAENtcN9/T+2uAOA5x2r32maDAPmii5M+DqdDAMcJTR+Qdpd3AKDlMGI+tn0QAEAQVxzcWDfLAELooz9QutOSADf+OTqrZv46gNm1zW5yDiEFQ1ATACwsAENMAUMGCP/AiYCQTgDIpP8/EmlsOp/QqPS4rE6v2Cyxyk1qv2BjtxsuawMBZKEwXprfUbSa3fbC7+Lkel9A89dKeIJUc3x+f4GDb3JL' $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 &= '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_LZNTDecompressIt seems to work with RTL.Edit: EKY32, did you remember this topic: Br,UEZ Edited December 17, 2014 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!¯\_(ツ)_/¯ ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ
EKY32 Posted December 17, 2014 Author Posted December 17, 2014 Edit: EKY32, did you remember this topic: That's it, sure I do! You're the master coder. [font="'trebuchet ms', helvetica, sans-serif;"]Please mark the answer of your question if you found it.[/font]
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now