重复
说我有
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)
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)
Kei*_*ith 13
您也可以使用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 );
Run Code Online (Sandbox Code Playgroud)
大多数这些方法都会使颜色变暗,但是它们调整色调的方式很多,所以结果看起来不太好.最好的答案是使用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)
采用@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)