5

Open XMLの色合い効果をエミュレートしようとしています。色相をシフトすることにより、画像内のピクセルの色相を変更します。2 つのパラメータを取ります: 1) hue(度) と 2) amt(量、パーセンテージ)。問題があるのは#2です。仕様には次のように記載されています。

色合い: エフェクト カラー値を、指定された量だけ色相に向かって、または色相から遠ざけます。

  • amt (量) - 色の値をシフトする量を指定します。
  • hue (Hue) - 着色する色相を指定します。

XML 構造を気にせずにamt、100% の値をエミュレートできます。たとえば、青 (色相: 240°) が必要な場合は、これ (着色されたもの) を作成できます。次に例を示します。

オリジナル着色(色相 = 240、量 = 100%)。
オリジナル 修正済み

これは、色相を 240 に設定し、彩度と輝度を同じに保ち、RGB に変換して各ピクセルを書き込むだけで実現できます。

ただし、達成できないことは次のとおりです。

色相 = 240 ()、量 = 30%50%、および80%、それぞれ
30% 50% 80%

繰り返しますが、Specify by how much the color value isAmount shift と言っています。これを機能させるためにここであらゆる種類の方法を試しましたが、うまくいかないようです ( 、など)。hue=hue*amountoriginalhue * amount + hue

その他の例: 色相 = 120 ()、量 = 30%50%80%、および100%。私が得ることができる100%のもの。
30% 50% 80% 100%

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

Pixel 159、116 - 青の写真

        色相量 RGB | HSL
オリジナル 244 196 10   |   48 0.92 0.5
青 240 30% 237 30 45   | 356 0.85 0.52
青 240 50% 245 9 156   | 323 0.93 0.5
青 240 80% 140 12 244   | 273 0.91 0.5
青 240 100% 12 12 244   | 240 0.91 0.5

Pixel 159、116 - 緑の写真

        色相量 RGB | HSL
オリジナル 244 196 10   |   48 0.92 0.5
緑 120 30% 211 237 30   |   68 0.85 0.52
緑 120 50% 159 237 30   |   83 0.85 0.52
緑 120 80% 81 237 29   | 105 0.85 0.52
緑 120 100% 29 237 29   | 120 0.85 0.52


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

注: これは次の複製ではありません。

4

2 に答える 2

6

あなたの問題は、角度を補間する方法に起因することは確かです。これは、トリックを実行する必要がある補間関数 (Python で記述) です。これは、xna フォーラムのスレッドShortest 2D Angle 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

これでinterpolate(originalHue,hue,amount)、目的の結果が得られるはずです。

編集:あなたの目標は、元の色相を特定のターゲット色相に向かって一定量回転させることだと理解しています。すでにおなじみだと思いますが、説明のために、ここにカラー ホイールを示します。

カラーホイール
(出典: sapdesignguild.org )

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

たとえば、ペンギンの首を考えてみましょう。元の色相が 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番目の結果があなたが探しているものであると思いますが、私は間違っている可能性があり、エラーは完全に別の場所にある可能性があります...

于 2010-06-25T23:33:21.117 に答える
1

GDI+ のTintParamsを確認する必要があります (ただし、.NET の一部ではありません)。これはまさに探しているものかもしれません。

于 2010-06-26T23:23:36.650 に答える