development

C # : 시스템 색상을 기반으로 더 밝은 / 어두운 색상 만들기

big-blog 2020. 12. 27. 20:43
반응형

C # : 시스템 색상을 기반으로 더 밝은 / 어두운 색상 만들기


복제

색상의 밝기는 어떻게 조정합니까?
주어진 색상의 더 어둡거나 밝은 색상 변형을 어떻게 결정합니까?
프로그래밍 방식으로 색상 밝게


내가 가지고 있다고

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에는 하나가 있지만 직접 작성하는 것은 쉽습니다.

C # 구현에 대한 유사한 질문에 대한 내 대답을 참조하십시오 .

이 기능을 사용하면 다음을 수행 할 수 있습니다.

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

다음은 주어진 색상을 밝게 / 어둡게하기 위해 사용하는 자바 스크립트 코드입니다. 동등한 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의 대답 의 핵심 방법 을 사용하여보다 직관적 인 (적어도 나를 위해) 서명을 위해 다음 두 가지 작은 확장 방법을 준비했습니다.

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

도움이되기를 바랍니다.


I changed Pavel Vladov function to modify even RGB component, to get shades on any combination of R/G/B directions:

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

Using HSI converter library(search google). And then, adjust I channel for lighter/darker color.


Take a look at the ControlPaint class:

MSDN: Members of ControlPaint


I made a site that does this colorglower.com You can check it out to see a demo.

Here's the javascript code i used.

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;

}

What this code does is it receives a hex color and then it outputs 10 lightest color versions of it and puts in in the array. You can change the luminosity to whatever you like to adjust the shade percentage. To darken the colors you just need to change:

luminosity -= calcPercentage();

ReferenceURL : https://stackoverflow.com/questions/801406/c-create-a-lighter-darker-color-based-on-a-system-color

반응형