C#:根据系统颜色创build较亮/较暗的颜色
重复
如何调整颜色的亮度?
如何确定给定颜色的深色或浅色变体?
以编程方式减轻颜色
说我有
var c = Color.Red;
现在我想创build一个比这个颜色更亮或更暗的新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中有一个,但是写下自己很容易。
看到我对C#实现类似问题的答案 。
该function可以让你这样做:
// 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的答案的核心方法,我准备了以下两个小扩展方法,以更直观(至less对我来说)签名。
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); }
使用HSI转换器库(search谷歌)。 然后,调整我的频道更浅/更深的颜色。
看看ControlPaint类:
MSDN:ControlPaint的成员
您也可以简单地使用RGB百分比来使其变得更亮或更暗,下面是如何使颜色变深的例子:
//_correctionfactory in percentage, eg 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)) ); }
希望有所帮助。
我做了一个网站,做这个colorglower.com你可以看看一个演示。
这里是我使用的JavaScript代码。
function lighten(color) { // convert to decimal and change luminosity var luminosity = 0.01 var computedColors = new Array(); var newColor = "#", c, i, n, black = 0, white = 255; for (n = 0; n < 10; n++) { for (i = 0; i < 3; i++) { c = parseInt(color.substr(i * 2, 2), 16); c = Math.round(Math.min(Math.max(black, c + (luminosity * white)), white)).toString(16); newColor += ("00" + c).substr(c.length); } computedColors[n] = newColor; var arrayUnique = checkIfArrayIsUnique(computedColors); if (arrayUnique == false) { computedColors.pop(); break; } computedColors[n] = newColor; newColor = "#"; luminosity += calcPercentage(); } return computedColors;
}
这段代码做的是接收一个hex颜色,然后输出它的10个最亮的颜色版本,并放入数组中。 您可以根据自己的喜好改变亮度来调整阴影百分比。 要变暗的颜色,你只需要改变:
luminosity -= calcPercentage();