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%).
Original

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
30% 50%

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.
30% 50% 80%

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:

     
War es hilfreich?

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 ...

sein

Andere Tipps

Sie sollten einen Blick auf TintParams in GDI + (nicht Teil von .NET obwohl.) - was Sie suchen kann dies nur sein,

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top