2009-04-10 171 views
23

我想变暗现有的颜色以用于渐变画笔。请问有人能告诉我该怎么做?如何调整颜色的亮度?

C#,.NET 2.0,GDI +

Color AdjustBrightness(Color c1, float factor) 
    { 

     float r = ((c1.R * factor) > 255) ? 255 : (c1.R * factor); 
     float g = ((c1.G * factor) > 255) ? 255 : (c1.G * factor); 
     float b = ((c1.B * factor) > 255) ? 255 : (c1.B * factor); 

     Color c = Color.FromArgb(c1.A,(int)r, (int)g, (int)b); 
     return c ; 

    } 

回答

25

举一个简单的方法,你可以只是因子RGB值:

Color c1 = Color.Red; 
    Color c2 = Color.FromArgb(c1.A, 
     (int)(c1.R * 0.8), (int)(c1.G * 0.8), (int)(c1.B * 0.8)); 

(应该变暗​​;或,例如,* 1.25照亮它)

+4

这工作,但没有按”实际上为色彩值提供了精确的值。我建议查看Richard或dommer的答案,了解HSL/HSV颜色模型的细节。 – Ant 2009-04-29 10:05:34

+5

如果你决定使用* 1.25来表现更亮,就好像结果超过255一样,你必须小心,它会抛出异常。 – 2012-11-12 17:29:24

16
转换

从RGB到HSV(或HSL),然后向下调整V(或L),然后转换回。

虽然System.Drawing.Color提供了获得色调(H),饱和度(S)和亮度的方法,但它并没有提供很多其他转换方式,但从HSV(或HSV值)创建新实例并不值得注意,但转换非常简单。维基百科的文章提供了体面的支持,从这里开始:“HSL and HSV”。

9

下面是一些C#代码该转换理查德提到:

RGB to HSL/HSL to RGB in C#

+0

链接已损坏。它的工作原理没有www中的URL:http://geekymonkey.com/Programming/CSharp/RGB2HSL_HSL2RGB.htm – 2013-05-15 13:11:50

+0

转换代码中存在一个错误。 Color.Red(#FF0000) - > hsl - >输出:#808080。许多其他颜色(Color.OrangeRed,Color.Yellow,Color.Green)转换没有问题。 – Julo 2016-01-08 10:15:17

2

虽然上述方法做颜色变暗,但他们调整色调办法不多所以结果看起来不是很好。最好的答案是使用Rich Newman's HSLColor课程并调整亮度。

public Color Darken(Color color, double darkenAmount) { 
    HSLColor hslColor = new HSLColor(color); 
    hslColor.Luminosity *= darkenAmount; // 0 to 1 
    return hslColor; 
} 
1

您必须跟踪该值不低于延长0或高于255

最好的办法是使用Math.Max/Math.MIn

dim newValue as integer = ... 
'correct value if it is below 0 or above 255 
newValue = Math.Max(Math.Min(newValue,255),0)