复制

     

如何调整颜色的亮度?结果   如何确定更暗或给定颜色的浅色变体?
  以编程方式点亮颜色


说我有

var c = Color.Red;

现在我想创建一个比该颜色更亮或更暗的新 Color 。如果没有太多麻烦,我怎么能这样做?

有帮助吗?

解决方案

ControlPaint .Light .Dark .DarkDark等。

Color lightRed = ControlPaint.Light( Color.Red );

其他提示

我最近 发表了关于此事的博客 。主要思想是将给定的校正因子应用于每个颜色分量。以下静态方法使用指定的校正因子修改给定颜色的亮度,并生成该颜色的较暗或较浅的变体:

/// <summary>
/// Creates color with corrected brightness.
/// </summary>
/// <param name="color">Color to correct.</param>
/// <param name="correctionFactor">The brightness correction factor. Must be between -1 and 1. 
/// Negative values produce darker colors.</param>
/// <returns>
/// Corrected <see cref="Color"/> structure.
/// </returns>
public static Color ChangeColorBrightness(Color color, float correctionFactor)
{
    float red = (float)color.R;
    float green = (float)color.G;
    float blue = (float)color.B;

    if (correctionFactor < 0)
    {
        correctionFactor = 1 + correctionFactor;
        red *= correctionFactor;
        green *= correctionFactor;
        blue *= correctionFactor;
    }
    else
    {
        red = (255 - red) * correctionFactor + red;
        green = (255 - green) * correctionFactor + green;
        blue = (255 - blue) * correctionFactor + blue;
    }

    return Color.FromArgb(color.A, (int)red, (int)green, (int)blue);
}

您也可以使用 Lerp 功能执行此操作。 XNA中有一个,但你自己写的很容易。

参见我对这个类似问题的回答

该功能可让您这样做:

// make red 50% lighter:
Color.Red.Lerp( Color.White, 0.5 );

// make red 75% darker:
Color.Red.Lerp( Color.Black, 0.75 );

// make white 10% bluer:
Color.White.Lerp( Color.Blue, 0.1 );

这些方法中的大多数都会使颜色变暗但是它们会调整色调方式,因此结果看起来不太好。最佳答案是使用 Rich Newman的HSLColor 课程并调整亮度。

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

这是我使用的一些javascript代码,用于使给定颜色变亮/变暗。您可以将它用作等效C#函数的基础

它的工作原理是计算每个RGB分量的纯白色距离,然后用提供的系数调整该距离。新距离用于计算新颜色。 0到1之间的因子变暗,高于1的因子变亮

function Darken( hexColor, factor )
    {   
        if ( factor < 0 ) factor = 0;

        var c = hexColor;
        if ( c.substr(0,1) == "#" )
        {
            c = c.substring(1);
        }

        if ( c.length == 3 || c.length == 6 )
        {
            var i = c.length / 3;

            var f;  // the relative distance from white

            var r = parseInt( c.substr(0, i ), 16 );
            f = ( factor * r / (256-r) );
            r = Math.floor((256 * f) / (f+1));

            r = r.toString(16);
            if ( r.length == 1 ) r = "0" + r;

            var g = parseInt( c.substr(i, i), 16);
            f = ( factor * g / (256-g) );
            g = Math.floor((256 * f) / (f+1));
            g = g.toString(16);
            if ( g.length == 1 ) g = "0" + g;

            var b = parseInt( c.substr( 2*i, i),16 );
            f = ( factor * b / (256-b) );
            b = Math.floor((256 * f) / (f+1));
            b = b.toString(16);
            if ( b.length == 1 ) b = "0" + b;

            c =  r+g+b;
         }   

         return "#" + c;

    }

采用 @ Pavel的回答的核心方法,我准备了以下两种小扩展方法,以便更直观(至少对我来说)签名。

public static Color LightenBy(this Color color, int percent)
{
    return ChangeColorBrightness(color, percent/100.0);
}

public static Color DarkenBy(this Color color, int percent)
{
    return ChangeColorBrightness(color, -1 * percent / 100.0); 
}

我改变了Pavel Vladov功能来修改甚至RGB分量,以获得任何R / G / B方向组合的阴影:

Public Function ChangeColorShades(color As Color, correctionFactor As Single, bR As Boolean, bG As Boolean, bB As Boolean) As Color


    Dim red As Single = CSng(color.R)
    Dim green As Single = CSng(color.G)
    Dim blue As Single = CSng(color.B)

    If (correctionFactor < 0) Then

        correctionFactor = 1 + correctionFactor
        If bR Then
            red *= correctionFactor
        End If
        If bG Then
            green *= correctionFactor
        End If
        If bB Then
            blue *= correctionFactor
        End If


    Else
        If bR Then
            red = (255 - red) * correctionFactor + red
        End If
        If bG Then
            green = (255 - green) * correctionFactor + green
        End If
        If bB Then
            blue = (255 - blue) * correctionFactor + blue
        End If

    End If

    Return color.FromArgb(color.A, CInt(red), CInt(green), CInt(blue))
End Function

您也可以根据需要简单地处理RGB百分比以使其更亮或更暗。下面是一个如何使颜色比x更暗的示例:

//_correctionfactory in percentage, e.g 50 = make it darker 50%
    private Color DarkerColor(Color color, float correctionfactory = 50f)
    {
        const float hundredpercent = 100f;                        
        return Color.FromArgb((int)(((float)color.R / hundredpercent) * correctionfactory),
            (int)(((float)color.G / hundredpercent) * correctionfactory), (int)(((float)color.B / hundredpercent) * correctionfactory));
    }

我们还可以将该过程反转为更轻松,只有我们得到255的结果 - RGB然后乘以我们想要的百分比,如下例所示:

private Color LighterColor(Color color, float correctionfactory = 50f)
    {
        correctionfactory = correctionfactory / 100f;
        const float rgb255 = 255f;
        return Color.FromArgb((int)((float)color.R + ((rgb255 - (float)color.R) * correctionfactory)), (int)((float)color.G + ((rgb255 - (float)color.G) * correctionfactory)), (int)((float)color.B + ((rgb255 - (float)color.B) * correctionfactory))
            );
    }

希望有所帮助。

使用HSI转换器库(搜索谷歌)。然后,调整I通道以获得更亮/更暗的颜色。

看一下ControlPaint类:

MSDN:ControlPaint的成员

我创建了一个网站,用于执行此

scroll top