Announcement

Collapse
No announcement yet.

Komplementärfarbe?

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

  • Komplementärfarbe?

    Hi zusammen!<br>
    Ich brauche eine Funktion, die mir zu einer Farbe
    eine optisch möglichst "andere" liefert, um eine
    Selektion in einer Graphik darzustellen.
    Ich habe mich jetzt schon einige Zeit mit xor, RGB-Tripeln,
    HSV und Lab rumgeschlagen, finde aber einfach nichts rundum Taugliches.
    <p>Eine Alternative wäre, mich auf zwei Selektionsfarben festzulegen,
    und dann basierend auf der Hintergrundfarbe die "auffälligere"
    zu nehmen. Auch da hab ich keine zufriedenstellende Lösung gefunden.
    <p>
    Hat da jemand eine Idee für mich? Oder einen ganz anderen Vorschlage?
    Danke im Voraus,<br>Uli.

  • #2
    Hallo!<br>
    Also ich finde, daß KomplFarbe = farbe xor $00FFFFFF recht brauchbare Ergebnisse liefert.<br>
    BYE BERN

    Comment


    • #3
      Hi Bernd,<br>
      danke für die Idee. Leider funktioniert das für Grautöne nicht besonders -- probier mal clGray.
      <br>
      Fürs Rumprobieren hab ich mir aber grad eine kleine Anwendung mit einem TColorGrid zusammengebastelt. Irgendwann ist dann der Groschen gefallen: Das ColorGrid schreibt sein "VG" bzw. "HG" natürlich auch mit Kontrastfarben. Dessen Vorgehen hab ich extrahiert:
      <pre class="sourcecode"><code>
      <b>type</b>
      TColorRec = <b>record</b>
      r, g, b, a: Byte;
      <b>end</b>;
      <br>
      <b>function</b> Gegenfarbe3(c: TColor): TColor;
      <b>var</b>
      cr: TColorRec absolute c;
      <br>
      <b>procedure</b> Plaette(<b>var</b> b: Byte);
      <b>begin</b>
      <b>if</b> b &gt;= $80 <b>then</b>
      b := 0
      <b>else</b>
      b := $FF;
      <b>end</b>;
      <br>
      <b>begin</b>
      c := ColorToRGB(c);
      Plaette(cr.r);
      Plaette(cr.g);
      Plaette(cr.b);
      Result := c;
      <b>end</b>;
      </code></pre>
      Das ist auch nicht perfekt (clFuchsia auf clGreen ist <b>nicht</b>schön :-)), aber es geht einigermaßen.
      <p>Danke, Uli

      Comment


      • #4
        Der beste Weg baut imho auf dem Lösungsansatz von Hagen Reddmann im Thread "Farben sortieren" auf.
        Die Helligkeit einer Farbe läßt sich demnach so bestimmen:
        Helligkeit := R * 0.27 + G * 0.55 + B * 0.20;

        Dazu kommt dann noch die Idee mit der Gegenfarbe:
        <PRE>function KontrastColor(AColor: TColor): TColor;
        var
        Hell: Integer;
        Color: Integer;
        begin
        Color := Color and $00FFFFFF;
        Hell := Round(
        ((Color shr 16) and $FF) * 0.20 +
        ((Color shr 8) and $FF)* 0.55 +
        (Color and $FF) * 0.27);
        if Hell &gt; 130 then
        Result := clBlack
        else
        Result := clWhite;
        end;</PRE>

        Da die Helligkeit durch die Faktoren nach Wahrnehmung bewertet wird passt das eigentlich immer ganz gut, zudem erspart man sich den Augenkrebs

        MfG,
        Dir

        Comment


        • #5
          Hi Dirk,
          ich hab deinen Code noch etwas "angepasst" -- insbesondere den Übergabeparameter
          in der Routine auch <b>verwendet</b> :-)

          <pre class="sourcecode"><code>
          <b>function</b> ColorBrightness(AColor: TColor): Integer;
          <b>var</b>
          cr: TColorRec;
          <b>begin</b>
          cr := TColorRec(ColorToRGB(AColor));
          Result := Round(cr.r * 0.27 + cr.g * 0.55 + cr.b * 0.20);
          <b>end</b>;
          <br>
          <b>function</b> ContrastColor(AColor: TColor): TColor;
          <b>begin</b>
          <b>if</b> ColorBrightness(AColor) &gt; 130 <b>then</b>
          Result := clBlack
          <b>else</b>
          Result := clWhite;
          <b>end</b>;
          </code></pre>

          Das funktioniert jetzt gut:<ul>
          <li>Ich verwende insgesamt nur zwei Selektionsfarben -- ist für den Anwender klarer.
          <li>Dank der "menschlichen" Formel für die Helligkeit <b>sieht</b> man die Selektion auch.
          Vermutlich hat dieser Wahrnehmungsfaktor bei meinen bisherigen Versuchen immer gefehlt.
          </ul>

          Ciao, Uli

          Comment


          • #6
            Korrekt, man bezeichnet diese Faktoren auch als die Wärme einer Farbe. Man sieht das deren relative Helligkeit/Sättignung zu einander ziemlich unterschiedlich ist. Deshalb muß man bei Farbumrechnungen eigentlich immer diese Wichtung berücksichtigen. Für die einzelnen Wichtungen gibt es aber verschiedene Konstanten, die entweder die Helligkeit/Sättigung/Farbempfinden usw. beschreiben. Meie obigen Werte beschreiben das physiologische Hellichkeitsempfinden des Menschens. Ich habe damit die besten Erfahrungen gemacht, zB. bei der Konvertierung von Farbimages in Graustufen Images.

            Gruß Hage

            Comment

            Working...
            X