Page 1 sur 2
[5.60] Image Frame + gif
Publié : ven. 27/janv./2017 15:15
par falsam
Cette nouvelle mouture (5.60) de PureBasic présente pas mal de nouveautés. Une de ces nouveauté et de pouvoir créer des images possédant plusieurs frames. Une seule est visible à un instant donné. Cela permet par exemple de créer des boutons avec RollOver ou une image animée avec cette exemple.
Code : Tout sélectionner
Enumeration Window
#mainForm
EndEnumeration
Enumeration Gadget
#image
EndEnumeration
Global Image = CreateImage(#PB_Any, 100, 100, 24)
Declare Start()
Declare ChangeFrame()
Declare Exit()
Start()
Procedure Start()
;Creation de trois frames
StartDrawing(ImageOutput(Image))
Box(0, 0, 100, 100, RGB(255, 0, 0)) ;Red
StopDrawing()
AddImageFrame(Image)
StartDrawing(ImageOutput(Image))
Box(0, 0, 100, 100, RGB(0, 0, 255)) ;Blue
StopDrawing()
AddImageFrame(Image)
StartDrawing(ImageOutput(Image))
Box(0, 0, 100, 100, RGB(255, 215, 0)) ;Yellow
StopDrawing()
;Affichage du nombre de frames : On a bien les 3 frames
Debug "Image frame count " + ImageFrameCount(Image)
;Selection de la première frame
SetImageFrame(Image, 0)
OpenWindow(#mainForm, 0, 0, 500, 300, "Image animée", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ImageGadget(#image, 10, 10, 0, 0, ImageID(Image))
AddWindowTimer(#mainForm, 0, 1000)
;Triggers
BindEvent(#PB_Event_CloseWindow, @Exit())
BindEvent(#PB_Event_Timer, @ChangeFrame())
Repeat : WaitWindowEvent() : ForEver
EndProcedure
Procedure ChangeFrame()
Static Frame
Frame +1
If Frame = 3
Frame = 0
EndIf
SetImageFrame(Image, Frame)
SetGadgetState(#Image, ImageID(Image))
EndProcedure
Procedure Exit()
End
EndProcedure
Merci fred pour ces nouvelles fonctionnalités.
Re: [5.60] Image Frame
Publié : sam. 28/janv./2017 2:06
par Ar-S
La même chose avec du GIF

(mon gif préféré de tous les temps je crois
Code : Tout sélectionner
Enumeration
#WIN
#GAD_IMAGE
#T
#IMAGEGIF
EndEnumeration
UseGIFImageDecoder()
Declare CatchImage_Net(Adr$)
Declare Count()
Declare ChangeFrame()
Declare exit()
Global Nbrframe
;LoadImage(#IMAGEGIF,"VOTREFICHIERGIF")
; OU BIEN
InitNetwork()
adr$ = "http://share.ldvmultimedia.com/boules.gif"
Image=CatchImage_Net(adr$) ;Modifie cela par le chemin de ton image
If Image <> 0
NbrFrame = ImageFrameCount(#IMAGEGIF)
Else
Debug "erreur de chargement de l'image"
End
EndIf
Procedure CatchImage_Net(Adr$)
InitNetwork()
Protected image
; By Ar-S
*Buffer = ReceiveHTTPMemory(Adr$)
If *Buffer
Image = CatchImage(#IMAGEGIF, *Buffer, MemorySize(*Buffer) )
FreeMemory(*Buffer)
ProcedureReturn Image
Else
ProcedureReturn #False
EndIf
EndProcedure
;;; End OR
Procedure Count()
ProcedureReturn NbrFrame
EndProcedure
Procedure ChangeFrame()
Static Frame
Frame + 1
If Frame = NbrFrame
Frame = 0
EndIf
Debug "Frame : " + Frame
; Affichage
SetImageFrame(#IMAGEGIF, Frame)
SetGadgetState(#GAD_IMAGE, ImageID(#IMAGEGIF))
EndProcedure
Procedure exit()
End
EndProcedure
If OpenWindow(#WIN, 0, 0, 150, 113, "Gif...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ImageGadget(#GAD_IMAGE,0,0,150,113,ImageID(#IMAGEGIF))
AddWindowTimer(#WIN,3,80)
BindEvent(#PB_Event_CloseWindow, @exit())
BindEvent(#PB_Event_Timer, @ChangeFrame())
Repeat : WaitWindowEvent() : ForEver
EndIf
Re: [5.60] Image Frame + gif
Publié : sam. 28/janv./2017 7:47
par Micoute
Merci a tous les deux pour le partage.
Re: [5.60] Image Frame + gif
Publié : sam. 28/janv./2017 17:47
par Kwai chang caine
Re: [5.60] Image Frame + gif
Publié : sam. 28/janv./2017 19:04
par Zorro
Code : Tout sélectionner
;Creation de trois frames
StartDrawing(ImageOutput(Image))
Box(0, 0, 100, 100, RGB(255, 0, 0)) ;Red
StopDrawing()
AddImageFrame(Image)
StartDrawing(ImageOutput(Image))
Box(0, 0, 100, 100, RGB(0, 0, 255)) ;Blue
StopDrawing()
AddImageFrame(Image)
StartDrawing(ImageOutput(Image))
Box(0, 0, 100, 100, RGB(255, 215, 0)) ;Yellow
StopDrawing()
ben dis donc, j'espere qu'on peut faire :
Code : Tout sélectionner
;;;;
;Creation de trois frames
StartDrawing(ImageOutput(Image))
Box(0, 0, 100, 100, RGB(255, 0, 0)) ;Red
AddImageFrame(Image)
Box(0, 0, 100, 100, RGB(0, 0, 255)) ;Blue
AddImageFrame(Image)
Box(0, 0, 100, 100, RGB(255, 215, 0)) ;Yellow
StopDrawing()
???
Re: [5.60] Image Frame + gif
Publié : sam. 28/janv./2017 20:02
par Ar-S
Dans la synthaxe je ne vois pas le probleme et il ni a pas d'erreur à la compilation. En revanche la frame rouge n'apparaît pas. Pourtant elle est bien décompté. Il y a un petit hic.
Re: [5.60] Image Frame + gif
Publié : sam. 28/janv./2017 20:24
par Ar-S
J'ai 2 soucis concernant le GIF
Le 1er est que le passage d'une frame à une autre superpose les image sur un gif transparent. Je ne trouve pas ça jusdicieux. Il faudrait que le gadget se reset entre chaque frame.
Second soucis, si je remplace l'imagegadget par un canvas mon gif n'apparait plus. (dé-commenter ce qui touche au canvas gadget et commenter ce qui touche à l'imagegadget)
l'image est récupérable ici :
https://s-media-cache-ak0.pinimg.com/or ... 70d29b.jpg mais elle se charge automatiquement au lancement du programme.
Code : Tout sélectionner
Enumeration
#WIN
#GAD_IMAGE
#T
#IMAGEGIF
EndEnumeration
UseGIFImageDecoder()
Declare CatchImage_Net(Adr$)
Declare Count()
Declare ChangeFrame()
Declare exit()
Global Nbrframe
;LoadImage(#IMAGEGIF,"VOTREFICHIERGIF")
; OU BIEN
InitNetwork()
adr$ = "http://share.ldvmultimedia.com/run01.gif" ; 256x256
Image=CatchImage_Net(adr$) ;Modifie cela par le chemin de ton image
If Image <> 0
NbrFrame = ImageFrameCount(#IMAGEGIF)
Debug " l'image contient " + Str(Nbrframe) + " frames"
Else
Debug "erreur de chargement de l'image"
End
EndIf
Procedure CatchImage_Net(Adr$)
InitNetwork()
Protected image
; By Ar-S
*Buffer = ReceiveHTTPMemory(Adr$)
If *Buffer
Image = CatchImage(#IMAGEGIF, *Buffer, MemorySize(*Buffer) )
FreeMemory(*Buffer)
ProcedureReturn Image
Else
ProcedureReturn #False
EndIf
EndProcedure
;;; Endou
Procedure Count()
ProcedureReturn NbrFrame
EndProcedure
Procedure ChangeFrame()
Static Frame, POS
Frame + 1
If Frame = NbrFrame
Frame = 0
EndIf
POS+4
If POS >= 256
POS = 0
EndIf
Debug "Frame : " + Frame
Debug "POS " + POS
; Affichage
SetImageFrame(#IMAGEGIF, Frame)
; FOR CANVAS GADGET
; StartDrawing(CanvasOutput(#GAD_IMAGE))
; DrawImage(ImageID(#IMAGEGIF), POS, #PB_Ignore, #PB_Ignore, #PB_Ignore)
; StopDrawing()
; For Image Gadget
SetGadgetState(#GAD_IMAGE,ImageID(#IMAGEGIF))
EndProcedure
Procedure exit()
End
EndProcedure
If OpenWindow(#WIN, 0, 0, 512, 256, "Gif...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
; CanvasGadget(#GAD_IMAGE,0,0,512,256)
ImageGadget(#GAD_IMAGE,0,0,512,256,ImageID(#IMAGEGIF))
AddWindowTimer(#WIN,3,80)
BindEvent(#PB_Event_CloseWindow, @exit())
BindEvent(#PB_Event_Timer, @ChangeFrame())
Repeat : WaitWindowEvent() : ForEver
EndIf
Re: [5.60] Image Frame + gif
Publié : dim. 29/janv./2017 0:41
par falsam
Effectivement la gestion de la transparence des gifs n'est pas pris en compte lors de l'affichage dans un ImageGadget() ou un CanvasGadget(). Embétant.
Pour le moment ça implique de prendre des gifs avec fonds non transparents.
Pour ton soucis de canvas
Code : Tout sélectionner
DrawImage(ImageID(#IMAGEGIF), POS, #PB_Ignore, #PB_Ignore, #PB_Ignore)
tu cherches à afficher une image en y = #PB_Ignore (-65535). Supprime aussi les deux derniers #PB_Ignore qui indique une taille d'affichage (-65535 x -65535)
Ta procédure ChangeFrame() tel qu'elle fonctionne chez moi.
Code : Tout sélectionner
Procedure ChangeFrame()
Static Frame, POS
SetImageFrame(#IMAGEGIF, Frame)
Frame + 1
If Frame = NbrFrame
Frame = 0
EndIf
POS+4
If POS >= 256
POS = 0
EndIf
; Affichage
StartDrawing(CanvasOutput(#GAD_IMAGE))
Box(0, 0, 512, 256, RGBA(255, 255, 255, 255))
DrawImage(ImageID(#IMAGEGIF), POS, 0)
StopDrawing()
EndProcedure
Re: [5.60] Image Frame + gif
Publié : dim. 29/janv./2017 10:11
par Kwai chang caine
Effectivement la gestion de la transparence des gifs n'est pas pris en compte lors de l'affichage dans un ImageGadget() ou un CanvasGadget(). Embétant.
Vous répondez à ma question
Je m'étais aperçu de ça en essayant avec ma Yenne

J'espère que FRED pourra faire quelque chose, mais c'est pas sûr, comme il utilise la LIB d'un autre

C'est embêtant comme dit FALSAM les GIF transparents sont quand même une grande partie des GIF d'internet

Le GIF est un format super compliqué, surtout les animés
Et y'a beaucoup de problèmes avec, parfois ils sont mal fait, en tout cas pas dans les règles de l'art ce qui donne un résultat inattendu, ça m'est arrivé très souvent
C'est surement une des raisons qui avait freiné FRED pour les inclure dans PB
Re: [5.60] Image Frame + gif
Publié : dim. 29/janv./2017 12:51
par Ar-S
Je vais le poster dans la section bug UK
EDIT :
J'ai essayé de ruser en éditant le gif via PB et en insérant une image noire entre chaque frames mais rien ni fait :
Code : Tout sélectionner
Enumeration
#WIN
#GAD_IMAGE
#T
#IMAGEGIF
#IMtampon
#NEWGIF
EndEnumeration
UseGIFImageDecoder()
Declare CatchImage_Net(Adr$)
Declare Count()
Declare ChangeFrame()
Declare exit()
Declare ImageTampon(imagetp,couleur)
Declare InsertImageTP()
Global Nbrframe, iW, iH
;LoadImage(#IMAGEGIF,"VOTREFICHIERGIF")
; OU BIEN
InitNetwork()
adr$ = "http://share.ldvmultimedia.com/run01.gif" ; 256x256
Image=CatchImage_Net(adr$) ;Modifie cela par le chemin de ton image
If Image <> 0
NbrFrame = ImageFrameCount(#IMAGEGIF)
Debug " l'image contient " + Str(Nbrframe) + " frames"
ImageTampon(#IMtampon,$0)
InsertImageTP()
NbrFrame = ImageFrameCount(#NEWGIF)
Else
Debug "erreur de chargement de l'image"
End
EndIf
Procedure ImageTampon(imagetp,couleur)
iW = ImageWidth(#IMAGEGIF)
iH = ImageHeight(#IMAGEGIF)
CreateImage(imagetp, iW, iH, 24, couleur)
EndProcedure
Procedure InsertImageTP()
CreateImage(#NEWGIF,iW,iH,24,BGcolor)
For i = 0 To Nbrframe-1
StartDrawing(ImageOutput(#NEWGIF))
SetImageFrame(#IMAGEGIF,i)
AddImageFrame(#NEWGIF)
DrawImage(ImageID(#IMAGEGIF),0,0,iW,iH)
StopDrawing()
StartDrawing(ImageOutput(#NEWGIF))
AddImageFrame(#NEWGIF)
DrawImage(ImageID(#IMtampon),0,0,iW,iH)
StopDrawing()
Next
EndProcedure
Procedure CatchImage_Net(Adr$)
InitNetwork()
Protected image
; By Ar-S
*Buffer = ReceiveHTTPMemory(Adr$)
If *Buffer
Image = CatchImage(#IMAGEGIF, *Buffer, MemorySize(*Buffer) )
FreeMemory(*Buffer)
ProcedureReturn Image
Else
ProcedureReturn #False
EndIf
EndProcedure
;;; Endou
Procedure Count()
ProcedureReturn NbrFrame
EndProcedure
Procedure ChangeFrame()
Static Frame, POS
Frame + 1
If Frame = NbrFrame
Frame = 0
EndIf
POS+4
If POS >= 256
POS = 0
EndIf
Debug "Frame : " + Frame
Debug "POS " + POS
; Affichage
; SetImageFrame(#IMAGEGIF, Frame)
SetImageFrame(#NEWGIF, Frame)
; FOR CANVAS GADGET
StartDrawing(CanvasOutput(#GAD_IMAGE))
; Box(POS,0,512,256,$FFFFFF)
;DrawImage(ImageID(#IMAGEGIF), POS, 0)
DrawImage(ImageID(#NEWGIF), POS, 0)
StopDrawing()
; For Image Gadget
; SetGadgetState(#GAD_IMAGE,ImageID(#IMAGEGIF))
SetGadgetState(#GAD_IMAGE,ImageID(#NEWGIF))
EndProcedure
Procedure exit()
End
EndProcedure
If OpenWindow(#WIN, 0, 0, 512, 256, "Gif...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
; If Using Canvas
CanvasGadget(#GAD_IMAGE,0,0,512,256)
; If using imagegadget
;ImageGadget(#GAD_IMAGE,0,0,512,256,ImageID(#IMAGEGIF))
AddWindowTimer(#WIN,3,80)
BindEvent(#PB_Event_CloseWindow, @exit())
BindEvent(#PB_Event_Timer, @ChangeFrame())
Repeat : WaitWindowEvent() : ForEver
EndIf
Re: [5.60] Image Frame + gif
Publié : lun. 30/janv./2017 8:01
par Zorro
Code : Tout sélectionner
Procedure InsertImageTP()
CreateImage(#NEWGIF,iW,iH,24,BGcolor)
For i = 0 To Nbrframe-1
StartDrawing(ImageOutput(#NEWGIF))
SetImageFrame(#IMAGEGIF,i)
AddImageFrame(#NEWGIF)
DrawImage(ImageID(#IMAGEGIF),0,0,iW,iH)
StopDrawing()
StartDrawing(ImageOutput(#NEWGIF))
AddImageFrame(#NEWGIF)
DrawImage(ImageID(#IMtampon),0,0,iW,iH)
StopDrawing()
Next
EndProcedure
ben dis donc, j'espere qu'on peut faire :
Code : Tout sélectionner
Procedure InsertImageTP()
CreateImage(#NEWGIF,iW,iH,24,BGcolor)
For i = 0 To Nbrframe-1
StartDrawing(ImageOutput(#NEWGIF))
SetImageFrame(#IMAGEGIF,i)
AddImageFrame(#NEWGIF)
DrawImage(ImageID(#IMAGEGIF),0,0,iW,iH)
;;;;;;; StopDrawing() <<<<<<<<<<< pourquoi devoir faire 2 fois le meme StartDrawing ?????????
;;;;;;;;;;; StartDrawing(ImageOutput(#NEWGIF)) <<<<<<<<<<< pourquoi devoir faire 2 fois le meme StartDrawing ????????? (deja que c'est dans une boucle.... )
AddImageFrame(#NEWGIF)
DrawImage(ImageID(#IMtampon),0,0,iW,iH)
StopDrawing()
Next
EndProcedure
dans le cadre d'une boucle les fonctions StartDrawing-StopDrawing sont un fort ralentissement !!
en general on cherche a les metres en dehors de la boucle genre :
StartDrawing()
For
xxxx
xxxx
Next
StopDrawing()
si tu met ces fonctions dans la boucle, c'est plus lent ! (mais quelques fois on a pas le choix) cependant
si en plus tu ajoutes en doublant ses fonctions alors qu'il s'agit d'ecrire au meme endroit , alors là, c'est du vice !!

Re: [5.60] Image Frame + gif
Publié : lun. 30/janv./2017 12:09
par Ar-S
Je t'avais répondu lors de ta précédente remarque.
Dans la synthaxe je ne vois pas le probleme et il ni a pas d'erreur à la compilation. En revanche la frame rouge n'apparaît pas. Pourtant elle est bien décompté. Il y a un petit hic.
Re: [5.60] Image Frame + gif
Publié : lun. 30/janv./2017 19:05
par Zorro
ben oui, c'est forcement un bug de la lib
Re: [5.60] Image Frame + gif
Publié : lun. 30/janv./2017 19:17
par Ar-S
Je l'ai signalé.
Re: [5.60] Image Frame + gif
Publié : mar. 31/janv./2017 15:59
par falsam
A la question pourquoi un
StartDrawing() ... StopDrawing() à chaque fois qu'on souhaite insérer une nouvelle frame avec la fonction
AddImageFrame(), la réponse est apportée par Fred.
Si vous devez ajouter une nouvelle frame,
donc une nouvelle image, alors tout comme la création d'image classique, vous devez commencer par StartDrawing(). Ce n'est pas un bug.
Fred a écrit :This is the way it is done for now, it's not a bug. If you want to add a frame, you create a new image and you need to change the drawing area for StartingDrawin().