Color aufhellen

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Koopakiller.

    Color aufhellen

    Heyho,

    Ich versuche mich gerade an dem aufhellen einer vom User bestimmten Farbe. Verwende dazu folgenden Ansatz(Dazu ist zu sagen dass ich zum Programmieren immer ein Beispiel habe). Dabei handelt es sich um die RGB-Werte:

    Farbe1: 21, 45, 78
    Farbe2: 121, 77, 34

    -> "Differenz bilden": (Farbe1 - Farbe2 =Dif):
    -100, -32, 45
    Nun das Umrechnen auf die User-bestimmte Farbe:
    z.B: Userfarbe: 250, 41, 12
    250 - (-100) = 350
    41 - (-32) = 73
    12 - 45 = -33 :(

    Logik-Schluss -> (Farbe2 = Userfarbe - Dif)

    Bloß wenn ich dann unter 0 komme habe ich dann ein Problem: Exception...

    Danke für eure Hilfe

    8-) faxe1008 8-)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „faxe1008“ ()

    Hallo, ich verstehe nun nicht so ganz was du vor hast. Was genau soll die Differenz genau bewirken? Denn diese hat mit aufhellen rein garnichts zu tun. Bei einem richtigen aufhellen müsste man eine Art 3-Satz bilden:
    0 = 0%
    255 = 100%

    finde den wert bei 50% Helligkeit. Wobei alle Werte, die Kleiner sind als der aktuelle, eine verdunklung hervorrufen.

    PS: auch Ergebnisse wie 350 würden theoretisch fehler erzeuigen, wenn du nicht vorher ein Byte draus castest. Denn die Wertebereich gehen von einschließlich 0 bis einschließlich 255.
    Ich habe im Internet diesen Code gefunden, um aus HSB-Werten eine normale RGB-Farbe zu errechnen:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Shared Function ColorFromAHSB(ByVal A As Integer, ByVal H As Single, ByVal S As Single, ByVal B As Single) As Color
    2. If A < 0 OrElse A > 255 Then
    3. Throw New ArgumentOutOfRangeException("A", A, "A von 0 bis 255")
    4. End If
    5. If H < 0 OrElse H > 360 Then
    6. Throw New ArgumentOutOfRangeException("H", A, "H von 0 bis 360")
    7. End If
    8. If S < 0 OrElse S > 1 Then
    9. Throw New ArgumentOutOfRangeException("S", A, "S von 0 bis 1")
    10. End If
    11. If B < 0 OrElse B > 1 Then
    12. Throw New ArgumentOutOfRangeException("B", A, "B von 0 bis 1")
    13. End If
    14. If S = 0 Then
    15. Dim TempB = Convert.ToInt32(B * 255)
    16. Return Color.FromArgb(A, TempB, TempB, TempB)
    17. End If
    18. Dim FMax As Single
    19. Dim FMin As Single
    20. If B > 0.5 Then
    21. FMax = B - (B * S) + S
    22. FMin = B + (B * S) - S
    23. Else
    24. FMax = B + (B * S)
    25. FMin = B - (B * S)
    26. End If
    27. If H = 360 Then
    28. H = 0
    29. End If
    30. Dim ISextant = Convert.ToInt32(Math.Floor(H / 60))
    31. If H >= 300 Then
    32. H -= 360
    33. End If
    34. H = H / 60
    35. H -= 2 * Convert.ToInt32(Math.Floor(((ISextant + 1) Mod 6) / 2))
    36. Dim FMid As Single
    37. If (ISextant Mod 2) = 0 Then
    38. FMid = H * (FMax - FMin) + FMin
    39. Else
    40. FMid = FMin - H * (FMax - FMin)
    41. End If
    42. Dim IMax = Convert.ToInt32(FMax * 255)
    43. Dim IMid = Convert.ToInt32(FMid * 255)
    44. Dim IMin = Convert.ToInt32(FMin * 255)
    45. Select Case ISextant
    46. Case 0
    47. Return Color.FromArgb(A, IMax, IMid, IMin)
    48. Case 1
    49. Return Color.FromArgb(A, IMid, IMax, IMin)
    50. Case 2
    51. Return Color.FromArgb(A, IMin, IMax, IMid)
    52. Case 3
    53. Return Color.FromArgb(A, IMin, IMid, IMax)
    54. Case 4
    55. Return Color.FromArgb(A, IMid, IMin, IMax)
    56. Case 5
    57. Return Color.FromArgb(A, IMax, IMin, IMid)
    58. End Select
    59. End Function


    Um jetzt die Farbe aufzuhellen, nimmst Du das:

    VB.NET-Quellcode

    1. Dim NewBrightness = BaseColor.GetBrightness + DeinWert
    2. If NewBrightness > 1 Then
    3. NewBrightness = 1 'Darf nicht größer als 1 sein (Weiße Farbe kann nicht aufgehellt werden).
    4. End If
    5. Dim NewColor = ColorFromAHSB(BaseColor.A, BaseColor.GetHue, BaseColor.GetSaturation, NewBrightness)
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Hab mir mal das "gebastelt" (nicht der sauberste Code-Stil):
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Function Dark_Color(ByVal Col As Color, ByVal percent As Integer) As Color
    2. Dim p As Integer = 100 - percent
    3. Dim r As Integer = Col.R
    4. Dim g As Integer = Col.G
    5. Dim b As Integer = Col.B
    6. r = CInt((r / 100) * p)
    7. g = CInt((g / 100) * p)
    8. b = CInt((b / 100) * p)
    9. Return Color.FromArgb(r, g, b)
    10. End Function
    11. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    12. Dim coo As New ColorDialog
    13. If coo.ShowDialog = Windows.Forms.DialogResult.OK Then
    14. PictureBox1.BackColor = coo.Color
    15. End If
    16. End Sub
    17. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    18. PictureBox1.BackColor = Dark_Color(PictureBox1.BackColor, 10)
    19. End Sub


    Zum Abdunkeln funktioniert das tadellos doch wie kann ich das aufhellen bewerkstelligen ?

    Edit: Mensch bin ich blind :whistling: einfach -10 einsetzen...

    EDIT2: Aber wenn nun einer der RGB werte so etwa bei Fünf ist wird die Farbe nicht mehr heller ;(

    8-) faxe1008 8-)
    1. Warum benutzt du nicht die Lösung mit HSB? Das geht viel einfacher, du musst nur den B-Wert erhöhen.
    2. Prozent wird nicht von 1-100 , sondern von 0.01 - 1.0 dargestellt
    @nafets3646
    Die Lösung mit HSB mag zwar gut sein wenn man den Farbton usw. ändern möchte, aber bei so etwas schmeißt man nur leistung weg, weil wieder alles relativ kompliziert umgerechnet werden muss.

    @faxe1008
    Dein Code scheint grundsätzlich nicht ganz falsch zu sein, nur kämpfst du wahrscheinlich gerade mit den Rundungsfehlern in .NET und einigen anderen Problemchen. Ich habe vor ewigkeiten mal einen Shadereffekt geschrieben, der auch so eine Aufhellen/Verdunkeln Eigenschaft hatte. Der Code in VB.NET übersetzt sieht so aus:

    VB.NET-Quellcode

    1. Private Function Dark_Color(ByVal Col As Color, ByVal percent As Double) As Color
    2. If (percent = 0.5) Then
    3. Return Col
    4. ElseIf (percent > 0.5) Then
    5. Return Color.FromArgb(Col.A, (255 - Col.R) * ((percent - 0.5) * 2) + Col.R, (255 - Col.G) * ((percent - 0.5) * 2) + Col.G, (255 - Col.B) * ((percent - 0.5) * 2) + Col.B)
    6. Else
    7. Return Color.FromArgb(Col.A, Col.R * percent * 2, Col.G * percent * 2, Col.B * percent * 2)
    8. End If
    9. End Function

    Zwischen 0 und 0,5 wird verdunkelt, 0,5 wird ignoriert und zwischen 0,5 bis 1 wird aufgehellt.