1

フレームワークに依存せずに純粋な数学を使用してRGBの暗さを増やそうとしています..

だから、ここに私の実装があります:

R、G、B (それぞれ 0 から 256 まで) と darkFactor (0 から 1 まで) を提供

// this is a pseudocode
r*= darknessFactor;
g*= darknessFactor;
b*= darknessFactor;

r= int (r);
g= int (g);
b= int (b);

g <<= 8;
r <<= 16;

final_color= b + g  + r ;

で、R=00、G=256、B=0、darknessFactor=0.1に対して使ってみたところ、濃い赤に近い結果になりました!

何か案が?

編集

actionScript 3 の ColorTransform はこの問題を解決しますか?

4

4 に答える 4

1

原則として、疑似コードは問題ないように見えるので、実際のコードには問題があるはずです。緑の入力で赤の結果が得られるのは本当に奇妙ですが。あなたのコードでは、チャンネルをクランプしていないため、1より大きい係数で可能であり、緑のチャンネルが赤のチャンネルにオーバーフローする可能性があります。

これはうまくいきます:

function clamp(channel:Float) {
  var v = Std.int(channel);
  return 
    if (v < 0) 0;
    else if (v > 0xFF) 0xFF;
    else v;
}
function darken(color:Int, factor:Float) {
  var r = (color >> 16) & 0xFF;
  var g = (color >> 8) & 0xFF;
  var b = color & 0xFF;

  return 
    (clamp(r * factor) << 16)
    + (clamp(g * factor) << 8)
    + clamp(b * factor);
}

ここでテストできます: http://try.haxe.org/#b328e

于 2013-10-12T22:14:34.660 に答える
1

RGB の代わりに HSV を使用する必要があります。

まず、RGB を HSV に変換します。

次に、v(明るさ [0 から 1]) を減らします。

最後に、HSV を RGB に変換します。

変換プログラムを簡単に実装できます。または、ライブラリを見つけることができます。

于 2013-10-12T08:53:33.977 に答える
0

ColorTransform は、新しいコードを記述せずにこの問題を解決する最も簡単な方法です。

ここを参照してください。

乗数のプロパティは、現在の色を暗くするために必要なものです。

var colorInfo:ColorTransform = myDisplayObject.transform.colorTransform; 

// Make some color transformations here.
// Reduce colour by 10%
colorInfo.redMultiplier = 0.9; 
colorInfo.greenMultiplier = 0.9; 
colorInfo.blueMultiplier = 0.9; 

// Commit the change. 
myDisplayObject.transform.colorTransform = colorInfo;
于 2013-10-13T09:22:33.130 に答える
0

RGB(R1,G1,B1) の場合、新しい RGB(R2,G2,B2) をパーセンテージ/係数 p% で暗くすると、次のようになります。

    R2 = R1 - (R1/100)*P
    G2 = G1 - (G1/100)*P
    B2 = B1 - (B1/100)*P

これは、特定の問題に対する唯一の解決策です。より高度なものに取り組みたい場合は、HSL 色空間とその L ファクターの使用方法をご覧ください。

于 2013-11-13T16:16:23.703 に答える