Announcement

Collapse
No announcement yet.

Farbügergang per Code erstellen?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Farbügergang per Code erstellen?

    Hallo,

    ich würde gerne per Code einen Farbübergang erstellen, damit ich bspw. bei der Farbe DeepSkyBlue die Farbe LightSkyBlue herauskriege, also ein wenig heller, wie kann man das realisieren? Dabei sollte die Abweichung natürlich nie zu groß werden und am besten halt so, das es bei jeder Farbe ungefähr gleich wirkt, geht das?
    Das will ich machen, weil der Benutzer die Farbe auswählen kann und somit kann ich nicht einfach LightSkyBlue nehmen.

  • #2
    Eine Möglichkeit wäre das du deine Farbe von RGB nach HSV oder HSL umrechnest.

    Im HSV, bzw. HSL kannst du die Farbübergänge wesentlich einfacher gestalten. Für einen Übergang von Cyan zu Blau muss man einfach nur den Farbwert (Hue) ändern.
    Wenn eine Farbe dunkler werden soll dreht man einfach am Hellwert (Value)

    Die Umwandlung von RGB und zurück musst du dir nicht selber ausdenken, das haben andere schon gemacht. Hier zwei Beispiele:
    Manipulating colors in .NET
    Farbkonvertierung RGB <-> HSV und RGB <-> CIE-Lab

    Zum Ausprobieren kannst du z.B. diese Seite nehmen: Online Colorizer
    Es gibt aber noch sehr viele andere Seiten, die das Gleiche machen.

    Gruss
    Attached Files

    Comment


    • #3
      Hey,

      meine Werte liegen derzeit in RGB vor. (Hexadezimal ist doch RGB, richtig?)
      Könnte man das denn auch irgendwie über die Hexadezimale Farbedefintion machen oder wäre da HSV / HSl die einfachste Möglichkeit? Wenn ich jetzt bei dieser HSL Definition, die ich übrigens vorher noch nicht kannte immer diesen Wert, bspw. von DeepSkyBlue ausgehen um 5 verringere, entspricht das dann bei jeder Farbe ungefähr demselben aussehen? Dardurch wird DeepSkyBlue ja dann heller.

      Wäre das Vorgehen dann so:
      1. Ich nehme meinen Farbwert, denn ich heller haben will, also z.B DeepSkyBlue (RGB Wert) und konvertiere denn dann zu einem HSV Wert.
      2. Bei diesen Wert subtrahiere ich dann den H (Hue Wert) z.B mit Minus 5, der ja der Winkel ist, richtig? Könnte man das ganze dann auch einfach so machen, mit diesem Beispiel hier: http://www.mycsharp.de/wbb2/thread.php?threadid=78941

      Code:
      public static double[] RGB2HSV(Color color)
      {
          if (color == Color.Empty) throw new ArgumentException();
          //-----------------------------------------------------------------
          // RGB in [0,255] -> RGB in [0,1]:
          double r = color.R / 255d;
          double g = color.G / 255d;
          double b = color.B / 255d;
      
          double max = Math.Max(r, Math.Max(g, b));
          double min = Math.Min(r, Math.Min(g, b));
      
          double h = 0;
          if (max == r)
          {
              if (g > b)
                  h = 60 * (g - b) / (max - min);
              else if (g < b)
                  h = 60 * (g - b) / (max - min) + 360;
          }
          else if (max == g)
              h = 60 * (b - r) / (max - min) + 120;
          else if (max == b)
              h = 60 * (r - g) / (max - min) + 240;
      
          double s = (max == 0) ? 0 : 1 - min / max;
      
          return new double[] { h - 5, s, max }; // hier einfach -5 von h (Hue)?
      }
      Also, das man einfach bei return h -5 macht?

      3. Dann konvertiert man diesen Wert wieder zu RGB zurück und anschließend den RGB Wert zu einem Color Wert, denn den brauch man ja für ein Steuerelement oder liege ich da falsch? Soweit ich weiß, kann man ja nicht einfach einen Hexadezimalwert nehmen oder einen HSV Wert?

      Ich kenne mich mit dieser HSV Geschichte absolut nicht aus.
      Zuletzt editiert von Threin; 27.02.2015, 20:41.

      Comment


      • #4
        Ja dein Vorgehen wäre richtig.

        Die RGB Werte werden in Dezimal angegeben, eine Umrechnung in HEX sollte nicht wirklich ein Problem sein.
        Um im .NET eine "Color" zu erzeugen musst du den HSV Wert wieder in RGB umwandeln.


        Gruss

        Comment


        • #5
          Ich meinte übrigens den Helligkeitswert und nicht den Farbwert, du ja sicherlich auch oder?

          Wäre das den dann auch bei jeder Farbe immer die gleiche Wirkung, also wenn ich dem Helligkeitswert 5 hinzufüge? Anziehen wäre es ja bei dem Farbwert.

          Comment


          • #6
            Bei dem Begriff Farbübergang denkt man sicher nicht an eine Helligkeitsänderung

            Winforms hat aber eine eingebaute Funktionalität um die Helligkeit zu verändern (benutzt intern das HSL Farbmodell). Schau dir ControlPaint.Light bzw. ControlPaint.Dark an.

            Comment


            • #7
              Ja, das stimmt schon aber es ist ja trotzdem schon so eine Art von Übergang. Ich wusste auch nicht, wie ich das ganze sonst beschreiben sollte. So wie ich es jetzt habe finde ich es sehr gut.
              Bei der Möglichkeit von weiter oben kann man das ganze aber auch noch sehr viel beser anpassen, wobei die Überladung mit dem float Wert ja auch die Möglichkeit gibt, das direkt einzustellen aber das ist doch auch nur der Helligkeitswert, wenn ich micht nicht irre.

              Was würde denn dann passieren, wenn ich z.B Schwarz nehme? Bei der Variante von oben bewirkt das ja soweit ich das verstanden habe immer die gleiche Änderung, selbst bei Schwarz? Selbst das sollte die Farbe dann ein wenig heller werden, zu viel will ich ja auch nicht, da es sonst nicht aussieht.

              Comment


              • #8
                Was würde denn dann passieren, wenn ich z.B Schwarz nehme? Bei der Variante von oben bewirkt das ja soweit ich das verstanden habe immer die gleiche Änderung, selbst bei Schwarz?
                Die gleiche Änderung ist eine unpassende Bezeichnung, insbesondere da Farbwahrnehmung ja auch was subjektives ist Die Farbänderung ist prozentual. 10% (0.1f) weniger Helligkeit ist bei schwarz natürlich ganz anders wahrnehmbar als 10 Prozent weniger hell wenn ich schon fast bei weiß bin. Den Unterschied wird man also je nach Helligkeit der Ausgangsfarbe nicht mehr wahrnehmen können.

                Die Controls in Winforms die nicht von Windows selbst gezeichnet werden sondern wo das zeichnen tatsächlich Winforms übernimmt benutzen zum Beispiel zur Darstellung des Disabled Zustands die ControlPaint.LightLight Funktion. Und das funktioniert ja eigentlich bei den üblicherweise benutzen Farben für Text recht gut.

                Comment

                Working...
                X