Page 1 sur 1

Gif animé sans animation ?

Publié : mar. 25/févr./2020 14:10
par PhM
Bonjour,

Comprenez-vous pourquoi ce programme censé afficher une image gif animée n'affiche que l'image sans animation ?

Code : Tout sélectionner

  UseGIFImageDecoder() 
 
  If OpenWindow(0, 0, 0, 250, 250, "CatchImage", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CatchImage(0, ?Image_Start, ?Image_End - ?Image_Start)
      ImageGadget(0, 70, 90, ImageWidth(0), ImageHeight(0), ImageID(0))
      Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
    EndIf
  EndIf
  
  End
  
  DataSection
    Image_Start:
      IncludeBinary "F2_flash.gif"
    Image_End:
  EndDataSection
Voici l'image en question :
Image

Re: Gif animé sans animation ?

Publié : mar. 25/févr./2020 15:11
par Marc56
Bonjour PhM,

Un Gif est un ensemble d'images assemblées en un seul fichier.
C'est le logiciel (visualiseur ou navigateur) qui assure l'animation.
Le gadget Image de PB n'affiche que des images fixes, c'est donc au programme de permuter ces images.
On utilise le timer pour changer l'image sans bloquer le reste du programme (ne pas utiliser Delay()!)

À noter que certains gif ont des délais différents pour chaque image (rare), mais heureusement PB sait gérer.
Exemple: http://www.purearea.net/pb/CodeArchiv/G ... rprize.gif
Image

Voici ce que cela donne avec ton code.

Code : Tout sélectionner

; Affichage d'un Gif animé en PureBasic
; 
; Un fichier GIF est composé de plusieurs images 
; Le délai d'affichage de chaque image peut être différent
;
; ImageFrameCount()     = Nombre d'images dans le Gif
; SetImageFrame()       = Avancer à l'image numéro ...
; GetImageFrameDelay()  = Lire le délai d'affichage de l'image ...
 
EnableExplicit

UseGIFImageDecoder()

Enumeration 
    #Win
    #Gad_Img
    #Img
    #Timer
EndEnumeration

OpenWindow(#Win, 0, 0, 250, 250, "CatchImage", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CatchImage(#Img, ?Image_Start, ?Image_End - ?Image_Start)
ImageGadget(#Gad_Img, 70, 90, ImageWidth(#Img), ImageHeight(#Img), ImageID(#Img))
AddWindowTimer(#Win, #Timer, GetImageFrameDelay(#Img))

Define Frame ; Numéro de l'image en cours

Repeat
    Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
            End
            
        Case #PB_Event_Timer
            SetGadgetState(#Gad_Img, ImageID(#Img))
            
            ; Le délai entre chaque image n'est pas toujours identique
            ; on peut/doit donc relire et redéfinir ce delai 
            RemoveWindowTimer(#Win, #Timer)
            AddWindowTimer(#Win, #Timer, GetImageFrameDelay(#Img))
            
            ; Avancer à l'image suivante
            Frame + 1
            ; Boucler si on a atteint la dernière
            If Frame >= ImageFrameCount(#Img) : Frame = 0 : EndIf
            ; Définir la nouvelle image en cours
            SetImageFrame(#Img, Frame)
            
    EndSelect
ForEver

End

DataSection
    Image_Start:
    IncludeBinary "F2_flash.gif"
    Image_End:
EndDataSection
:!: Attention à certains exemples sur les forums qui mettent Frame + 1 avant le premier affichage, ce qui à pour effet de manquer la première image (qui commence à 0)

:wink:

Re: Gif animé sans animation ?

Publié : mar. 25/févr./2020 15:42
par PhM
Merci Marc pour les explications.
C'est dommage que tout ce processus ne soit pas pris en charge "nativement" par PB sans avoir à prendre en charge la gestion, pas à pas, de l'affichage.
Je trouve que c'est beaucoup de choses à gérer pour simplement afficher l'image.
A+
Philippe

Re: Gif animé sans animation ?

Publié : mar. 25/févr./2020 17:27
par Marc56
Bonjour Philippe,

Modifier les gadgets (image et canvas) ou en créer un nouveau pour les Gif animés nécessiterait aussi un moyen pour gérer un timer dans la boucle principale, je pense que c'est pour cela que Fred a procédé comme cela. Les Gif animés sont peu utilisés et le sont surtout à des fins souvent décoratives. Ils sont apparus tardivement dans PB (v5.60 en 2017) à cause de la licence.

PB privilégie la taille et la rapidité. Une nouvelle fonctionnalité n'est ajoutée à PB qu'en fonction du nombre de personnes intéressées, de la faisabilité, de la rapidité de compilation et de l'augmentation raisonnable de la taille de l'EXE final (même si pour cette dernière cela devient moins important)

:wink:

Re: Gif animé sans animation ?

Publié : mer. 26/févr./2020 11:54
par Shadow
Merci Marc56 pour le code, bon boulot :)

Re: Gif animé sans animation ?

Publié : mer. 26/févr./2020 14:09
par vurvur
Sinon il y a l'astuce du webgadget, qui est plus simple (mais qui ne peut pas charger l'image via un catchimage je pense):

Code : Tout sélectionner


OpenWindow(0, 100, 0, 800, 400, "")

WebGadget (0, 0,   0, 300, 300, "")
SetGadgetAttribute(0, #PB_Web_BlockPopupMenu, 1)

SetGadgetItemText(0, #PB_Web_HtmlCode, "<body scroll=no><img src=https://mijon.pagesperso-orange.fr/PureBasic/F2_flash.gif>")

Repeat  : Until WaitWindowEvent() = 13116


Re: Gif animé sans animation ?

Publié : jeu. 05/mars/2020 7:17
par PhM
Bonjour et merci vurvur pour cette originale solution plus légère !
Que je comprenne bien, à quoi correspond ce nombre précis (13116) ?

Re: Gif animé sans animation ?

Publié : jeu. 05/mars/2020 11:12
par Marc56

Code : Tout sélectionner

Repeat  : Until WaitWindowEvent() = 13116
PhM a écrit :Que je comprenne bien, à quoi correspond ce nombre précis (13116) ?
Boucle principale, donc probablement #PB_Event_CloseWindow ?

Code : Tout sélectionner

Debug #PB_Event_CloseWindow

Code : Tout sélectionner

13116

Pour avoir sa valeur Hexa

Code : Tout sélectionner

Debug Hex(#PB_Event_CloseWindow)
Donc on pourrait faire aussi

Code : Tout sélectionner

Repeat : Until WaitWindowEvent() = $333C

De même si on ne veut pas écrire un tas de constantes toujours identiques, il suffit de tester le résultat et remplacer par la valeur numérique totale

Code : Tout sélectionner

OpenWindow(#Win, 0, 0, 250, 250, "CatchImage", 
           #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

Debug Hex( #PB_Window_SystemMenu | #PB_Window_ScreenCentered ) 
; = C80001
OpenWindow(#Win, 0, 0, 250, 250, "CatchImage", $C80001)
Tout un programme Windows en seulement 82 caractères

Code : Tout sélectionner

OpenWindow(0, 0, 0, 250, 250, "", $C80001)
Repeat : Until WaitWindowEvent() = $333C
:wink:

Re: Gif animé sans animation ?

Publié : jeu. 05/mars/2020 13:32
par PhM
Salut Marc56,
Ok, 13116...tout simplement...

Re: Gif animé sans animation ?

Publié : jeu. 05/mars/2020 14:05
par Ar-S
PhM a écrit :Salut Marc56,
Ok, 13116...tout simplement...
Mieux vaut utiliser #PB_Event_CloseWindow car si dans une prochaine MAJ windows décide de changer 13116 en 13117 et ben ton code ne marchera plus.. Alors que PB lui sera forcement mis à jour par la team.
Donc c'est sympa à utiliser dans le cadre d'un purepunch mais pour un code sur le long terme, faut éviter.
(purepuch = concours de code avec limitation du nombre de caractères/lignes sur un thème donné).

Re: Gif animé sans animation ?

Publié : jeu. 05/mars/2020 14:17
par Marc56
Ar-S a écrit :Mieux vaut utiliser #PB_Event_CloseWindow car si dans une prochaine MAJ windows décide de changer 13116 en 13117 et ben ton code ne marchera plus.. .
Je pensais que c'était juste pour la compatibilité des codes PB entre les 3 compilateurs (Win/Mac/Linux)

(Edit: suppression d'une liste de constantes fausses. Merci Ollivier d'avoir rectifié :wink: )

Re: Gif animé sans animation ?

Publié : ven. 13/mars/2020 12:35
par Ar-S
L'un n'exclue pas l'autre. :wink:

Re: Gif animé sans animation ?

Publié : ven. 13/mars/2020 17:41
par Ollivier
@Marc56

Ton tableau de rappel est magnifique. Je dois même dire que c'est un travail exceptionnel de recueil des valeurs de réglages de la fenêtre. Et aussi, vraiment tu as raison : après toutes ces années, ça n'a pas bougé, même pas d'un seul bit. Pourtant...

Déjà, il manque les réglages de transparence. Mais, admettons, que le tableau fût complet, vraiment complet.

Je crois cependant que l'on parle des évènements, et non des réglages.

Donc, la recommandation d'Ar-S reste absolument et, nécessiteusement, de très bon conseil !

Re: Gif animé sans animation ?

Publié : ven. 13/mars/2020 17:51
par Marc56
Ah, oui, c'est vrai, ce sont les constantes de réglage de fenêtre, mauvais copié/collé d'une doc trouvée sur le net.
Je vais éditer pour ne pas laisser de fausses informations se faire indexer :)

Re: Gif animé sans animation ?

Publié : ven. 13/mars/2020 18:05
par Ollivier
Si besoin de supprimer ma romanesque remarque : évidemment, quartier libre ! (Je crois qu'il manque #WS_LayeredWindow mais je... Je sors au bistrot !).