C#:根据系统颜色创建更亮/更暗的颜色

Svi*_*ish 57 c# colors

重复

如何调整颜色的亮度?
如何确定给定颜色的深色或浅色变体?
以编程方式减轻颜色


说我有

var c = Color.Red;
Run Code Online (Sandbox Code Playgroud)

现在我想创建一个Color比那种颜色更亮或更暗的新品.没有太多麻烦我怎么能这样做?

Pau*_*der 97

ControlPaint .Light .Dark .DarkDark等

Color lightRed = ControlPaint.Light( Color.Red );
Run Code Online (Sandbox Code Playgroud)

  • 纠正了你的错字,虽然ControlPain类很有趣:) (21认同)
  • 呵呵......如果你们每完成任何事情,你就知道这是多么真实. (2认同)
  • 今天,我意识到.Net框架的规模非常庞大。因为我之前不知道ControlPaint类。但我只使用第三方图像处理(如 AForge.net)。谢谢。 (2认同)

Pav*_*dov 76

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

/// <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);
}
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案.比ControlPaint.Dark或ControlPaint.Light更好.ControlPaint方法在非常小的百分比下不能很好地工作,它们有一些内置的最小值.您的代码甚至可以使用0.1f. (3认同)

Kei*_*ith 13

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

请参阅对C#实现的类似问题的回答.

该功能可以让你这样做:

// 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 );
Run Code Online (Sandbox Code Playgroud)


Tug*_*ain 8

大多数这些方法都会使颜色变暗,但是它们调整色调的方式很多,所以结果看起来不太好.最好的答案是使用Rich Newman的HSLColor类并调整亮度.

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


Zol*_*ási 6

采用@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); 
}
Run Code Online (Sandbox Code Playgroud)