none
VB 2010 – Comment modifier le niveau de luminosité d’une couleur RRS feed

  • Question

  • Bonjour à tous,

    Pour modifier une couleur je passe une instruction du type :

    New SolidBrush(Color.FromArgb(255, 195, 135, 47)) ' Brown

    Mais si je veux modifier la lumière sans modifier ni sa teinte ni la saturation (TSL) dans cette couleur, je ne voie comment faire. L’instruction ci-dessus le permet mais au prix de beaucoup de travail surtout si l’on répète l’opération avec plusieurs couleurs. N’y a-t-il pas une instruction qui modifie directement les valeurs TSL de la couleur ?

    L’instruction ci-dessous permet de lire facilement le niveau de luminosité dans la couleur mais n’autorise pas une opération en écriture !

             Dim couleur As Color = Color.FromArgb(255, 195, 135, 47)

             MsgBox(couleur.GetBrightness.ToString)

    Je m’attendais à trouver une instruction de type SetBrightness, hélas rien.

    Que puis-je faire ? Merci pour votre aide.<//span>

    Cordialement

    SL

    vendredi 19 décembre 2014 07:38

Réponses

Toutes les réponses

  • Bonjour,

    If faut convertir votre couleur en HSL, diminuer le L puis reconvertir en RGB.

    Code ici.


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    vendredi 19 décembre 2014 14:17
  • Bonjour Richard,

    Merci pour ce coup de pouce.

    J’ai réalisé une petite application destinée à mettre en exergue ou à mieux appréhender le processus.

    Voici le code, celui-ci doit être placé dans un projet WinForm. Encore merci

    ' Comment modifier la luminosité d'une couleur

    ‘ Le processus de gestion des couleurs est issu de : ProgrammingTips@GeekyMonkey.com

    ‘ L’article y faisant référence est : RGB to HSL / HSL to RGB in C#

    Public Class Form1

    #Region "Initialisation du formulaire"

        Sub New()

            InitializeComponent()

            Me.StartPosition = FormStartPosition.Manual

            Me.SetBounds(250, 20, 600, 180)

            Me.Cursor = Cursors.Hand

            Me.DoubleBuffered = True

            Me.Text = "Comment modifier la luminosité d'une couleur"

            AddHandler Me.DoubleClick, AddressOf Me.Close

        End Sub

    #End Region

    #Region "Gestion du processus"

        Private Sub Form1_Click(sender As Object, e As System.EventArgs) Handles Me.Click

            For L As Double = 0 To 1 Step 0.01

                ' Modification de la luminosité du rectangle (cadre grisé)

                RcColor = HSL2RGB(128, 128, L)

                Me.Invalidate()

                Application.DoEvents()

                System.Threading.Thread.Sleep(100)

                Msg1 = CType(L, String)

            Next

            Me.Text = "Processus terminé, fermeture dans 5 secondes."

            Beep()

            System.Threading.Thread.Sleep(5000)

            Me.Close()

        End Sub

    #End Region

    #Region "Gestion de l'affichage"

        Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint

            Call RcLumDraw(e)

            Call MsgsDraw(e)

        End Sub

        Dim RcColor As Color

        Private Sub RcLumDraw(e As System.Windows.Forms.PaintEventArgs)

            Dim RC As New Rectangle(19, 35, 300, 80)

            e.Graphics.FillRectangle(New SolidBrush(RcColor), RC)

            e.Graphics.DrawRectangle(Pens.Gray, RC)

        End Sub

        Dim Msg1 As String = "Aucune action lancée !"

        Dim Msg2 As String = "Cliquer une fois pour lancer le processus." & vbCrLf & "Double-cliquer pour quitter"

        Private Sub MsgsDraw(e As System.Windows.Forms.PaintEventArgs)

            e.Graphics.DrawString("> Valeur de la luminosité : " & Msg1, New Font("Arail", 11), Brushes.Brown, New Point(2, 15))

            e.Graphics.DrawString(Msg2, New Font("Arail", 9), Brushes.Black, New Point(2, Me.ClientSize.Height - 30))

        End Sub

    #End Region

    #Region "Gestion des couleurs"

        Public Structure ColorRGB

            Public R As Byte

            Public G As Byte

            Public B As Byte

            Public Sub New(value As Color)

                Me.R = value.R

                Me.G = value.G

                Me.B = value.B

            End Sub

            Public Shared Widening Operator CType(rgb As ColorRGB) As Color

                Dim c As Color = Color.FromArgb(rgb.R, rgb.G, rgb.B)

                Return c

            End Operator

            Public Shared Narrowing Operator CType(c As Color) As ColorRGB

                Return New ColorRGB(c)

            End Operator

        End Structure

        ' Given H,S,L in range of 0-1

        ' Returns a Color (RGB struct) in range of 0-255

        Public Shared Function HSL2RGB(h As Double, sl As Double, l As Double) As ColorRGB

            Dim v As Double

            Dim r As Double, g As Double, b As Double

            r = l

            ' default to gray

            g = l

            b = l

            v = If((l <= 0.5), (l * (1.0 + sl)), (l + sl - l * sl))

            If v > 0 Then

                Dim m As Double

                Dim sv As Double

                Dim sextant As Integer

                Dim fract As Double, vsf As Double, mid1 As Double, mid2 As Double

                m = l + l - v

                sv = (v - m) / v

                h *= 6.0

                sextant = CInt(Math.Truncate(h))

                fract = h - sextant

                vsf = v * sv * fract

                mid1 = m + vsf

                mid2 = v - vsf

                Select Case sextant

                    Case 0

                        r = v

                        g = mid1

                        b = m

                        Exit Select

                    Case 1

                        r = mid2

                        g = v

                        b = m

                        Exit Select

                    Case 2

                        r = m

                        g = v

                        b = mid1

                        Exit Select

                    Case 3

                        r = m

                        g = mid2

                        b = v

                        Exit Select

                    Case 4

                        r = mid1

                        g = m

                        b = v

                        Exit Select

                    Case 5

                        r = v

                        g = m

                        b = mid2

                        Exit Select

                End Select

            End If

            Dim rgb As ColorRGB

            rgb.R = Convert.ToByte(r * 255.0F)

            rgb.G = Convert.ToByte(g * 255.0F)

            rgb.B = Convert.ToByte(b * 255.0F)

            Return rgb

        End Function

        ' Given a Color (RGB Struct) in range of 0-255

        ' Return H,S,L in range of 0-1

        Public Shared Sub RGB2HSL(rgb As ColorRGB, ByRef h As Double, ByRef s As Double, ByRef l As Double)

            Dim r As Double = rgb.R / 255.0

            Dim g As Double = rgb.G / 255.0

            Dim b As Double = rgb.B / 255.0

            Dim v As Double

            Dim m As Double

            Dim vm As Double

            Dim r2 As Double, g2 As Double, b2 As Double

            h = 0

            ' default to black

            s = 0

            l = 0

            v = Math.Max(r, g)

            v = Math.Max(v, b)

            m = Math.Min(r, g)

            m = Math.Min(m, b)

            l = (m + v) / 2.0

            If l <= 0.0 Then

                Return

            End If

            vm = v - m

            s = vm

            If s > 0.0 Then

                s /= If((l <= 0.5), (v + m), (2.0 - v - m))

            Else

                Return

            End If

            r2 = (v - r) / vm

            g2 = (v - g) / vm

            b2 = (v - b) / vm

            If r = v Then

                h = (If(g = m, 5.0 + b2, 1.0 - g2))

            ElseIf g = v Then

                h = (If(b = m, 1.0 + r2, 3.0 - b2))

            Else

                h = (If(r = m, 3.0 + g2, 5.0 - r2))

            End If

            h /= 6.0

        End Sub

    #End Region

    #Region "Gestion du déplacement du formulaire"

        'Dim IsMouseDown As Boolean

        'Dim MouseDownPosition As Point

        'Private Sub Form1_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown

        '    If Not e.Button = Windows.Forms.MouseButtons.Left Then Exit Sub

        '    MouseDownPosition = e.Location

        '    IsMouseDown = True

        'End Sub

        'Private Sub Form1_MouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove

        '    If Not IsMouseDown Then Exit Sub

        '    Dim MouseMovePosition As New Point(e.Location)

        '    Me.Location = Me.Location + MouseMovePosition - MouseDownPosition

        'End Sub

        'Private Sub Form1_MouseUp(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp

        '    If Not e.Button = Windows.Forms.MouseButtons.Left Then Exit Sub

        '    IsMouseDown = False

        'End Sub

    #End Region

    End Class

    Cordialement

    SL

    samedi 20 décembre 2014 07:27
  • Super.

    Merci de proposer ma réponse comme réponse ;-)


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    samedi 20 décembre 2014 08:44