[英]Having one color code either in hexadecimal or RGB. Keeping this as base, need to generate lighter & darker gradient colors based on percentage in C#
[英]C#: Create a lighter/darker color based on a system color
重復
說我有
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);
}
大多數這些方法都會使顏色變暗,但是它們調整色調的方式很多,所以結果看起來不太好。 最好的答案是使用Rich Newman的HSLColor類並調整亮度。
public Color Darken(Color color, double darkenAmount) {
HSLColor hslColor = new HSLColor(color);
hslColor.Luminosity *= darkenAmount; // 0 to 1
return hslColor;
}
采用@ 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);
}
這是我使用的一些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;
}
您也可以根據需要簡單地處理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))
);
}
希望有所幫助。
我改變了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
我做了一個這個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;
}
這段代碼的作用是接收十六進制顏色,然后輸出10個最亮的顏色版本並放入數組中。 您可以將亮度更改為您喜歡的任何值,以調整陰影百分比。 要使顏色變暗,您需要更改:
luminosity -= calcPercentage();
使用HSI轉換庫(搜索谷歌)。 然后,調整I通道以獲得更亮/更暗的顏色。
看一下ControlPaint類:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.