Question

Je Emuler essayer Tint Effet Open XML. Ce qu'il fait est de changer la teinte des pixels dans une image en changeant la teinte. Il faut 2 paramètres: 1) le hue (en degrés) et 2) la amt (la quantité, en pourcentage). Il est # 2 que je vais avoir des problèmes avec. Les états spécifications:

  

Tint : effet transpose les valeurs de couleur soit vers ou à l'écart de teinte par le   quantité spécifiée.

     
      
  • amt (montant) -. Indique de combien la valeur de couleur est décalée
  •   
  • teinte (Hue) -. Indique la teinte vers laquelle pour teinter
  •   

Jamais la construction de garde XML, je peux imiter des valeurs qui ont un amt de 100%. Ainsi, par exemple, si je veux bleu (couleur: 240 °), je peux créer ce ( Tinted un). Voici un exemple:

Original et teinté (teinte = 240, Montant = 100%).
Original

Ceci est réalisé simplement en réglant la teinte à 240, en gardant la saturation et la luminance de la même et la conversion de RVB et l'écriture de chaque pixel.

Voici ce que je ne peux pas atteindre si:

Hue = 240 ( bleu ), la quantité = 30% , 50% et 80% , respectivement
30% 50%

Encore une fois, dit la spécification pour Amount par Précise combien la valeur de couleur est décalée . J'ai essayé toutes sortes de façons ici pour obtenir ce travail, mais ne peut pas sembler (hue=hue*amount, originalhue * amount + hue, etc.)

D'autres exemples: Hue = 120 ( vert ), la quantité = 30% , 50 % , 80% et 100% , respectivement. 100% que je peux obtenir.
30% 50% 80%

Voici quelques listes de valeurs d'un pixel dans les images ci-dessus:

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 - Photos Vert

        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


Alors, la question est: Est-ce que quelqu'un sait comment cela devrait fonctionner

  

Note: Ceci est pas un double de:

     
Était-ce utile?

La solution

Je suis tout à fait certain que vos résultats problème de la façon dont vous INTERPOLATION angles. Voici une fonction d'interpolation (écrit en python) qui devrait faire l'affaire. Il est basé sur une suggestion du forum XNA fil 2D Angle Shortest 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

Maintenant, interpolate(originalHue,hue,amount) devrait produire le résultat souhaité.

Edit: Je crois comprendre que votre objectif est de faire tourner la teinte d'origine vers une certaine teinte cible par une quantité donnée. Je suis sûr que vous êtes déjà familier avec cela, mais pour l'amour d'illustration, voici une roue chromatique.


(source: sapdesignguild.org )

Le problème est que le mélange (ou interpoler) deux angles n'est pas trivial, donc le code comme hue = ((hue - originalHue) * amount) + originalHue ne fonctionnera pas. Il y a un nombre infini de façons dont vous pouvez aller d'un angle à l'autre en raison de la wraparound à 360 °. Pour obtenir de 0 ° à 60 °, vous pouvez tourner à 60 ° dans le sens antihoraire, 420 ° dans le sens antihoraire, 300 ° dans le sens horaire, etc. En général, le plus court angle est le souhaitee.

Par exemple, permet de prendre en compte les cols de pingouin: si (orange) votre teinte d'origine est de 30 °, votre cible est de 240 ° (bleu) et le montant est de 50%, vous obtiendrez les résultats suivants:

//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)

Je pense que le second résultat est celui que vous recherchez, mais je peux me tromper et l'erreur pourrait être un autre endroit tout à fait ...

Autres conseils

Vous devriez jeter un oeil à TintParams dans GDI + (ne fait pas partie de .NET bien.) - cela peut être tout ce que vous cherchez

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top