EKY32 Posted August 10, 2014 Share Posted August 10, 2014 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. expandcollapse popup;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] Link to comment Share on other sites More sharing options...
t1ck3ts Posted August 10, 2014 Share Posted August 10, 2014 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) Link to comment Share on other sites More sharing options...
EKY32 Posted August 11, 2014 Author Share Posted August 11, 2014 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] Link to comment Share on other sites More sharing options...
Solution UEZ Posted August 25, 2014 Solution Share Posted August 25, 2014 (edited) Try this: expandcollapse popup#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 &= 'MwgEbOFBUxYkOijW4CF04KApGyrGBBySNdxiqwKTdKQ68BNAgh6eIpQHacUWL8RllwYEACH5BAUEANwALAsAEQAcABwAAAj/ALkJHEiQIAAAw3RpK8iw4cCDAA6AqINIicOLDwHc6nOCBIoBGDEeTPBCQBQSIJqFdHgQ14wTAixAWsnyIKo3birSvHjQmK+dQIMKHUq0qNGjSAsqkpD0GSdDIxIcBaDpDQQsHW4VPTiJgoCYB7YC4NECgQAXccRGANEiDog5GRXpSmKA4SWDB4ElUIX3yKZKIDJJFdgqEogAsjIeLAhAV4o1YiiYASFVwiMVAlBgeRASgCsSWxCMkMKikS1TgagIWODCFje4LA+w2CLla4kOSCLYwCKA24ZjnRMUMiEFQZUUNYiUCoBhRYxQAFZW2NFmAYItZnLIQnigQKzoNBtAFurAAg8IH5whgt85AZOPTgl2JYVDMCAAIfkEBQQA3AAsCwARAB0AHAAACP8AuQkcSLAgNwAADOhiZLChQ4EIV4HgAELBw4sQATgDsYLECRCOMD5EOIEGlQVYOOgS6RBhshwUsKBoJIJlSwBGsMQAwcrmSAAPKszxSbSo0aNIkyo1GuZUhKUCHYBwYUeIUoSQUIwYYWdCUgAhQHARIMBFg68AuLkpkSXGBbRWCHwIkMJmqQixShFEiFBO2r0A5vwd2ItHDA4BjAEePBDArAMECCRgKJAABRIkVIQSCcDJhg4v2gQaUuxgAAhkIUTi3GnEGC0kUgRKcHCThRMjNljEyGiAhRFkqajwdA2ArUcvaABh7NDaDhYQEAgY4WKHBgAiFJmqgJDzkBkpyJ4j2EBAwkG+zB862ZFhhQoXIFYpdUAARIAAqxgsfTDLwVuBAQEAIfkEBQQA3AAsDAARABwAHAAACP8AuQkcSLCgQAAALOlCZrChQ24Ib4HgACLBw4sQAVxrRIEEhA8XMDpEuIsDFgFUYJgS2RChJRBiokAA4YFlSwAJqMQQpMrmyIStHPkcSrSoSABGhyL1+aBApj4Skh7s4UIFhgFSAcjpc0KAiT6tkgJgxFWAADwTjCIEsCHOiRd6sgJ4NiQTiKgGl3K7QCAHgQoF1wq+eCmABS0vONxEGHitwCUcqKCsYYWlIlFDCiTQIJDVhioCqoyxJHKQJAR3uHXYAfjBJAtjNhRgueQDixMlUsTxpAbABU1AEuh9iFPFFgTcEFjIMUHwcOIJ+ogRwE0Aig4NIMJ5fhHWBwgkBJAjsAACl1FHPmysMDEmRg9gSS94AnEDhKdbUrlda5BAVEhuAQEAIfkEBQQA3AAsDAARABwAHAAACP8AuQkcSLAgQQAALvEyYLChQ24IT4HgYEPBw4sQARQLwIbECRDKMDpE2OQGCQEC4uQS2RDhsA8UEJD4cIllSwCasNgBYdHmzQuwrvkcSrToRUu7aholaKQRjC6ylkK8QAgCCRMgpALIJUOKACoxNBhFuGvGAgEQQIQYi/BABws1AlycgElShJsAJrB6dXEWCDYWBMEyiLAwxkhmUKr4pHWABSwCKOTwaU3RwQQbTqSgcYRlBQKQGkmqIBBhkEaTTgEQyYeAADAqXvCYlbHwapG1ClGgIkCKi0+MbCNkKYsDNwTc0ILoXNSvihPcoJjok8Aoo00vFiCQQiGQq7ENQNAagUChzyNWD2+PFJWpBg0doRhoTaIggSz5AQEAIfkEBQQA3AAsDQARABsAHAAACP8AuQkcSLBgQQAAPFTIZrChQ4QJPvQJMMuhRYEIHcSgQIJCgIsWER5wQUIAFhClQDZEiOoFFSorBqh8OEHFigwBlMx82KeHAgA7gwq9liCSBVFCCy4bwMZCmx5JBwI49aKKgBQgrkVFKCoOCSwkbGhNivDCBwskXsg0CCACJiNzVmaEpMOCsoZDarTJsOkhQgDYHMrBAUGAlBdM/CJ0yKvDFCoCZDiIyg0AswBjEFgA8Yxy5QqfQGSqNVMCEU9BLkj9u1glkDoscBZZ' $GIF_Anim &= '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' $GIF_Anim &= 'I8MJAUhT0BjFDZOLBQJICBAKoJOdo1FZgMAF4EggLwtYbKKaoAaFBRTGgGAKAMABGh8GZHwJwFEGGjVoQCKijVvbv22pogFQQVasMAQHt0UjdODfggD8Pn4ozFbjyB7VEAgUY8uFxh4VtFhQwgIp0BAlrUAABUsA1A+NyChRhQIBzLAJAihAg0aAVrhzO27V6FJg4boBH0cOczLz542TJWjwDLrACyAEtMjhwXoQFkjXkCEKLlw1Am4CcpDP3UAGiiotPq3PXaADjRy25uf25QDZ/IAAIfkEBQQA3AAsEQAQAB0AHAAACP8AuQkcSLCgQYGlDAAo+CqBqAcHIyZLQCATgQYLuRVB1MJFAIgRCfYihcPFGzwgRAkkQGEEAgyhQg4EkCDPmAULtrDIpAEAJAgCBKzoJFPgg08WsAQVCsIBAE14uFDgcKQot2IB2JxAIABBGxBJAAAYEgDEKrFFARRwAQGLlC12CjwTSzdjWlxUOKxowSFSLYF17coUASDCAR6ZDlQoKLhgGCfFGNO1ShAVhzw2KFCWqYGGFwRVaIDcbDBCGwRcY/gifdAAiDFQxoAIwfqgERB9EMVqXJsbgBC8QqDtLbku8eLHkytfbmB0SN4Hh5RYAAQ6a1FxFkCAEcT65gIqUG8gCeCdcgIKVEh42TGZ+LQcLGTcENWe+DVXQzAOV17fYEAAIfkEBQQA3AAsEgAPABwAHAAACP8AuQFAIikBt4MIEypciBAIHgsyCDCcyO0CrFqMDg4DgUUAFQ4XKCa0IiQAiACkYFUkxEWAlBgTRB405tACBQswBlwAsKPFCQsImsnkRusRNwECEFBI5ArAnh4gCOycKOIgmgQIsJBAIAACByEAwooFIPPqChMeqaAAYVAsGrJDm1DJgAVBChefWslEJquJQgCxIMW48YGAA5mwQLjoA+IvsFMJTimDS1FHigUI4uAZSlEECDFIwRDhTJGABS0QQCihTDqhBFKEApwK23rhWLG1bY/NzRA379/AgwsfznlOgSogWA0fBWMFiUARWOfmQWGBgBUFaP/OpCIKlC2ctPMUtgViRYoP0aXXbsWpUy7xwHdTDAgAIfkEBQQA3AAsEgANAB0AHQAACP8AuXGzkmBIBIEIEypcmFBZADMWYsRiSJFiggxSBEBoVLFjQlcsFiBY0MUjwgcREiiYxUygiAkdUJBgU8AkN10FOoC4UemAB24AADQY8MhTUI/FIuEZA0FFnA8JBAadCsDkqS0UMkLgsmHAA6BUbR7Ac0IAFm4mNnyK1lHJgQMXFCbQSEUAAgo1DnScIADDiw9LEvYiQCMFFgs3Mk3oKKmFCQErRii8MCQAiFScbFWt2GmMAAEpMm1GCEBDBWGjKzqosQVFHAWpgdokLYsAFCNHZ1Okmlv3Qt4mY/seTry4VN3CFSY3zjzh8t8mK/TYIuRKc25qMqngMkZHb+IXApEhEEAlw4TnJuXYeEwlj+bmkmCYcLHpe3EkBIRImHodeMeAACH5BAUEANwALBMACwAcAB4AAAj/ALlx29XAlMCDCBMqROgARAYOnhZKlLhDBRUSGWpN3CgQGwgIAgSMWcVxIwACFhYswOCg5EQAu3hw2ILAJTcPrBIkUCBMIICfvHT9LOlgE4c/NEB0ouXz51COERx6QcAFw4ZODyROCsAjFLOEkSyA5EaFG4wAFRa+AsEiBZ6IBxkJmBoSARY7kHotFCWDhN8bjBDuYIEgZBcMixJIbBCHigASIBgwZMvGxQ0QBwIvHLSDTQsOoQAkVIKJUg9MsERPfJBggZGnCZ2WdCrbpkTatnOLyM27d8ndvoMLH26TARziAkFhAOFKdfAEGcYs2HDKee9NYAQg0EIANm8hFk4IHEjR3To34CUvBIjjAsQE77wvoErQCn5v2uYlBgQAIfkEBQQA3AAsEwAJABwAHwAACP8AuQkMoUigwYMIEyI0EgAEAQYKIyqsAAIFFwueJGo0mMDMCAECAgHYqFGWjAUC' $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 #EndRegionIt 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 August 25, 2014 by UEZ toasterking 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!¯\_(ツ)_/¯ ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ Link to comment Share on other sites More sharing options...
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