2012-11-23 5 views
5

Mögliche Duplizieren:
“Distance” between colours in PHPerkennen, wenn Farbe in Reichweite ist

ich, wenn ein RGB-Wert ermitteln möchten eine bestimmte Farbe Rosa ist. Ich bin mir nicht sicher, wie ich damit verfahren soll, da es anscheinend keinen Bereich von RGB- oder Hexadezimalwerten gibt, die einer linearen Reihenfolge für Rosa folgen (ein Farbton von Pink ist 255, 182, 193; #FFB6C1, während ein anderer 238, 162, 173; #EEA2AD ist). Haben Sie eine Idee, was zu tun ist, vorausgesetzt, ich kenne die Anfangs- und Endwerte der RGB/Hex-Werte meines Bereichs?

+0

Versuchen Sie, zu HSV zu konvertieren und dort Ihren Vergleich durchzuführen. –

+2

lesen Sie sorgfältig, bevor Sie dies eine duple Jungs markieren ... – goat

Antwort

10

Es sieht ziemlich linear zu mir aus. Allerdings müssen Sie ein wenig Farbtheorie verstehen.

Ich hoffe, dass Sie nichts dagegen haben, einschließlich einer einfachen Auffrischung der Farbenlehre hier, bevor Sie Ihre Frage beantworten. Aber es hilft, jede Lösung zu verstehen oder zu formulieren.

Erstens, ich bin sicher, die meisten werden das Farbrad erinnern sie sich im Kindergarten gelernt:

          Red 
     Red      Orange | Purple 
     |        \_|_/ 
     _o_  ---------->    _o_ 
    / \       /| \ 
    Yellow Blue     Yellow | Blue 
             Green 

Nun müssen wir es ein wenig ändern. Weil es sich herausstellt, dass Rot und Blau nicht wirklich Primärfarben sind, da Sie Rot bekommen können, indem Sie Magenta mit Gelb mischen und Sie können Blau erhalten, indem Sie Cyan mit etwas Rot mischen. So Der modifizierte Farbrad verwendet Druck Farben: CMY:

 Magenta 
    Red | Blue 
     \_|_/ 
      _o_ 
     /| \ 
    Yellow | Cyan 
     Green 

Dies ist im Grunde die HSV-Farbraum (mit S in der Regel von der Mitte zum Rand des Rades und V nicht in der Regel aufgetragen gehen aufgetragen überhaupt aber kann mit einem Schieberegler geändert werden). Es wird von den Druckfarben CMY abgeleitet. Wie kann uns das bei Bildschirmfarben RGB helfen?

Nun, wenn Sie genau hinschauen, werden Sie feststellen, dass es sich tatsächlich um eine Kombination aus Druck- und Bildschirmfarbraum handelt. Es zeigt tatsächlich die Beziehung zwischen CMY und RGB:

 Magenta     Magenta 
    Red | Blue    |   Red  Blue 
     \_|_/      |    \_ _/ 
      _o_   ==  _o_  +  o 
     /| \     / \    | 
    Yellow | Cyan   Yellow Cyan   | 
     Green         Green 

So kann jede RGB-Farbe durch das Verständnis dieses Farbrad zu verstehen. Zum Beispiel gibt es in RGB kein Gelb. Beachten Sie jedoch, dass Gelb das Gegenteil von Blau ist. Also, um Gelb Sie von einer Farbe blau subtrahieren:

rgb(100,80,10) is a "yellowish" version of rgb(100,80,120) 
      ^          ^

Sobald Sie diese Farbrad Arbeit mit RGB-Werten verstehen mehr Sinn macht. Mit genügend Übung können Sie Farben direkt in #rrggbb Syntax komponieren und bearbeiten, ohne eine Farbkarte zu konsultieren.

Also, um Ihre Frage zu beantworten. Sagen Sie Ihre Ziel Farbe Rosa ist:

rgb(255,182,193) 

Wir wissen, zwei Dinge über die Farbe "pink":

  1. Wir haben es als eine Art von Red Percieve. Es macht also Sinn, dass die Zielfarbe einen hohen Rotwert hat (tatsächlich ist es das Maximum).

  2. Wir empfinden es als sehr hellrot. Es macht also Sinn, dass die nicht-roten Komponenten auch ziemlich hoch sind (beide über 150).

Also, um Schatten nah an Ihre Zielfarbe zu bekommen wir brauchen:

  1. R-Wert deutlich höher als G oder B.
  2. Alle Werte recht hoch (über 150 oder so) .

Durch diese Definition wir rosa identifizieren können als:

// Pseudo code: 

is_pink (R,G,B) { 
    return R > 200 && // make sure R is high 
      G > 150 && // make sure G & B are relatively high 
      B > 150 && 
      R > G && // make sure G & B are not higher than R 
      R > B; 
} 

Wir eine weitere Bedingung hinzufügen „pink“ abzulehnen, indem Sie sicherstellen, leicht bläulich oder grünlich ist, dass G & B ziemlich ähnlich sind:

// Pseudo code: 

is_pink (R,G,B) { 
    return R > 200 && 
      G > 150 && 
      B > 150 && 
      R > G && 
      R > B && 
      abs(G-B) < 20; // make sure it's neither bluish or greenish 
} 

Sie können die Werte zwicken 200, 150 und 20 Ihren Geschmack von pinkishness passen, aber Sie werden sehen, dass, wenn wir gelten die obige Funktion, um sowohl Ihre Testfarben (255,182,193) und (238,162,173) werden sie beide als "pink" identifiziert.

+0

Dies ist eine der besten Antworten, die ich auf Stackoverflow gelesen habe. Vielen Dank. – JSHelp

Verwandte Themen