Meilleur auteur de réponses
dégradé dans une pictureBox

Question
-
Bonjour,
J'aimerais faire un dégradé d'une pictureBox de son état initial vers un état tout noir, un peu à la manière de Windows shutdown qui assombrit l'image de fond.
Je pense que je dois faire un ET logique avec chaque pixel.
Quelqu'un aurait-il une idée comment faire ?
fred
Réponses
-
Bonjour Fred,
Voici un dégradé vertical de rouge allant verts le noir :
' Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint Dim i As Integer Dim r As Double Dim v As Double Dim b As Double Dim pasV As Double Dim g As Graphics g = Me.CreateGraphics pasV = 100 / Me.Height * 2.55 ' = 255 couleur / 100 r = 255 ' dégradé vertical de "rouge à noir" v = 0 b = 0 For i = 0 To Me.Height Dim couleur As New Pen(Color.FromArgb(r, v, b), 0) g.DrawLine(couleur, 0, i, Me.Width, i) r = r - pasV Next i g.Dispose() End Sub '
Cordialement.
Joseph Attila PUSZTAY
EhJoe Logiciels Romans Ecrire- Proposé comme réponse EhJoe dimanche 6 mars 2011 08:51
- Marqué comme réponse Alex Petrescu mardi 8 mars 2011 11:46
Toutes les réponses
-
Bonjour Fred,
Comme ceci :
Option Explicit On Public Class Form1 Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim g As Graphics = PictureBox1.CreateGraphics Dim x, i As Long Dim r As Double = 255 Dim v As Double = 160 Dim b As Double = 80 For i = 0 To PictureBox1.Height r = r - 1 v = v - 1 b = b - 1 If r < 0 Then r = 0 If v < 0 Then v = 0 If b < 0 Then b = 0 Dim couleur As New Pen(Color.FromArgb(r, v, b), 2) x = PictureBox1.Width g.DrawLine(couleur, 0, i, x, i) Next i g.Dispose() End Sub End Class
Cordialement.
Joseph Attila PUSZTAY
EhJoe Logiciels Romans Ecrire- Proposé comme réponse EhJoe vendredi 4 mars 2011 18:10
-
Suite ...
J'ai fait un petit logiciel de gestion des couleurs en vbNet (en téléchargement gratuit ici) :
http://irolog.free.fr/_gratuit/couleursvb/couleursvb.htm
Il permet de bien voir ce qui va se passser en faisant des mixages... et de récupérer une couleur aussi ...
Et là tu as un exemple de dégradé fait sur un logiciel en vb6 :
http://irolog.free.fr/irolog_vente/numero_v/index.htm
Cordialement.
Joseph Attila PUSZTAY
EhJoe Logiciels Romans Ecrire -
-
Bonjour Fred,
Je viens d'essayer, il ne dessine pas sur l'image à confition de mettre le code dans la procédure paint
Pour le dégradé en partant de ta couleur, avec mon logiciel tu peux piper la couleur afin de savoir de quelle couleur rgb tu pars, à partir de ce moment, si tu me donnes cette info, je peux te le dégrader vers le noir (parfois il faut manipuler deux ou trois couleurs ensemble) ?
Cordialement.
Joseph Attila PUSZTAY
EhJoe Logiciels Romans Ecrire -
Bonjour,
Pour les manipulations du type éclaircir, assombrir, changer la teinte, etc ... j'utilise une petite classe ci-dessous.
On doit pouvoir faire plus simplement dans ton cas particulier mais cela pourra toujours servir. Le principe est de passer en mode HSV (au lieu de RGB).
Imports System.ComponentModel Imports System.Drawing Imports System.Math Public Class HSVColor <EditorBrowsable(EditorBrowsableState.Never)> Private m_hue As Single = 0 <EditorBrowsable(EditorBrowsableState.Never)> Private m_saturation As Single = 0 <EditorBrowsable(EditorBrowsableState.Never)> Private m_value As Single = 0 Public Property Hue() As Single Get Return Me.m_hue End Get Set(ByVal value As Single) If value < 0 Or value > 360 Then Throw New ArgumentOutOfRangeException("Hue") End If Me.m_hue = value End Set End Property Public Property Saturation() As Single Get Return Me.m_saturation End Get Set(ByVal value As Single) If value < 0 Or value > 1 Then Throw New ArgumentOutOfRangeException("Saturation") End If Me.m_saturation = value End Set End Property Public Property Value() As Single Get Return Me.m_value End Get Set(ByVal value As Single) If value < 0 Or value > 1 Then Throw New ArgumentOutOfRangeException("Value") End If Me.m_value = value End Set End Property Public Shared Function FromColor(ByVal c As Color) As HSVColor Dim r As Single = c.R Dim g As Single = c.G Dim b As Single = c.B Dim min As Single = r If min > g Then min = g If min > b Then min = b Dim max As Single = r If max < g Then max = g If max < b Then max = b Dim hsv As New HSVColor If max = min Then 'Hue is undefined hsv.Hue = 0.0! ElseIf max = r Then If g >= b Then hsv.Hue = 60.0! * (g - b) / (max - min) Else hsv.Hue = 60.0! * (g - b) / (max - min) + 360.0! End If ElseIf max = g Then hsv.Hue = 60.0! * (b - r) / (max - min) + 120.0! Else 'max = b hsv.Hue = 60.0! * (r - g) / (max - min) + 240.0! End If If max = 0 Then hsv.Saturation = 0.0! Else hsv.Saturation = 1.0! - (min / max) End If hsv.Value = max / 255.0! Return hsv End Function Public Function ToColor(Optional ByVal alpha As Byte = 255) As Color Dim h As Integer = Floor(Me.Hue / 60.0!) If h = 6 Then h = 0 Dim f As Single = (Me.Hue / 60.0!) - h Dim p As Single = Me.Value * (1.0! - Me.Saturation) Dim q As Single = Me.Value * (1.0! - f * Me.Saturation) Dim t As Single = Me.Value * (1.0! - (1.0! - f) * Me.Saturation) Dim r As Integer Dim g As Integer Dim b As Integer Select Case h Case 0 : r = Round(Me.Value * 255.0!) : g = Round(t * 255.0!) : b = Round(p * 255.0!) Case 1 : r = Round(q * 255.0!) : g = Round(Me.Value * 255.0!) : b = Round(p * 255.0!) Case 2 : r = Round(p * 255.0!) : g = Round(Me.Value * 255.0!) : b = Round(t * 255.0!) Case 3 : r = Round(p * 255.0!) : g = Round(q * 255.0!) : b = Round(Me.Value * 255.0!) Case 4 : r = Round(t * 255.0!) : g = Round(p * 255.0!) : b = Round(Me.Value * 255.0!) Case 5 : r = Round(Me.Value * 255.0!) : g = Round(p * 255.0!) : b = Round(q * 255.0!) End Select If r > 255 Then r = 255 If g > 255 Then g = 255 If b > 255 Then b = 255 Return Color.FromArgb(alpha, r, g, b) End Function Public Function Lighter(ByVal factor As Single) As HSVColor If factor < 0 Or factor > 1 Then Throw New ArgumentOutOfRangeException("factor") End If Me.Value = Me.Value + (1.0! - Me.Value) * factor Return Me End Function Public Function Darker(ByVal factor As Single) As HSVColor If factor < 0 Or factor > 1 Then Throw New ArgumentOutOfRangeException("factor") End If Me.Value = Me.Value * (1.0! - factor) Return Me End Function Public Shared Function AverageColor(ByVal hsv1 As HSVColor, ByVal hsv2 As HSVColor, Optional ByVal color1Weight As Single = 0.5!) As HSVColor Dim avg As New HSVColor Dim color2Weight As Single = 1 - color1Weight avg.Hue = (color1Weight * hsv1.Hue + color2Weight * hsv2.Hue) avg.Saturation = (color1Weight * hsv1.Saturation + color2Weight * hsv2.Saturation) avg.Value = (color1Weight * hsv1.Value + color2Weight * hsv2.Value) Return avg End Function End Class
Tu peux appliquer la méthode Darker sur tous les pixels de l'image en boucle.
-
Bonjour Fred,
Voici un dégradé vertical de rouge allant verts le noir :
' Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint Dim i As Integer Dim r As Double Dim v As Double Dim b As Double Dim pasV As Double Dim g As Graphics g = Me.CreateGraphics pasV = 100 / Me.Height * 2.55 ' = 255 couleur / 100 r = 255 ' dégradé vertical de "rouge à noir" v = 0 b = 0 For i = 0 To Me.Height Dim couleur As New Pen(Color.FromArgb(r, v, b), 0) g.DrawLine(couleur, 0, i, Me.Width, i) r = r - pasV Next i g.Dispose() End Sub '
Cordialement.
Joseph Attila PUSZTAY
EhJoe Logiciels Romans Ecrire- Proposé comme réponse EhJoe dimanche 6 mars 2011 08:51
- Marqué comme réponse Alex Petrescu mardi 8 mars 2011 11:46
-
Bonjour,
Merci EhJoe pour cet exemple de code !
Fred, est-ce que ça marche chez vous ?
Cordialement,
Alex
________________
Astuces pour Visual Studio 2010
XNA – Développement jeux vidéo
Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, SharePoint, WPF
Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.
-
Bonjour Fred,
Ah, voici le code pour faire un dégradé vertical de couleur en fonction de la couleur d'origine (j'avais mal lu ta question), alors on a juste besoin de lire un pixel :
Option Explicit On Public Class Form1 Private Declare Function GetPixel Lib "gdi32" Alias "GetPixel" _ (ByVal hdc As Int32, ByVal x As Int32, ByVal y As Int32) As Int32 Dim ev As System.Windows.Forms.PaintEventArgs = Nothing Dim crO, cvO, cbO As Integer Dim primo As Boolean = True Dim h As Integer Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown Using gr As Graphics = Graphics.FromHwnd(Me.Handle) Dim c As Color c = ColorTranslator.FromWin32(GetPixel(gr.GetHdc(), 1, 1)) ' pixel 1,1 crO = c.R cvO = c.G cbO = c.B gr.Dispose() End Using primo = False Call Form1_Paint(sender, ev) End Sub Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint If primo = True Then Exit Sub Dim cr As Double = crO Dim cv As Double = cvO Dim cb As Double = cbO Dim i As Integer Dim g As Graphics = Me.CreateGraphics Dim pasR As Double = cr / Me.Height Dim pasV As Double = cv / Me.Height Dim pasB As Double = cb / Me.Height For i = 0 To Me.Height Dim couleur As New Pen(Color.FromArgb(cr, cv, cb), 0) g.DrawLine(couleur, 0, i, Me.Width, i) cr = cr - pasR cv = cv - pasV cb = cb - pasB Next g.Dispose() h = Me.Height End Sub Sub Form1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize If Me.Height < h Then Call Form1_Paint(sender, ev) End Sub End Class
Cordialement.
Joseph Attila PUSZTAY
EhJoe Logiciels Romans Ecrire