Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何调整颜色的亮度?_C#_Gdi+ - Fatal编程技术网

C# 如何调整颜色的亮度?

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

我想把现有的颜色调暗,以便在渐变笔刷中使用。谁能告诉我怎么做

C#,.net 2.0,GDI+

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


虽然
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)的颜色
@TossNet
Math.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)