ANIMATION AVEC GRAIN

cs_JLN Messages postés 371 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 17 juin 2013 - 26 nov. 2012 à 09:56
Guillamue06 Messages postés 157 Date d'inscription dimanche 18 avril 2004 Statut Membre Dernière intervention 11 juillet 2022 - 5 déc. 2012 à 12:49
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/54767-animation-avec-grain

Guillamue06 Messages postés 157 Date d'inscription dimanche 18 avril 2004 Statut Membre Dernière intervention 11 juillet 2022 4
5 déc. 2012 à 12:49
Je viens d'essayer avec un thread au lieu d'un timer l'animation m'a l'air d'aller plus vite même en baissant l'interval du timer.
Puis un petit coloriage personnalisée

For i = 5 To number - 1
Dim b As SolidBrush If i < 256 Then b New SolidBrush(Color.FromArgb(255, 30, i, i)) Else b New SolidBrush(Color.FromArgb(255, 255, 255, 255))
g.FillEllipse(b, x(i), y(i), s(i), s(i))
Next
cs_JLN Messages postés 371 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 17 juin 2013
5 déc. 2012 à 11:31
Bonjour,
LE PIVERT:
Genial !
C'est du plus bel effet.
Le tout en si peu de lignes... Il n'y a pas longtemps que je me suis mis à .NET et j'aimerai le maitriser autant que vb6, surtout quand je vois ca...
Je n'ai pas trouvé comment faire durer l'animation, au bout d'un moment j'ai un écran blanc et une croix rouge.
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
5 déc. 2012 à 10:54
Bonjour Guillamue06,
Oui je m'en suis aperçu, c'est pour cela que j'ai mis en mode Maximized et que j'ai supprimé les Buttons Minimise et Maximise à l'ouverure du Form.
Bonne continuation.
Guillamue06 Messages postés 157 Date d'inscription dimanche 18 avril 2004 Statut Membre Dernière intervention 11 juillet 2022 4
5 déc. 2012 à 10:46
Sympa l'effet de neige. Par contre je sais pas si tu as fait gaff mais si tu rétrécis la fenêtre au minimum puis tu agrandi la fenêtre d'un coup la neige descend que sur l'ancienne largeur jusqu’à se qu'elle à fini de tomber.
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
3 déc. 2012 à 12:10
Bonjour,
Voici un code qui fait un effet de neige et qui ne bouffe pas beaucoup de ressource. J'ai vérifié sur le gestionnaire de tâche:
Ouvrir un projet avec un Form et un timer.
Coller ce code dans votre projet:

Option Strict On
Public Class Form1
Sub New()
' Cet appel est requis par le concepteur.
InitializeComponent()
' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
ouverture() 'ouverture du fichier image
End Sub
Dim number, x(), y(), v(), s() As Integer
Dim t As Random = New Random
Dim g As System.Drawing.Graphics
Dim rec As Rectangle
Dim cheminimage As String
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
Me.UpdateStyles()
Me.WindowState = FormWindowState.Maximized
Me.MaximizeBox = False
Me.MinimizeBox = False
snow()
End Sub
Private Sub snow()
number = 2000
ReDim x(number - 1)
ReDim y(number - 1)
ReDim v(number - 1)
ReDim s(number - 1)
Dim i As Integer
For i = 0 To number - 1
Insnow(i)
Next
End Sub
Private Sub Insnow(ByVal i As Integer)
x(i) = t.Next(0, Me.Width - 1)
y(i) = t.Next(0, CInt(Me.Height * 5 / 7))
v(i) = t.Next(5, 20)
s(i) = CInt((t.Next(1, 3) * 100 + t.Next(50, 200)) / 100)
End Sub
Private Sub Timer1_Tick_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Static i As Integer
For i = 0 To number - 1
y(i) = y(i) + v(i)
If y(i) >= Me.Height Then
Insnow(i)
End If
Next
Invalidate()
End Sub
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
If cheminimage = "" Then
MessageBox.Show("Opération annulée par l'utilisateur!", "Ouverture image", MessageBoxButtons.OK, MessageBoxIcon.Information)
Me.Close()
Else
Dim bmp As New Bitmap(cheminimage)
g = Graphics.FromImage(bmp)
g = e.Graphics
g.DrawImage(bmp, rec)
Dim i As Integer
For i = 0 To number - 1
g.FillEllipse(Brushes.White, x(i), y(i), s(i), s(i))
Next
End If
End Sub
Private Sub Form1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize
rec = New Rectangle(0, 0, Me.Width, Me.Height)
End Sub
Private Sub ouverture()
'Mise en place d'un objet OpenFileDialog pour ouvrir un fichier image
Dim openFD As New OpenFileDialog
With openFD
.Filter = "JPeg Files (*.jpg,*.jpeg)|*.jpg;*.jpeg|Bitmap Files (*.bmp)|*.bmp"
.FilterIndex = 1
.FileName = "Fichier Image"
.Title = "Sélectionnez l'image que vous souhaitez afficher."
DialogResult = .ShowDialog
If DialogResult = Windows.Forms.DialogResult.OK Then
cheminimage = (.FileName) 'chemin fichier image
Timer1.Start()
Else
Exit Sub
End If
.Dispose()
End With
End Sub
End Class

Si cela peut aider
@+ Le Pivert
cs_JLN Messages postés 371 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 17 juin 2013
1 déc. 2012 à 08:24
J'ai 8Go de mémoire et je tourne en 64bits si cela peut aider, mais je pense que c'est juste que tu n'as pas essayé suffisement longtemps car peu importe la taille mémoire, tu finiras toujours en mémory full.
Fais ta déclaration avant la boucle et multiplis juste les instances en supprimant les instances devenues inutiles. Je pense que ca reglerait le probleme.
Juste comme ca, as-tu pensé à un effet neige, en cette periode, ce serait d'actualité non ?
Bon ce n'est qu'une suggestion.
Bonne prog.
Guillamue06 Messages postés 157 Date d'inscription dimanche 18 avril 2004 Statut Membre Dernière intervention 11 juillet 2022 4
30 nov. 2012 à 20:13
Salut, oui en effet pour le "Memory Full" cela viens du fait qu'il y a une nouvelle bitmap qui se créé et sa remplis la ram, voila pourquoi je n'avais pas l'erreur (tu doit disposer de moins de mémoire vive que moi et pour ma part je ne l'ai pas laissé tourné assé longtemps).

Pour t'es 8 points c'est vraiment généreux. Si j'ai le temps je corrigerais l'erreur et peut être un effet "grain dégradé".
cs_JLN Messages postés 371 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 17 juin 2013
27 nov. 2012 à 08:47
Bonjour,
Je viens de tester à nouveau et j'ai bien une erreur qui survient, mais après un certain temps à manipuler les scrollbars.
En fait tu implémentes la déclaration de variable dans une boucle ce qui fait qu'au bout d'un moment c'est "Memory Full".

Private Sub Work()
While Boucle
Dim ImageBt As New Bitmap(myBitmap)
etc...

Rien que pour le partage ca vaut les 8 points que j'ai mis, souhaitons que ton code interesse quelqu'un...
Bonne prog.
Guillamue06 Messages postés 157 Date d'inscription dimanche 18 avril 2004 Statut Membre Dernière intervention 11 juillet 2022 4
26 nov. 2012 à 18:38
Salut quand même et merci pour ton com. Pour se qui est des "extremes", pour ma part je n'est aucun message d'erreur (j'ai beau chercher mais j'ai rien mais je ne dit pas que ce n'est pas vrai hein).

"les extremes sont inversées" Tu veut dire les scroll barres ? Oui je sais ! et je m'en fou complètement, la source est là pour donner des idées se n'est pas un "dit programme" et encore moins review de photoshop.

A la base je m'amuser à tester les fonctionnalités des picturebox, drawing... quand j'ai vue l'effet que ça donnée j'ai trouvé sa sympa de le faire partager :)
cs_JLN Messages postés 371 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 17 juin 2013
26 nov. 2012 à 09:56
Tu n'as pas suffisement testé ta source, dès qu'on atteint les extremes on a droit à un message d'erreur.
De plus les extremes sont inversées ce qui n'est pas très intuitif pour l'utilisateur final (inverse mini/maxi des scroolbar).
Difficile de donner une note pour le moment et un avis sur la prog, je ferai cela après correction.
Rejoignez-nous