2017-02-21 2 views
0

Ich möchte fragen, ob es möglich ist, zwischen RGB und einem kontinuierlichen Farbwert (wie in Float [0..1] oder Integer [0..255]) zu transformieren repräsentiert einen Farbbereich.Umwandlung zwischen RGB und einem Integer/Float Wert

Beispiel: Ich habe einen kontinuierlichen Farbbereich wie ein Regenbogen:

Red - Orange - Gelb - Grün - Blau - Indigo - Violet

-> dargestellt mit 0 ~ 1 oder 0 ~ 255 (oder egal welcher Bereich)

Und jetzt möchte ich den Wert zB umwandeln (0,5 = grün) auf einen gleichwertigen RGB-Wert ([0,1,0]?). Ist das mit einer Transferfunktion (zurück und vorwärts) möglich? Vielleicht in Python?

Antwort

2

Der ganze Grund, dass RGB 3 Zahlen benötigt, ist, weil es im Wesentlichen ein 3D-Raum ist. Sie würden versuchen, 3 ununterbrochene Zahllinien in 1 zu quetschen! Sie müssten eine Skala wählen, haben ein Spiel um wie unten die Farbmischung zu sehen, durch das Sie mögen ... (Code in VBA geschrieben, aber leicht tragbar)

For i = 1 To 255 
    ' Scale with no red, increase and decrease blue and green respectively 
    Range("a" & i).Interior.Color = RGB(0, i, 255 - i) 
    ' Use a MOD function to keep the values between 0 and 255 
    ' note this can cause some abrupt changes in your scale 
    Range("b" & i).Interior.Color = RGB(128 + i Mod 255, i, 255 - i) 
    ' You can increase and decrease different RGB values for desired result 
    Range("c" & i).Interior.Color = RGB((255 - i) Mod 255, (0 + i) Mod 255, i)  
Next i 

Output (Spalten in Zeilen für besser gemacht Betrachten Sie hier):

Colour bands

so von RGB in einem 1D-Skala gehen (wie die oben) können Sie nur i als einzige Variable haben, würden Sie eine Lookup speichern könnte, wenn man wollte oder eine Funktion erstellen, die macht wie jede Zeile oben, die Farbe aus einem einzelnen Wert von i erstellen.

Die Rückkehr von dieser 1D-Skala in eine 3D-Skala ist technisch unmöglich. Sie haben die zusätzlichen Informationen verloren, die Sie benötigen. Wenn Sie jedoch Ihre Zuordnungsfunktion zum Erstellen der Skala kennen, können Sie einfach jeden RGB-Wert an der entsprechenden Eingabe abrufen.

Hoffe, das hilft.

+0

Danke, Sie sind völlig richtig. Es ist schwierig, mit einem _i_ über alle möglichen Farben zu iterieren. Als ich in Photoshop nachgeschaut habe, habe ich einen Farbmanager gefunden, der alle möglichen Farben in einem "Kreis" (ohne Helligkeit) durchläuft: [link] (https://picload.org/image/rlgwlcci/screenshot2017-02-2116.15 .26.png) Es beginnt mit Rot (0,0,256) und endet mit dem gleichen Rotwert, während es _i_ mit 6 Umdrehungen erhöht/verringert ... also erzeugt es 6 Linien in den 3D RGB Räumen, während es die wichtigsten Punkte sammelt Farben. Ich versuche, daraus eine Übertragungsfunktion aufzubauen. – Rainflow

+0

Schön, klingt wie zwischen Ihrer Photoshop-Untersuchung und meiner Antwort Sie haben vielleicht ein funktionierendes System!Danke, dass du meine Antwort akzeptierst, wenn es dir geholfen hat, deine Lösung zu erreichen – Wolfie

0

Der einfachste Weg ist einfach, den RGB-Wert zu addieren, während jede Komponente gewichtet wird. Wenn Sie dies tun, erhalten Sie einen Bereich zwischen 0 und 16.777.215. ZB:

RGB Tuple = Hex Value = Decimal 
0,0,0 = 0x000000 = 0 
255,255,255 = 0xFFFFFF = 16777215 

Hier ist ein Online-Rechner, die jede einzelne Farbe konvertieren: https://www.shodor.org/stella2java/rgbint.html

-Code für Hex-Wandler in einer bestimmten Sprache über den Google wird alle. :)

Sie können einen beliebigen Zahlenraum verwenden (zB 0-1 oder was auch immer) und beliebig oft hin und her gehen, solange der von Ihnen gewählte Zahlenraum all diese über 16,7 Millionen einzigartigen Farben enthält.

Wenn Sie den Zahlenraum komprimieren, würden Sie einige Farben verlieren (wie das erste Poster erklärt).