Tönungs zu oder weg von einem Hue um einen bestimmten Prozentsatz
Frage
Ich versuche, emulieren die Tint Effekt von Open XML. Was sie tut, ist die Farbe der Pixel in einem Bild ändern, indem Sie den Farbton zu verschieben. Es nimmt 2 Parameter: 1) die hue
(in Grad) und 2) die amt
(die Menge, ein Prozentsatz). Es ist # 2, dass ich habe Probleme mit. Die Spezifikation lautet:
Tint : Verschiebt Effekt Farbwerte entweder zu oder weg von Farbton durch die angegebenen Betrag.
- amt (Betrag) -. Gibt an, um wie viel der Farbwert verschoben wird,
- Farbe (Hue) -. Gibt den Ton gegenüber dem tönen
Sie niemals den XML Bau zu kümmern, kann ich Werte emulieren, die eine amt
von 100% aufweisen. So zum Beispiel, wenn ich Blue (Farbton: 240 °) will, ich kann das schaffen (die Getönte ein). Hier ein Beispiel:
Original und Getönte (Farbton = 240, Höhe = 100%).
Dies wird erreicht, indem einfach den Farbton auf 240 einstellen, halte Sättigung und Helligkeit gleich und Umwandlung in RGB und jedes Pixel zu schreiben.
Hier ist, was ich nicht erreichen kann, obwohl:
Hue = 240 ( blau ), Betrag = 30% , 50% und 80% , die jeweils
Wieder sagt die Spezifikation für Amount
Gibt an, um wie viel der Farbwert verschoben wird, . Ich habe alle möglichen Arten hier versucht, dies zu Arbeit zu bekommen, kann aber nicht scheinen (hue=hue*amount
, originalhue * amount + hue
usw.)
Weitere Beispiele: Hue = 120 ( grün ), Betrag = 30% , 50 % , 80% und 100% ist. Die 100% , die ich bekommen kann.
Hier sind einige Wertelisten eines einzelnen Pixels in den Bildern oben:
Pixel 159, 116 - Blue Pictures
Hue Amount R G B | H S L Original 244 196 10 | 48 0.92 0.5 Blue 240 30% 237 30 45 | 356 0.85 0.52 Blue 240 50% 245 9 156 | 323 0.93 0.5 Blue 240 80% 140 12 244 | 273 0.91 0.5 Blue 240 100% 12 12 244 | 240 0.91 0.5
Pixel 159, 116 - Grün Bilder
Hue Amount R G B | H S L Original 244 196 10 | 48 0.92 0.5 Green 120 30% 211 237 30 | 68 0.85 0.52 Green 120 50% 159 237 30 | 83 0.85 0.52 Green 120 80% 81 237 29 | 105 0.85 0.52 Green 120 100% 29 237 29 | 120 0.85 0.52
Also, die Frage ist: Wer weiß, wie das funktionieren soll
Hinweis: Dies ist nicht ein Duplikat:
- Ändern der Farbton einer Bitmap während Erhaltung der Gesamt Helligkeit
- Drehen Hue mit Imageattributes in C #
- ... oder alles, was ich auf SO
finden konnte,
Lösung
Ich bin ziemlich sicher, dass Ihr Problem ergibt sich aus der Art und Weise Sie Winkel interpoliert werden. Hier ist eine Interpolationsfunktion (geschrieben in Python), die den Trick tun soll. Es basiert auf einem Vorschlag von XNA Forenthread Kürzeste 2D Winkel Interpolation .
def wrap(value, lower, upper):
distance = upper - lower
return value - ((value-lower)//distance)*distance
def shortestangle(a,b):
angle = wrap(b-a, 0, 360)
if angle>=180: angle -= 360
return angle
def interpolate(a,b,amount):
return (a+shortestangle(a,b)*amount)%360
Nun interpolate(originalHue,hue,amount)
sollte das gewünschte Ergebnis.
Edit: Es ist mein Verständnis, dass Ihr Ziel ist es, den ursprünglichen Farbton zu einem bestimmten Zielfarbton von einigem bestimmten Betrag zu drehen. Ich bin sicher, dass Sie mit diesem bereits vertraut sind, aber aus Gründen der Darstellung, hier ist ein Farbrad.
(Quelle: sapdesignguild.org )
Das Problem besteht darin, daß das Mischen (oder interpoliert) zwei Winkel sind nicht trivial, so wie hue = ((hue - originalHue) * amount) + originalHue
Code wird nicht funktionieren. Es gibt unendlich viele Möglichkeiten, wie Sie von einem Winkel zum anderen bei 360 wegen des Umwickeltyps ° gehen kann. Um von 0 ° bis 60 ° könnten Sie 60 ° gegen den Uhrzeigersinn drehen, 420 ° gegen den Uhrzeigersinn, 300 ° im Uhrzeigersinn usw. Normalerweise ist der kürzeste Winkel ist derjenige gewünscht wird.
Zum Beispiel läßt den Pinguin Hälse abwägen: Wenn Ihre ursprüngliche Farbton 30 ° (orange), Ihr Ziel ist 240 ° (blau) und die Menge beträgt 50%, würden Sie die folgenden Ergebnisse erhalten:
//Linear Interpolation
(30° + (240° - 30°)*0.5) = 135° (green)
//"Shortest 2D Angle Interpolation"
(30° + shortestangle(30°,240°)*0.5) % 360 = (30° + (-150°)*0.5) % 360 = 315° (magenta)
Meine Vermutung ist, dass das zweite Ergebnis ist, die Sie für suchen, aber ich kann falsch sein und der Fehler könnte ganz woanders ...
seinAndere Tipps
Sie sollten einen Blick auf TintParams in GDI + (nicht Teil von .NET obwohl.) - was Sie suchen kann dies nur sein,