C# 如何调整颜色的亮度?
我想把现有的颜色调暗,以便在渐变笔刷中使用。谁能告诉我怎么做 C#,.net 2.0,GDI+从RGB转换为HSV(或HSL),然后向下调整V(或L),然后再转换回C# 如何调整颜色的亮度?,c#,gdi+,C#,Gdi+,我想把现有的颜色调暗,以便在渐变笔刷中使用。谁能告诉我怎么做 C#,.net 2.0,GDI+从RGB转换为HSV(或HSL),然后向下调整V(或L),然后再转换回 虽然System.Drawing.Color提供了获取色调(H)、饱和度(S)和亮度的方法,但它在其他转换方式中没有提供太多内容,值得注意的是,从HSV(或HSV值)创建一个新实例并不重要,但转换非常容易实现。wikipedia的文章提供了相当好的收敛性,从这里开始:“。作为一种简单的方法,您可以只考虑RGB值: Color
虽然
System.Drawing.Color
提供了获取色调(H)、饱和度(S)和亮度的方法,但它在其他转换方式中没有提供太多内容,值得注意的是,从HSV(或HSV值)创建一个新实例并不重要,但转换非常容易实现。wikipedia的文章提供了相当好的收敛性,从这里开始:“。作为一种简单的方法,您可以只考虑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使它变亮)以下是Richard提到的转换的一些C代码:
您也可以尝试使用
ControlPaint.Light(baseColor, percOfLightLight)
或
虽然上述方法确实会使颜色变暗,但它们会将色调调整得太多,因此效果不太好。最好的答案是使用class并调整亮度
public Color Darken(Color color, double darkenAmount) {
HSLColor hslColor = new HSLColor(color);
hslColor.Luminosity *= darkenAmount; // 0 to 1
return hslColor;
}
必须跟踪该值不扩展到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)
这是可行的,但实际上并没有给出感性色彩值的精确值。我建议看一下Richard或dommer的答案,了解HSL/HSV颜色模型的详细信息。如果您决定使用*1.25使颜色更亮,好像结果超过255,则必须小心,否则会引发异常。您需要使用以下代码添加控件:
int R=(rgb.R*amt>255)?255:(整数)(rgb.R*金额);整数G=(rgb.G*金额>255)?255:(整数)(rgb.G*金额);int B=(rgb.B*金额>255)?255:(整数)(rgb.B*金额);颜色c2=argb(1,R,G,B)的颜色
@TossNetMath.Clamp(rgb.R*amt,0,255)、Math.Clamp(rgb.G*amt,0,255)、Math.Clamp(rgb.B*amt,0,255)
等将更简单、更有效(只执行一次操作)链接断开。它在url中没有www的情况下工作:转换代码中有一个bug。Color.Red(#FF0000)->hsl->输出:#808080。许多其他颜色(Color.oranged、Color.Yellow、Color.Green)的转换没有问题。修复:如果(h>=6f)h-=6f,则添加;如果(h<0f)h+=6f代码>之前h/=6.0代码>到RGB2HSL
函数。亮度属性也可以增加。例如hslColor.luminity*=1.2代码>亮度是0到240之间的值。如果它超过240,它将自动达到240。我的理解是,HSL中的亮度值与你可以称之为“亮度”的值不是很接近。制造更轻的东西可能会使它更亮,但不是每种颜色的亮度都相同。请注意,这些功能在系统颜色上使用时具有特殊行为(如文档中所规定)
dim newValue as integer = ...
'correct value if it is below 0 or above 255
newValue = Math.Max(Math.Min(newValue,255),0)