Jump to content
Belini

Indicação de UDF para usar Gif na Gui

Recommended Posts

Estou precisando de uma UDF simples mas que funcione bem para colocar gif numa gui, sugestões favor postar aqui.

Share this post


Link to post
Share on other sites

Olá Belini.

   Achei que vc já tivesse alguma.

   Segue a que eu uso. Só precisa ajustar o tamanho da janela ao tamanho do gif (se necessário).

#include <GUIConstants.au3>
#include "GIFAnimation.au3"
#include <FileConstants.au3>
#include <WindowsConstants.au3>

Local $sPastaDestino = @ScriptDir, $sArquivoGIF = "\Hello.gif"
If @Compiled Then
   $sPastaDestino = @TempDir
   FileInstall(@ScriptDir & $sArquivoGIF, $sPastaDestino & $sArquivoGIF, $FC_OVERWRITE)
Else
   If not FileExists($sPastaDestino & $sArquivoGIF) Then
      ConsoleWrite("GIF não existe" & @CRLF)
      Exit
   EndIf
EndIf
Local $hWnd_Janela = GUICreate("Atualizando multimídia...", 220, 206, -1, -1, $WS_EX_TOOLWINDOW)
Local $hGIF = _GUICtrlCreateGIF($sPastaDestino & $sArquivoGIF, "", 0, 0)
If not @error Then
   GUISetState(@SW_SHOW)
   Sleep(5000)
   _GIF_DeleteGIF($hGIF)
EndIf
GUIDelete($hWnd_Janela)
If @Compiled Then FileDelete($sPastaDestino & $sArquivoGIF)

 

Hello.gif

GIFAnimation.au3

  • Thanks 1

Share this post


Link to post
Share on other sites
Quote

 Achei que vc já tivesse alguma.

Tenho várias inclusive esta que vc postou mas todas dão flickers na tela com a imagem que preciso usar, apenas uma deu certo e nela tem como controlar até a velocidade porém não consegui redimensionar para o tamanho que quero colocar na gui, vou postar ela aqui prá ver se tem como adicionar o recurso de redimensionamento que falta ou talvez vc saiba de alguma outra que não dê estas oscilações na tela.

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>
#include <WinAPI.au3>

Global $hImage, $hBitmap, $hScrDC, $hMemDC, $tSize, $pSize, $tSource, $pSource, $tBlend, $pBlend
Global $Gif, $GFC, $GFDC, $pDimensionIDs, $tDL, $count = 0, $i = 0

$hGUI = GUICreate("Gif Animation", 100, 100, 100, 100, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOOLWINDOW, $WS_EX_TOPMOST))
GUISetState()

$Gif = @ScriptDir & "\Image.gif"

GifInit()

AdlibRegister("Gif_animate", 20)
HotKeySet("{Esc}", "Quit")

While 1
sleep(1000)
WEnd

func Gif_animate()
    $count +=1
    if $count >= 5 then
    $i += 1
    $count = 0
else
    If $i = $GFC Then $i = 0
    GifDrawFrame($i)
    endif
endfunc

Func Quit()
 _GDIPlus_ImageDispose($hImage)
 _WinAPI_ReleaseDC(0, $hScrDC)
 _WinAPI_DeleteObject($hBitmap)
 _WinAPI_DeleteDC($hMemDC)
 _GDIPlus_Shutdown()
 HotKeySet("{Esc}")
 Exit
EndFunc

Func GifDrawFrame($i)
    DllCall($ghGDIPDll, "int", "GdipImageSelectActiveFrame", "ptr", $hImage, "ptr", $pDimensionIDs, "int", $i)
    $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    $hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
    _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
EndFunc

Func GifInit()
 _GDIPlus_Startup()
 $hImage = _GDIPlus_ImageLoadFromFile($Gif)
 $ApW = _GDIPlus_ImageGetWidth($hImage)
 $ApH = _GDIPlus_ImageGetHeight($hImage)
 $hScrDC = _WinAPI_GetDC($hGUI)
 $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
 $tSize = DllStructCreate($tagSIZE)
 DllStructSetData($tSize, "X", $ApW)
 DllStructSetData($tSize, "Y", $ApH)
 $pSize = DllStructGetPtr($tSize)
 $tSource = DllStructCreate($tagPOINT)
 $pSource = DllStructGetPtr($tSource)
 $tBlend = DllStructCreate($tagBLENDFUNCTION)
 DllStructSetData($tBlend, "Alpha", 255)
 DllStructSetData($tBlend, "Format", 1)
 $pBlend = DllStructGetPtr($tBlend)
 $tDL = DllStructCreate($tagGUID)
 $pDimensionIDs = DllStructGetPtr($tDL)
 $GFDC = DllCall($ghGDIPDll, "int", "GdipImageGetFrameDimensionsCount", "ptr", $hImage, "int*", 0)
 DllCall($ghGDIPDll, "int", "GdipImageGetFrameDimensionsList", "ptr", $hImage, "ptr", $pDimensionIDs, "int", $GFDC[2])
 $GFC = DllCall($ghGDIPDll, "int", "GdipImageGetFrameCount", "int", $hImage, "ptr", $pDimensionIDs, "int*", 0)
 $GFC = $GFC[3]
EndFunc

 

Gif_Animation.rar

Share this post


Link to post
Share on other sites

Está dando erro na variável 

ghGDIPDll

Provavelmente, vc esqueceu de "abrir" a DLL adequada a ser armazenada em ghGDIPDll

Share this post


Link to post
Share on other sites
5 hours ago, Belini said:

mas todas dão flickers na tela

Como assim, flickers?

Flickers são exatamente falha de vídeo, pois a frequencia de exibição está muito alta ou muito baixa.

Quando vc fala em controlar a frequencia é exatamente para evitar o flicker. Neste caso, vc setou em 20ms, o que provavelmente na sua máquina não "flicka", mas é interessante testar em outras, para ter certeza do valor.

E vc percebeu que o GIF tem o tamanho de 300x300, mas a janela que vc abriu tem 100x100?

Quando falamos em redimensionar para caber, um GIF não é uma imagem estática que é facilmente ajustada pelo tamanho, inclusive tem várias técnicas para determinar a menor perda de qualidade no redimensionamento.

Um GIF é basicamente um filminho, ou seja, para redimensionar para caber cada frame deve ser extraído, redimensionado e reinserido no GIF, e não vejo nenhuma função fazendo isso.

Talvez, como a função é bem detalhada, colocar uma função de redimensionamento no meio dela, poderia funcionar.

Especificamente, neste GIF que vc enviou junto são 3 imagens de 300x300. Eu mudei o tamanho para 100x100.

Veja se serve.

image2.gif

Share this post


Link to post
Share on other sites
Quote

Está dando erro na variável 

No seu include do Gdiplus a variável que armazena o endereço da dll deve ter outro nome, no meu aqui abre normal usando a variável  $ghGDIPDLL

Quote

Neste caso, vc setou em 20ms, o que provavelmente na sua máquina não "flicka", mas é interessante testar em outras, para ter certeza do valor.

Esta a cada 100 ms pois a função é chamada a cada 20ms mas só muda quando o contador está em 100 na verdade dá prá alterar chamando a cada 100ms e só mudando o estado do contador de 1 para 0

AdlibRegister("Gif_animate", 100)

Func Gif_animate()
    If $count = 1 Then
        $i += 1
        $count = 0
    Else
        $count = 1
        If $i = $GFC Then $i = 0
        GifDrawFrame($i)
    EndIf
EndFunc   ;==>Gif_animate

 

Quote

E vc percebeu que o GIF tem o tamanho de 300x300, mas a janela que vc abriu tem 100x100?

Sim mas neste exemplo que postei não faz diferença se a GUI for 0 x 0 ou 1000 x 1000 a gif sempre será mostrada no tamanho dela que é 300 x 300 justamente o que preciso alterar para poder usar este exemplo que postei, preciso redimensionar a gif para ajustar em GUIS de tamanhos variados

Quote

Especificamente, neste GIF que vc enviou junto são 3 imagens de 300x300. Eu mudei o tamanho para 100x100

Se a minha GUI abrisse sempre com a mesma resolução eu iria mesmo redimensionar a gif para ajustar nela mas esta gui irá abrir de acordo com a resolução de um segundo monitor que pode ser 1280 x 720, 1080 x 1920 ou até mesmo em telão que a resolução pode ser maior ainda.

Share this post


Link to post
Share on other sites

Acaba que desmembrei a gif e editei os quadros daí deu prá fazer a animação com .bmp mesmo.

#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Global $hGUI, $pic_img, $conta = 1
$hGUI = GUICreate("Animation", 378, 200, -1, -1, $WS_POPUP, $WS_EX_TOPMOST)
GUISetBkColor(0xffffff)
GUISetState()

$pic_img = GUICtrlCreatePic(@ScriptDir & "\image_1.bmp", 0, 0, 378, 200, $SS_CENTERIMAGE)

AdlibRegister("Img_animate", 100)
HotKeySet("{Esc}", "Sair")

While 1
    Sleep(1000)
WEnd

Func Img_animate()
    $conta += 1
    If $conta > 3 Then $conta = 0
    GUICtrlSetImage($pic_img, @ScriptDir & "\image_" & $conta & ".bmp")
EndFunc   ;==>Img_animate

Func sair()
    Exit
EndFunc   ;==>sair

 

Animation.rar

  • Thanks 1

Share this post


Link to post
Share on other sites

as versões mais novas do AutoiT a variavel $ghGDIPDll tem que ser renomeada para $__g_hGDIPDll

  • Like 1

Share this post


Link to post
Share on other sites
9 hours ago, mutleey said:

as versões mais novas do AutoiT a variavel $ghGDIPDll tem que ser renomeada para $__g_hGDIPDll

Humm, então é por isso. Faz sentido.

Belini, por questões pessoais, ainda usa uma versão mais antiga do AutoIt.

Agora funcionou o exemplo.

Share this post


Link to post
Share on other sites

O script que eu queria modificar peguei aqui https://www.autoitscript.com/forum/topic/81490-func-afying-gif-animation/  e o original dele além de poder controlar a velocidade da gif também se move na tela, seria bem interessante se conseguisse adicionar a função de redimensionamento para poder usar ele também.

Script + gif de exemplo

Gif.rar

Share this post


Link to post
Share on other sites

Olá, desculpe cair na conversa de paraquedas...

@Belini

Rotação de imagem e redimensionamento, eu consegui mas sempre usando a função _GDIPlus_MatrixCreate()

Até hoje acho que não entendi direito, e de tanto tentar, até consegui alguns efeitos interessantes.

Veja este outro exemplo com a função _GDIPlus_GraphicsScaleTransform()

Outra opção, é usar o IrrLicht, faz o cão com GIF, GIF animado...
Mas são dois conjuntos de funções: AutoIT (com botões tradicionais) e IrrLicht (com botões gráficos).

  • Like 1

Share this post


Link to post
Share on other sites

@Luigi fui ver aqui e usando este exemplo que postei mesmo colocando o redimensionamento não vai servir pois precisa estar em loop ou usar um adilib para funcionar, vc tem alguma indicação de UDF que dê para determinar o tamanho que a gif vai ficar na GUI e que dê para controlar a velocidade de troca dos quadros?

Share this post


Link to post
Share on other sites

@Belini, dá um olhada...

Achei essa UDF e fiz uns testes...
Alterne o comentário das linhas 12 e 13.

teste_com_gif.7z

 

Agora eu vi que postei a mesma UDF que o @Manimal postou... 

Tem realmente que ser um GIF?
Não pode ser um PNG com várias imagens? Como se fosse um GIF?

  • Thanks 1

Share this post


Link to post
Share on other sites

@Luigi e @Manimal Com as alterações que fiz na minha Gif pude usar a UDF que vc's indicaram e agora não dá mais oscilações na tela, obrigado pela indição da UDF que deram.

  • Thanks 1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

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

Create an account

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

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


×