C#: создание светлого / темного цвета на основе системного цвета




дублировать



как настроить яркость цвета?
как определить более темный или светлый вариант цвета данного цвета?
программно осветлить цвет






скажи, что у меня есть



var c = Color.Red;


теперь я хочу создать новый Color светлее или темнее, чем этот цвет. Как я могу сделать это без особых хлопот?

597   11  

11 ответов:

ControlPaint.Свет.Темный.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's 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;

    }

принимая основной метод @Павел Я подготовил следующие два небольших метода расширения для более интуитивной (по крайней мере, для меня) подписи.

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); 
}

вы также можете просто работать на процент 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))
            );
    }

надеюсь, что это поможет.

Я изменил функцию Павла Владова, чтобы изменить даже компонент 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

с помощью библиотеки HSI конвертер (поиск google). А затем отрегулируйте I канал для более светлого / темного цвета.

взгляните на класс ControlPaint:

MSDN: члены ControlPaint

Я сделал сайт, который делает это 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();

Comments

    Ничего не найдено.