一定の割合で色相に向かっている、または色合いから離れている
質問
エミュレートしようとしています 色合いの効果 オープンXMLの。それが行うことは、色相をシフトすることにより、画像のピクセルの色相を変更することです。 2つのパラメーターが必要です。1) hue
(程度)および2) amt
(金額、パーセンテージ)。私が問題を抱えているのは#2です。仕様の状態:
色合い: :指定された量によって色合いの色値をシフトします。
- amt (金額) - 色の値がどれだけシフトされるかによって指定されます。
- 色相 (色相) - 色合いの色合いを指定します。
XML構造を気にしないでください、私は amt
100%の。たとえば、青(色相:240°)が欲しい場合、これを作成できます( 着色 1)。これが例です:
オリジナル と 着色 (HUE = 240、金額= 100%)。
これは、色相を240に設定し、飽和と輝度を同じものに保ち、RGBに変換し、各ピクセルを書き込むことによって単純に達成されます。
これが私が達成できないことです:
色相=240 (青)、量= 30%, 50% と 80%, 、 それぞれ
繰り返しますが、スペック Amount
言う 色の値がどれだけシフトされているかによって指定されます. 。私はこれを機能させるためにここであらゆる方法を試しましたが、hue=hue*amount
, originalhue * amount + hue
, 、など)
その他の例:Hue =120 (緑)、量= 30%, 50%, 80% と 100%, 、 それぞれ。 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
それで、質問は次のとおりです。誰かがこれがどのように機能するべきか知っていますか?
注:これはです いいえ の複製:
- 全体的な明るさを維持しながら、ビットマップの色合いを変更する
- c#で画像を使用して色相を回転させる
- ...または私がそのように見つけることができる他の何か
解決
私はあなたの問題があなたが補間的な角度を持っている方法から生じることを確信しています。これは、トリックを行うはずの補間関数(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)
目的の結果を生成する必要があります。
編集: あなたの目標は、特定のターゲットの色相に向かって元の色相をある程度の金額で回転させることであるということです。私はあなたがすでにこれに精通していると確信していますが、説明のために、ここにカラーホイールがあります。
(ソース: 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の一部ではありませんが) - これはまさにあなたが探しているものかもしれません。