Ответ 1
ControlPaint. Light.Dark.DarkDark и т.д.
Color lightRed = ControlPaint.Light( Color.Red );
Duplicate
Как настроить яркость цвета?
Как определить более темный или более светлый вариант цвета данного цвета?
Программно осветить цвет
Скажем, у меня
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, который я использую для освещения/затемнения заданного цвета. Вы можете использовать его в качестве базы для эквивалентной функции С#
Он работает, вычисляя расстояние от чистого белого от каждого из компонентов 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);
}
Использование библиотеки конвертеров HSI (поиск в Google). А затем настройте канал я для более светлого/темного цвета.
Взгляните на класс ControlPaint:
Вы также можете просто работать с процентом 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))
);
}
Надеюсь, что это поможет.
Я создал сайт, который делает это 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();