Gif animé sans animation ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
PhM
Messages : 151
Inscription : dim. 08/déc./2019 10:50

Gif animé sans animation ?

Message 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
Marc56
Messages : 2199
Inscription : sam. 08/févr./2014 15:19

Re: Gif animé sans animation ?

Message 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:
Avatar de l’utilisateur
PhM
Messages : 151
Inscription : dim. 08/déc./2019 10:50

Re: Gif animé sans animation ?

Message 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
Marc56
Messages : 2199
Inscription : sam. 08/févr./2014 15:19

Re: Gif animé sans animation ?

Message 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:
Shadow
Messages : 1413
Inscription : mer. 04/nov./2015 17:39

Re: Gif animé sans animation ?

Message par Shadow »

Merci Marc56 pour le code, bon boulot :)
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
vurvur
Messages : 60
Inscription : ven. 29/août/2014 19:52

Re: Gif animé sans animation ?

Message 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

Avatar de l’utilisateur
PhM
Messages : 151
Inscription : dim. 08/déc./2019 10:50

Re: Gif animé sans animation ?

Message 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) ?
Marc56
Messages : 2199
Inscription : sam. 08/févr./2014 15:19

Re: Gif animé sans animation ?

Message 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:
Avatar de l’utilisateur
PhM
Messages : 151
Inscription : dim. 08/déc./2019 10:50

Re: Gif animé sans animation ?

Message par PhM »

Salut Marc56,
Ok, 13116...tout simplement...
Avatar de l’utilisateur
Ar-S
Messages : 9546
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Gif animé sans animation ?

Message 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é).
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Marc56
Messages : 2199
Inscription : sam. 08/févr./2014 15:19

Re: Gif animé sans animation ?

Message 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: )
Dernière modification par Marc56 le ven. 13/mars/2020 17:52, modifié 1 fois.
Avatar de l’utilisateur
Ar-S
Messages : 9546
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Gif animé sans animation ?

Message par Ar-S »

L'un n'exclue pas l'autre. :wink:
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Gif animé sans animation ?

Message 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 !
Marc56
Messages : 2199
Inscription : sam. 08/févr./2014 15:19

Re: Gif animé sans animation ?

Message 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 :)
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Gif animé sans animation ?

Message 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 !).
Répondre