Afficher un GIF animé sans DLL ni API en VB

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Afficher un GIF animé sans DLL ni API en VB

Message par Kwai chang caine »

Bonjour la famille

Dans le cadre de ses voyages au pays de la programmation.
KCC il a trouvé un super code, tout simple, comme il aime pour pouvoir visualiser un gif animé en VB, sans OCX, sans API, et sans DLL :D
Juste un timer, mais ça PB il le fait sans, un contole image, mais ça marche meme avec un controle bouton 8O et voila

En fin de compte le plus compliqué c'est le nom du createur : Arkadiy Olovyannikov (C'est pas français comme nom) :lol:

Je ne crois pas que j'avais vu ça en pure :roll:
J'aime pas quand VB y sait faire "quequechose" que PB ne fait pas :?
Et en plus, le code est tellement simple qu'on dirait du Pure :lol:
J'ai fait une rapide recherche et j'ai pas trouvé.

Bon, quoi qu'il en soit, je viens de l'appliquer sur une de mes applis en VB, et il marche du tonnere.
Avec ce code, j'suis meme arrivé a faire marcher un GIF transparent dans une fenetre skinnée, ce qui fait que le GIF il se promene tout seul sur le bureau :D

Bref, je me suis dit que ce serait une bonne idée de vous le faire partager, bien qu'il soit pas en PB, ne serait ce que si quelqu'un aurait besoin d'un debut de piste pour creer le meme en PB
Ce qui est dingue dans ce code, c'est que y'a rien besoin, pas de DLL, pas d'API juste apparement une lecture du GIF, de ses caracteristique, un enregistrement de ses divers sequences, et puis les visionner les unes apres les autres.

Les codes sur les GIF animés n'etant pas legion, je prend le risque de me faire disputer en le mettant dans la rubrique "TRUC et ASTUCES".
Et puis en plus pour une fois que je peux "offrir" une combine au forum, au lieu de toujours demander quelque chose :oops:, c'est champagne :D
Si c'est pas bien, DOBRO me deplacera :wink:

Voila treve de blabla, et pour ceux qui aurait deja un filet de bave dans l'angle de la bouche, voici le code.
Je n'en ai pas besoin pour l'instant en PB, mais peut etre que quelqu'un de vous qui a un peu le temps, et surtout les capacités, pourra le couvertir au cas ou. :roll:
Je crois que ça pourrait etre utile pour le forum 8)
Si ça existe déjà, bah excusez moi du derangement et je la remet dans ma culotte :oops:

Voici ou télécharger le source pour ceux qui ont VB
http://www.freevbcode.com/ShowCode.Asp?ID=758

Et pour ceux qui l'ont pas (Les veinards :lol:)

A mettre dans un module :

Code : Tout sélectionner

Public RepeatTimes As Long 'This one calculates, but don't use in this sample. If You need, You can add simple checking at Timer1_Timer Procedure
Public TotalFrames As Long
Public FrameCount As Long

Public Function LoadGif(sFile As String, aImg As Variant) As Boolean
 
 LoadGif = False
 
 If Dir$(sFile) = "" Or sFile = "" Then
  MsgBox "File " & sFile & " not found", vbCritical
  Exit Function
 End If
 
 On Error GoTo ErrHandler
 Dim fNum As Integer
 Dim imgHeader As String, fileHeader As String
 Dim buf$, picbuf$
 Dim imgCount As Integer
 Dim i&, j&, xOff&, yOff&, TimeWait&
 Dim GifEnd As String
 GifEnd = Chr(0) & Chr(33) & Chr(249)
 
 For i = 1 To aImg.Count - 1
  Unload aImg(i)
 Next i
 
 fNum = FreeFile
 
 Open sFile For Binary Access Read As fNum
 buf = String(LOF(fNum), Chr(0))
 Get #fNum, , buf 'Get GIF File into buffer
 Close fNum
 
 i = 1
 imgCount = 0
 j = InStr(1, buf, GifEnd) + 1
 fileHeader = Left(buf, j)
 
 If Left$(fileHeader, 3) <> "GIF" Then
  MsgBox "This file is not a *.gif file", vbCritical
  Exit Function
 End If
 
 LoadGif = True
 i = j + 2
 
 If Len(fileHeader) >= 127 Then
  RepeatTimes& = Asc(Mid(fileHeader, 126, 1)) + (Asc(Mid(fileHeader, 127, 1)) * 256&)
 Else
  RepeatTimes = 0
 End If

 Do ' Split GIF Files at separate pictures and load them into Image Array
 
  imgCount = imgCount + 1
  j = InStr(i, buf, GifEnd) + 3
  
  If j > Len(GifEnd) Then
   
   fNum = FreeFile
   Open "temp.gif" For Binary As fNum
   picbuf = String(Len(fileHeader) + j - i, Chr(0))
   picbuf = fileHeader & Mid(buf, i - 1, j - i)
   Put #fNum, 1, picbuf
   imgHeader = Left(Mid(buf, i - 1, j - i), 16)
   Close fNum
   TimeWait = ((Asc(Mid(imgHeader, 4, 1))) + (Asc(Mid(imgHeader, 5, 1)) * 256&)) * 10&
   
   If imgCount > 1 Then
    xOff = Asc(Mid(imgHeader, 9, 1)) + (Asc(Mid(imgHeader, 10, 1)) * 256&)
    yOff = Asc(Mid(imgHeader, 11, 1)) + (Asc(Mid(imgHeader, 12, 1)) * 256&)
    Load aImg(imgCount - 1)
    aImg(imgCount - 1).Left = aImg(0).Left + (xOff * Screen.TwipsPerPixelX)
    aImg(imgCount - 1).Top = aImg(0).Top + (yOff * Screen.TwipsPerPixelY)
   End If
   
   ' Use .Tag Property to save TimeWait interval for separate Image
   aImg(imgCount - 1).Tag = TimeWait
   aImg(imgCount - 1).Picture = LoadPicture("temp.gif")
   Kill ("temp.gif")
   i = j
  
  End If
  
  DoEvents
 
 Loop Until j = 3
 
 ' If there are one more Image - Load it
 
 If i < Len(buf) Then
  
  fNum = FreeFile
  Open "temp.gif" For Binary As fNum
  picbuf = String(Len(fileHeader) + Len(buf) - i, Chr(0))
  picbuf = fileHeader & Mid(buf, i - 1, Len(buf) - i)
  Put #fNum, 1, picbuf
  imgHeader = Left(Mid(buf, i - 1, Len(buf) - i), 16)
  Close fNum
  TimeWait = ((Asc(Mid(imgHeader, 4, 1))) + (Asc(Mid(imgHeader, 5, 1)) * 256)) * 10
  
  If imgCount > 1 Then
   xOff = Asc(Mid(imgHeader, 9, 1)) + (Asc(Mid(imgHeader, 10, 1)) * 256)
   yOff = Asc(Mid(imgHeader, 11, 1)) + (Asc(Mid(imgHeader, 12, 1)) * 256)
   Load aImg(imgCount - 1)
   aImg(imgCount - 1).Left = aImg(0).Left + (xOff * Screen.TwipsPerPixelX)
   aImg(imgCount - 1).Top = aImg(0).Top + (yOff * Screen.TwipsPerPixelY)
  End If
  
  aImg(imgCount - 1).Tag = TimeWait
  aImg(imgCount - 1).Picture = LoadPicture("temp.gif")
  Kill ("temp.gif")
 
 End If
 
 TotalFrames = aImg.Count - 1
 Exit Function

ErrHandler:
 MsgBox "Error No. " & Err.Number & " when reading file", vbCritical
 LoadGif = False
 On Error GoTo 0

End Function
Et voici l'appel :

Code : Tout sélectionner


If LoadGif(App.Path + "\ImageGif.gif", Form.ImgGif) Then
   FrameCount = 0
   Programme.Timer1.Interval = CLng(Programme.ImgSaliere(0).Tag)
   Programme.Timer1.Enabled = True
  End If
Vous voyez c'est pas trop compliqué :D
Mais encore bien trop pour KCC :oops:

Bonne journée a tous
Necro
Messages : 72
Inscription : mar. 23/sept./2008 16:32

Re: Afficher un GIF animé sans DLL ni API en VB

Message par Necro »

Géniale la LIB (enfin je pense que je ne m'en servirais pas trop)!

Efficace en tout cas - Testée : Fonctionnelle à 100 %

Reste à voir chez les autres...

Cordialement,

Necro.
Anonyme

Message par Anonyme »

Code : Tout sélectionner

Géniale la LIB (enfin je pense que je ne m'en servirais pas trop)!

Efficace en tout cas - Testée : Fonctionnelle à 100 %

Reste à voir chez les autres...

Cordialement,

Necro.
De quoi tu parles ? ta réussi à faire fonctionné le code plus haut avec Purebasic sous windows ?


Kcc , je regarde si je peut traduire.
Necro
Messages : 72
Inscription : mar. 23/sept./2008 16:32

Message par Necro »

Je l'ai testé sous VB ... Désolé de pas avoir précisé ! ^^

Sinon pour le transformer sous PureBasic je ne pense pas en être capable vu que je ne maitrise pas totalement PureBasic...

Cordialement,

Necro.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Code : Tout sélectionner

Géniale la LIB (enfin je pense que je ne m'en servirais pas trop)! 
Efficace en tout cas - Testée : Fonctionnelle à 100 % 
Oui c'est un code super simple et ça marche du tonnerre :D
Habituellement la gestion des GIFS, c'est compliqué.
Y'en a marre d'avoir des FORMS qui bougent pas :D
A force de voir des pages internet avec noir de GIF, on commence a s'y habituer, et c'est vrai qu'au debut quand j'ai vu qu'on pouvait pas gerer les GIF facilement ça m'a un peu ébourrifé 8O
Je crois que y'a encore une histoire de license :?
Kcc , je regarde si je peut traduire.
Bonjour CPL, heureux de te parler comme a mes debuts :D
J'ai guerre progréssé comme tu le vois :?

Merci, si tu y arrive, je pense que tu auras des clients :wink:
Parce que c'est vraiment de la balle ce code

Au fait, j'espere que c'est bien le code que tu veux traduire......pas le nom, parce que le nom il a drolement besoin aussi de traduction mais j'ai peur qu'il veut rien dire :lol: :lol: :lol:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Kwai chang caine a écrit : Je crois que y'a encore une histoire de license :?
ben oui !! c'est meme pour ça qu'a ete créé le PNG je crois !! :wink:

c'est confirmé ici :

http://fr.wikipedia.org/wiki/Portable_Network_Graphics

le MNG est le png animé !! :)
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Oui mais on peut pas non plus mettre des MNG les images animées sur les FORM sans mettre noir de code :?
Et puis en plus faut encore rajouter des plugin dans IE et autre pour que ça marche :?
C'est vrai que le GIF, c'est quand meme quelque chose 8)
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Kwai chang caine a écrit :Oui mais on peut pas non plus mettre des MNG les images animées sur les FORM sans mettre noir de code :?
Et puis en plus faut encore rajouter des plugin dans IE et autre pour que ça marche :?
C'est vrai que le GIF, c'est quand meme quelque chose 8)
A bon y en a qui utilise encore IE ??? :twisted:
l'intégration du MNG dans purebasic serait le bienvenu en tout cas.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

Thyphoon a écrit :
Kwai chang caine a écrit :Oui mais on peut pas non plus mettre des MNG les images animées sur les FORM sans mettre noir de code :?
Et puis en plus faut encore rajouter des plugin dans IE et autre pour que ça marche :?
C'est vrai que le GIF, c'est quand meme quelque chose 8)
A bon y en a qui utilise encore IE ??? :twisted:
l'intégration du MNG dans purebasic serait le bienvenu en tout cas.
Tout à fait !!
ça manque vraiment la prise en charge d'un fichier animé !
~~~~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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Ar-S a écrit : Tout à fait !!
ça manque vraiment la prise en charge d'un fichier animé !
qui fait la demande en anglais sur le forum des gens qui mange des trucs pas bon a la menthe ????
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

C'est déjà faisable avec un WebGadget() aux dimensions du GIF
et ça prend trois lignes
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

Jacobus a écrit :C'est déjà faisable avec un WebGadget() aux dimensions du GIF
et ça prend trois lignes
Mais cela ne signifie-t-il donc pas que l'on doit avoir les plug pour ce format dans le navigateur ? si c'est le cas c'est plutôt lourd...
As tu un exemple à nous fournir Jacobus ?
~~~~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
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Code : Tout sélectionner

#TITRE = "GIF ANIME DANS UN WEBGADGET()"
Enumeration
#WinGif
#Animation
EndEnumeration
Global Anim$, UrlAnim$ 
Anim$ = "...Pictures\Animations\C3D.gif" ;indiquer le chemin complet de l'image animée (pas besoin de loadImage())
UrlAnim$  ="about:<html><body scroll='no' leftmargin='0' topmargin='0'><img src='"+Anim$+"'></img></body></html>" ;on vire les scrollbars et les marges
   

If OpenWindow(#WinGif, 100, 100, 400, 300, #TITRE, #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  If CreateGadgetList(WindowID(#WinGif))
   ;mon image fait 130 x 136 pixels donc...
   WebGadget(#Animation,100,100,130,136,UrlAnim$)  
  EndIf
EndIf 
Repeat 
 Event = WaitWindowEvent() 
  Select Event  
   Case #PB_Event_Gadget
     Select EventGadget()
     
     
     EndSelect     
    Case #PB_Event_CloseWindow : Quitter = 1    
  EndSelect 
Until Quitter
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

Hum, en attendant ça reste fort pratique, merci :D
~~~~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
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

A bon y en a qui utilise encore IE ???
Oui, j'utilise IE, et j'en suis pas super fier :oops:
Moi qui critique crosoft en veux tu en voila..

Mais bon parfois, je me suis fait jeter de certains sites, professionnel qui demandent des autorisations de ci et de la, et ça m'a gonflé alors je suis retourné a IE.
Ce qui est fou c'est que je me suis fait jeter de site "LINUXIENS" en me disant que j'avais un client de daube :?
Y'en a marre de la gueguerre

Mais j'avoue utiliser OPERA par exemple pour sauvegarder les pages en MHT, car IE plante honteusement quand y'a des photos, et j'ai jamais su pourquoi ???
qui fait la demande en anglais sur le forum des gens qui mange des trucs pas bon a la menthe ????
Et en plus tout mou :lol: :lol:

Au fait ça me fait reflechir a la pensée du jour :

Vous connaissez la difference entre ma femme et de la gelée anglaise.
Et ben, la gelée anglaise elle remue quand je la leche :oops:


Autrement, je renonce a demander quoi que ce soit, car la seule chose simple que j'ai demandé, le retour a la ligne ou autre n'a jamais été intégrée en 4 ans. :twisted:
C'est déjà faisable avec un WebGadget() aux dimensions du GIF
et ça prend trois lignes
Oui d'accord, mais ARS a peut etre raison, ne faut il pas les plug ???
Peut etre pas, mais on est obligé de passer par un webgadget, je trouve ça un peu bidouille.
Alors qu'avec ce code c'est vraiment de la gestion de l'image comme le fait un ImageGadget et je trouve que ce serais un plus.

Et avoir deux combines ne gache rien, non ????
De plus, j'avais lu que quelqu'un qui n'aurait pas IE ou Firefox sur sa machine n'aurait pas de WEBGADGET 8O
Car FRED se sert des DLL de l'un ou de l'autre.
Bon je sais vous allez me dire que celui la, il est au fond des iles "Couloulou" dans un patelin fort connu nommé "Blaboulou", mais bon ce mec la il serait super content si CPL.BATOR il arrivait a lui traduire le code :lol:

On sait jamais, alors pourquoi monsieur plus il aurait inventé la roue de secour dans les voitures :lol:
Répondre