2014-02-18 117 views
0

我使用this excellent SO post來弄清楚如何獲得不同的陰影和所選顏色的色調,但現在我希望改進算法。中間範圍內的顏色(RGB的加起來大約爲400到500)產生了類似於下面第2行和第4行所示的出色結果。但是在該範圍之外的顏色會產生更像您在第1行和第3行中看到的顏色,淺顏色不會淡出很多。我想我需要調整我的乘數來糾正這個問題,但是我的數學技能並不合格。使用RGB值改進顏色陰影和色調算法

enter image description here

private void getShadesAndTints(Color c) 
{ 
    int i; Double m; 
    int r; int g; int b; 
    for (i = 1; i < 21; i++) 
    { 
     m = i * 0.1; 
     r = (int)(c.R * m); if (r > 255) r = 255; 
     g = (int)(c.G * m); if (g > 255) g = 255; 
     b = (int)(c.B * m); if (b > 255) b = 255; 
     colorList.Add(Color.FromArgb(r, g, b)); 
    } 
} 

如果你想嘗試一下自己,完整的代碼,請訪問:http://pastebin.com/QgCseY4k

回答

0

從我這裏知道什麼是一種方式來獲得均勻的陰影越來越暗度: -

private void getShades(Color c) 
{ 
    int i; Double factor; 
    int r; int g; int b; 
    for (i = 20; i >=0; i--) 
    { 
     factor = i/20; 
     r = (int)(c.R * factor); if (r > 255) r = 255; 
     g = (int)(c.G * factor); if (g > 255) g = 255; 
     b = (int)(c.B * factor); if (b > 255) b = 255; 
     colorList.Add(Color.FromArgb(r, g, b)); 
    } 
} 

說明:顏色的亮度只取決於大小Ø f rgb而不改變它們的比例,因此乘以(0,1)中的因子可以獲得具有所需亮度的顏色。

注意:你所做的工作很好,用於從純色產生色彩。

0

這就是我最終的結果。它與Vikram Bhat的答案不同,我現在正在做兩個獨立的循環,一個用於陰影,另一個用於色調,並且通過獲取總計RGB並將其除以38.25(這是如果你拿765並把它除以20,你會得到什麼)。我應該在我的原文中提到我正在尋找20種顏色,儘可能均勻分佈,這就是現在這種算法的作用。選擇不同的灰色,白色和黑色陰影,實際上會導致返回相同的20種顏色(更好或更差)。

private void getShadesAndTints(Color c) 
{ 
    Double RGB; Double max; 
    RGB = (int)c.R + (int)c.G + (int)c.B; 
    max = (int)RGB/38.25; 
    max = Math.Round(max); 
    if (max == 19) max = 20; 
    Double i; Double f; 
    int r; int g; int b; 
    for (i = 0; i < max; i++) 
    { 
     f = 1/max; 
     f = i * f; 
     r = (int)(c.R * f); if (r > 255) r = 255; 
     g = (int)(c.G * f); if (g > 255) g = 255; 
     b = (int)(c.B * f); if (b > 255) b = 255; 
     colorList.Add(Color.FromArgb(r, g, b)); 
    } 
    max = 20 - max; 
    for (i = 0; i < max; i++) 
    { 
     f = 1/max; 
     f = i * f; 
     r = (int)((255 - c.R) * f + c.R); if (r > 255) r = 255; 
     g = (int)((255 - c.G) * f + c.G); if (g > 255) g = 255; 
     b = (int)((255 - c.B) * f + c.B); if (b > 255) b = 255; 
     colorList.Add(Color.FromArgb(r, g, b)); 
    } 
} 
0

這是我如何做到這一點:

/// <summary> 
    /// <para>Fades the specified color by the fading factor from interval [-1, 1].</para> 
    /// <para> 
    /// For example, -0.3 will make color 30% darker and 0.3 will make color 30% lighter. 
    /// </para> 
    /// </summary> 
    /// <param name="color">The color.</param> 
    /// <param name="fading">The fading factor.</param> 
    /// <returns>The faded color.</returns> 
    private static Color Fade(Color color, double fading) 
    { 
     Debug.Assert(fading >= -1 && fading <= 1); 

     if (fading < 0) 
     { 
      var shade = 1 + fading; 
      return Color.FromArgb(ShadeComponent(color.R, shade), ShadeComponent(color.G, shade), ShadeComponent(color.B, shade)); 
     } 
     else if (fading > 0) 
     { 
      var tint = 1 - fading; 
      return Color.FromArgb(TintComponent(color.R, tint), TintComponent(color.G, tint), TintComponent(color.B, tint)); 
     } 
     else 
      return color; 
    } 

    private static int ShadeComponent(int component, double shade) 
    { 
     return Round(component * shade); 
    } 

    private static int TintComponent(int component, double tint) 
    { 
     return Round(255 - (255 - component) * tint); 
    } 

    private static int Round(double value) 
    { 
     return (int)Math.Round(value); 
    }