[RESOLU] Probléme avec CopyImage

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Christophe
Messages : 43
Inscription : lun. 22/oct./2018 19:34
Localisation : Haisnes (62)

[RESOLU] Probléme avec CopyImage

Message par Christophe »

Bonjour à tous,
j'ai 2 questions...
je me suis aperçu qu'il n'était pas possible de faire un CopyImage avec une image au format GIF, quelqu'un a t'il une solution ?

Ma 2éme question : si il n'y a pas moyen de le faire sans passer par includeBinary et catchImage peux t-on faire un SWAP ID ? En effet j'ai 2 images GIF qui tournent en boucle et au bout d'un moment j'aimerais que mon image 2 remplace l'image 1

merci pour vos réponses
Dernière modification par Christophe le sam. 28/sept./2019 21:37, modifié 1 fois.
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Probléme avec CopyImage

Message par Ar-S »

Je réponds un poil à coté mais j'ai pas le temps de me pencher dessus.
Pourquoi ne fais tu pas un seul gif avec les 2 anims. Il te suffirait ensuite de jouer avec les numéros des frames ?
- Tu charges 1 seule images
- Tu n'as pas besoin de copy
- Tu n'as pas besoin de swapper
~~~~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
Christophe
Messages : 43
Inscription : lun. 22/oct./2018 19:34
Localisation : Haisnes (62)

Re: Probléme avec CopyImage

Message par Christophe »

Comme un bout de code vaut mieux qu'un long discours...

https://drive.google.com/drive/folders/ ... mifzLZyBsr

Ceci n'est qu'une ébauche ou plutôt une partie du code principale. Il se peut que chez vous le code fonctionne correctement mais chez moi lorsque le CatchImage au niveau de la proceure SwapImage() s'effectue il y a une latence au niveau de l'animation certes de qq ms mais genant pour moi, c'est pour cela que je souhaitais savoir si il etait possible de faire un SWAP ID qui doit etre beaucoup plus rapide
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Probléme avec CopyImage

Message par Ar-S »

Bon chez moi c'est ultra fluide mais j'ai une grosse babasse.
Pourquoi appliques tu ton catchimage au moment de la selection ? Forcément tu vas générer une "micro" latence
Ne peux tu pas catcher toutes tes images d'abord (et les mettre dans un bloc datasection tant qu'à faire).
~~~~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
Avatar de l’utilisateur
Naheulf
Messages : 193
Inscription : dim. 10/mars/2013 22:22
Localisation : France

Re: Probléme avec CopyImage

Message par Naheulf »

Christophe a écrit :je me suis aperçu qu'il n'était pas possible de faire un CopyImage avec une image au format GIF, quelqu'un a t'il une solution ?
Effectivement CopyImage() ne va copier qu'une seule frame de l'image. Mais rien n’empêche de faire une boucle pour copier toutes les frames de ton image.
Christophe a écrit :si il n'y a pas moyen de le faire sans passer par includeBinary et catchImage peux t-on faire un SWAP ID ? En effet j'ai 2 images GIF qui tournent en boucle et au bout d'un moment j'aimerais que mon image 2 remplace l'image 1
Je ne suis pas sûr d'avoir correctement compris ta question. Mais j'espère que la suite du message y répondra.
Christophe a écrit :Il se peut que chez vous le code fonctionne correctement mais chez moi lorsque le CatchImage au niveau de la proceure SwapImage() s'effectue il y a une latence au niveau de l'animation certes de qq ms mais genant pour moi, c'est pour cela que je souhaitais savoir si il etait possible de faire un SWAP ID qui doit etre beaucoup plus rapide
Chez moi, je remarque également la latence que tu évoques lorsque la transition viens de se terminer et que tu appelle SwapImage() pour charger à nouveau la nouvelle image dans #ImageGif. Pour enlever cet accro, il ne faut plus vouloir changer l'image derrière #ImageGif. À la place il faut lui dire d'utiliser l'image qui est déjà chargé dans #ImagegifT. Pour ça il faut utiliser des variables pour enregistrer les "#Image" et il suffira de copier les entier dans ces variables pour changer d'image.
De plus, j'ai le débogueur qui signale l'erreur « Ligne: 66 - Le #Image spécifié n'est pas initialisé » lorsque je change rapidement de sélection dans le combo box. (Code "If FrameGifT= ImageFrameCount(#ImagegifT) : FrameGifT=0 : EndIf"). Cela est dû au fait que la procédure Change() peut modifier l'image derrière #ImageGifT pendant que le thread Gif() veut l'afficher. Les solutions consistent alors à utiliser une troisième image pour faire le chargement ou à empêcher de modifier Le comboBox pendant la transition. (Personnellement j'opterais pour la première solution)

Comme l'as précisé Ar-S ce serais plus propre de mettre tes IncludeBinary dans une datasection. Même je trouve que ce serais encore mieux de laisser les images à coté de ton exécutable et de ne les charger charger en mémoire avec LoadImage() qu'au moment où tu en à besoin...
Christophe
Messages : 43
Inscription : lun. 22/oct./2018 19:34
Localisation : Haisnes (62)

Re: Probléme avec CopyImage

Message par Christophe »

Merci à vous 2, j'ai effectivement resolu le probleme de latence je ne recharge plus l'image mais j' interverti leur ID en passant par des variables et non des constantes de cette façon
IdImage = #ImageGif
IdImageT = #ImageGifT
swap IdImage, IdImageT

Naheulf, tu as raison lorsque l'on change rapidement d'image ça plante ! chose que je n'avais pas remarqué
tu expliques le pourquoi du comment (je suis d'accord avec toi) mais je ne comprend pas ta façon de faire avec la 3éme image...
pour l'instant j'ai mis un DisableGadget

Merci à Ar-S et Naheulf
Avatar de l’utilisateur
Naheulf
Messages : 193
Inscription : dim. 10/mars/2013 22:22
Localisation : France

Re: Probléme avec CopyImage

Message par Naheulf »

Christophe a écrit :je ne comprend pas ta façon de faire avec la 3éme image...
pour l'instant j'ai mis un DisableGadget
En gros il faudrait faire un truc ressemblant à ça :

Code : Tout sélectionner

IdImageT = #ImageGifT ; T comme Transition
IdImageC = #ImageGifC ; C comme Chargement ou Change

Procedure Change()
	Shared TransparenceGif, FrameGifT, AdresseGif, IdImageT, IdImageC
	
	Genre = GetGadgetText(#genre)
	Select Genre
		Case "Horreur"
			 CatchImage(IdImageC, ?GifHorreur) ; On charge l'image dans IdImageC
		Case "Science fiction"
			CatchImage(IdImageC, ?GifEspace)
		Case "Aventure"
			CatchImage(IdImageC, ?GifAventure)
		Case "Fantastique"
			CatchImage(IdImageC, ?GifFantastique)
		Case "Comedie"
			CatchImage(IdImageC, ?GifComedie)
		Case "Animation"
			CatchImage(IdImageC, ?GifAnimation)
		Case "Action"
			CatchImage(IdImageC, ?GifAction)
		Case "Thriller"
			CatchImage(IdImageC, ?GifThriller)
		Default ; En cas de valeur imprévue on se rabat sur l'image par défaut : choix "Tous"
			CatchImage(IdImageC, ?GifImage)
	EndSelect
	
	; On "transmet" la nouvelle image au thread Gif()
	Swap IdImageC, IdImageT ; On permute avec IdImageT une fois que l'image est chargée
	FrameGifT = 0
	TransparenceGif=0
	
	; On libère la mémoire qui est occupée pour rien
	FreeImage(IdImageC) 
EndProcedure

Répondre