一定の割合で色相に向かっている、または色合いから離れている

StackOverflow https://stackoverflow.com/questions/3097753

  •  29-09-2019
  •  | 
  •  

質問

エミュレートしようとしています 色合いの効果 オープンXMLの。それが行うことは、色相をシフトすることにより、画像のピクセルの色相を変更することです。 2つのパラメーターが必要です。1) hue (程度)および2) amt (金額、パーセンテージ)。私が問題を抱えているのは#2です。仕様の状態:

色合い: :指定された量によって色合いの色値をシフトします。

  • amt (金額) - 色の値がどれだけシフトされるかによって指定されます。
  • 色相 (色相) - 色合いの色合いを指定します。

XML構造を気にしないでください、私は amt 100%の。たとえば、青(色相:240°)が欲しい場合、これを作成できます( 着色 1)。これが例です:

オリジナル着色 (HUE = 240、金額= 100%)。
Original Modified

これは、色相を240に設定し、飽和と輝度を同じものに保ち、RGBに変換し、各ピクセルを書き込むことによって単純に達成されます。

これが私が達成できないことです:

色相=240 ()、量= 30%, 50%80%, 、 それぞれ
30% 50% 80%

繰り返しますが、スペック Amount 言う 色の値がどれだけシフトされているかによって指定されます. 。私はこれを機能させるためにここであらゆる方法を試しましたが、hue=hue*amount, originalhue * amount + hue, 、など)

その他の例:Hue =120 ()、量= 30%, 50%, 80%100%, 、 それぞれ。 100% 手に入れることができます。
30% 50% 80% 100%

上記の写真の単一ピクセルの値リストを次に示します。

Pixel 159、116-青い写真

        色相量RGB | HSL
オリジナル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-緑の写真

        色相量RGB | HSL
オリジナル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


それで、質問は次のとおりです。誰かがこれがどのように機能するべきか知っていますか?

注:これはです いいえ の複製:

役に立ちましたか?

解決

私はあなたの問題があなたが補間的な角度を持っている方法から生じることを確信しています。これは、トリックを行うはずの補間関数(Pythonで書かれている)です。 XNAフォーラムスレッドからの提案に基づいています 最短の2D角度補間.

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

今、 interpolate(originalHue,hue,amount) 目的の結果を生成する必要があります。

編集: あなたの目標は、特定のターゲットの色相に向かって元の色相をある程度の金額で回転させることであるということです。私はあなたがすでにこれに精通していると確信していますが、説明のために、ここにカラーホイールがあります。

Color Wheel
(ソース: sapdesignguild.org)

問題は、2つの角度を混合(または補間)することは些細なものではないため、コードのようなものです hue = ((hue - originalHue) * amount) + originalHue 動作しないでしょう。 360°のラップアラウンドのために、ある角度から別の角度に移動できる方法は無限にあります。 0°から60°になるには、反時計回り、反時計回り、時計回りに420°、時計回りに60°回転することができます。通常、最短角度は望ましいものです。

たとえば、ペンギンの首を考えてみましょう。元の色相が30°(オレンジ)の場合、ターゲットが240°(青)、量は50%です。次の結果が得られます。

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

私の推測では、2番目の結果はあなたが探している結果ですが、私は間違っているかもしれませんし、エラーは完全にどこかにある可能性があります...

他のヒント

あなたは見てください Tintparams GDI+(.NETの一部ではありませんが) - これはまさにあなたが探しているものかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top