2012-02-23 11 views
1

私はhereを見ましたが、何が起こっているのかよく分かりません。私はC#でかなり新しく、HEXコードのグラデーションジェネレータを作成しようとしています。私はステップダウン/アップの束と16進コードの2つの文字列が与えられています。例えばC#16進コードシャドウグラデーションジェネレータ

black: 000000 to grey: 666666 
with a step of 10. 

これは私にこの二点からの勾配を建設する10種類のHEXコードを生成します。私はこれについてどうやって行くのか、誰かが私にこのやり方のアルゴリズムを教えてくれるかどうか疑問に思っていました。

ありがとうございます!

答えて

2

単純勾配が等しい部分に範囲の線形分割を行います。

たとえば、赤い部分だけを見て、0〜250(10進数)を5ステップで表示したい場合、各セクションは((250 - 0)/(5 - 1) )= 62.5。
0,62.5,125,187.5,250のようになります。

ここで行う必要があることは、各コンポーネントでこの線形除算を繰り返すことだけです。アルファチャンネルColorデータ構造は、あなたの0x666666の場合には反映されないアルファチャンネル値を含むことを

について注

。テンプレート0xRRGGBBの価値を考慮し、アルファチャンネルが0xFF(つまり完全に不透明)であると仮定すると、すべてが良好です。

グラデーションにアルファチャンネルを含める場合(ここのすべての例に示されているように)、テンプレート0xAARRGGBBの場合、アルファチャンネルは0になります。つまり、色は完全に透明(目に見えない)。

UINTからColor Contructing

一つ迷惑な事はおよそColor.FromArgb()ではなくuintint値を受け入れることです。したがって、たとえば0xFF666666でそれを与えると、例外と例外がスローされます。

はこれを克服するために、我々は我々の手には、いくつかのビットシフトで汚いする必要があります。

private static Color GetColorFromArgb(uint colorValue) 
{ 
    Color color = Color.FromArgb(
         (int)((colorValue & 0xFF000000) >> 24), 
         (int)((colorValue & 0x00FF0000) >> 16), 
         (int)((colorValue & 0x0000FF00) >> 8), 
         (int)((colorValue & 0x000000FF)) 
        ); 

    return color; 
} 

はEDIT:GetColorFromArgbはあなたがRGBに進コードに変換する方法を疑問に」答えるために

について説明しました? "の場合、GetColorFromArgbは既に16進数をR、G、Bに変換するだけでなく、アルファチャンネル情報も追加します。

GetColorFromArgbの入力は32ビットの符号なし整数です。 16進表現を見ると、テンプレートは0xAARRBBGGです。

GetColorFromArgbは、ビットマスクとビットシフトを使用してコンポーネントを順番に抽出し、次にColor.FromArgb(int a, int r, int g, int b)を呼び出します。質問は、アルファチャンネルを無視する方法だった場合、あなたはアルファ情報を抽出しないGetColorFromRGB()メソッドを作成することができます

private static Color GetColorFromArgb(uint colorValue) 
{ 
    int a = (int)((colorValue & 0xFF000000) >> 24); 
    int r = (int)((colorValue & 0x00FF0000) >> 16); 
    int g = (int)((colorValue & 0x0000FF00) >> 8); 
    int b = (int)(colorValue & 0x000000FF); 

    Color color = Color.FromArgb(a, r, g, b); 

    return color; 
} 

、代わりに渡します。ここでは

GetColorFromArgbのより精巧なバージョンです固定値:あなたは0xRRGGBB形式の値を使用するので、あなたの代わりにの intを使用することができることを

private static Color GetColorFromRGB(int colorValue) 
{ 
    int a = 0xFF; // Fully opaque 
    int r = (int)((colorValue & 0x00FF0000) >> 16); 
    int g = (int)((colorValue & 0x0000FF00) >> 8); 
    int b = (int)(colorValue & 0x000000FF); 

    Color color = Color.FromArgb(a, r, g, b); 

    return color; 
} 
  • 注意入力。
+0

どのように16進コードをRGBに変換しますか? – SNpn

+0

答えを更新しました。 – AVIDeveloper

0

非常に簡単な方法は、中間赤、緑、および青成分値を計算することであろう...何かのように:

Dim tOriginHexColor As String = "000000" 
Dim tTargetHexColor As String = "666666" 
Dim tSteps As Byte = 10 

Dim tOriginColor as Color = ColorTranslator.FromHtml(tOriginHexColor) 
Dim tTargetColor As Color = ColorTranslator.FromHtml(tTargetHexColor) 

Dim tRedStep As Byte = tTargetColor.R - tOriginColor.R 
Dim tBlueStep As Byte = tTargetColor.R - tOriginColor.B 
Dim tGreenStep As Byte = tTargetColor.R - tOriginColor.G 

For tIndex As Int16 = 0 To tSteps - 1 
    Debug.Print(ColorTranslator.ToHtml(Color.FromArgb(tOriginColor.R + tRedStep, tOriginColor.G + tGreenStep, tOriginColor.B + tBlueStep))) 
Next