none
dégradé dans une pictureBox RRS feed

  • 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
    mercredi 2 mars 2011 13:34

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
    dimanche 6 mars 2011 08:51

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
    mercredi 2 mars 2011 15:47
  • 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
    mercredi 2 mars 2011 15:54
  • Bonjour,

    Merci Joe pour ton exemple mais il dessine par dessus mon image (

     g.DrawLine(couleur, 0, i, x, i)

    )

    Ce que j'aimerais c'est faire passer les pixels de leur couleur initiale vers le noir soit 255.

     


    fred
    vendredi 4 mars 2011 13:57
  • 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
    vendredi 4 mars 2011 14:31
  • 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.

     

    vendredi 4 mars 2011 14:49
  • 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
    dimanche 6 mars 2011 08:51
  • Bonjour,

     

    Merci EhJoe pour cet exemple de code !

    Fred, est-ce que ça marche chez vous ?

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur MSDN !

    Windows Phone 7

    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.

     

     


    Suivez MSDN sur Twitter 

    lundi 7 mars 2011 10:52
  • 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
    mardi 8 mars 2011 13:55